小编Ole*_*hov的帖子

带有Int数组的Java HashMap

我正在使用此代码来检查HashMap中是否存在该数组.

public class Test {
    public static void main(String[] arg) {
        HashMap<int[], String> map = new HashMap<int[], String>();
        map.put(new int[]{1, 2}, "sun");
        System.out.println(map.containsKey((new int[]{1, 2})));
    }
}
Run Code Online (Sandbox Code Playgroud)

但这打印错误.如何检查HashMap中是否存在该数组.提前致谢.

java arrays hashmap

16
推荐指数
2
解决办法
4万
查看次数

Java中的short和char类型

根据Java标准,short和char类型都使用2个字节,因此当我编写类似的东西时

char ch = 'c';
short s = ch;
Run Code Online (Sandbox Code Playgroud)

有一个错误说"可能会失去精确度".我在这里缺少什么

java

16
推荐指数
2
解决办法
1万
查看次数

将实例字段分配给局部变量

这是来自JDK的HashMap类的keySet()方法.为什么作者将字段(keySet)分配给局部变量ks?

public Set<K> keySet() {
    Set<K> ks;
    return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}
Run Code Online (Sandbox Code Playgroud)

上面和下面有什么区别?这与线程安全有关吗?

public Set<K> keySet() {
    return (keySet == null ? (keySet = new KeySet()) : keySet;
}
Run Code Online (Sandbox Code Playgroud)

java

16
推荐指数
2
解决办法
680
查看次数

用多态替换条件

我试图用一个例子来理解这个干净的代码实践.考虑具有折扣开关案例的类产品.我试图用多态替换switch语句.

代码之前:

class Product {
    String priceCode;
    int discount;

    Product(String priceCode) {
        setDiscount(priceCode);
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(String priceCode) {
        switch (priceCode) {
            case "CODE1":
                discount = // some logic;
            case "CODE2":
                discount = // some other logic;
            case "CODE3":
                discount = // some other logic;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在下面的代码中你可以看到我删除了switch语句但是我仍然有条件来创建discountStrategy的对象.我的问题是,我仍然有条件,我试图删除多态性.

代码后:

class Product {
    String priceCode;
    DiscountStrategy discountStrategy;

    Product(String priceCode) {
        setDiscount(priceCode);
    }

    public int getDiscount() {
        return discountStrategy.getDiscount();
    }

    public void setDiscount(String priceCode) …
Run Code Online (Sandbox Code Playgroud)

java polymorphism design-patterns

16
推荐指数
1
解决办法
3518
查看次数

在yii2中设置模块控制器的布局

我在主视图文件夹的layouts文件夹中有三个布局.我添加了一个名为subDomain的模块.在我的子域模块中,我有一个名为HomeController的Controller.在HomeController中有一个叫做的动作getDomain().

getDomain()我想要将主要布局更改为的操作中getDomainLayout.但是当我使用代码时出错:

$this->layout = "getDomainLayout";

Yii2投掷:

Invalid Parameter – yii\base\InvalidParamException    
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php
Run Code Online (Sandbox Code Playgroud)

php layout views yii2

13
推荐指数
3
解决办法
3万
查看次数

Java 8流中的非干扰精确含义

使用非并发数据结构源流的非干扰要求是否意味着在执行流管道期间我们无法更改数据结构元素的状态(除此之外我们无法更改源数据结构本身)?(问题1)

在关于非干扰的部分中,在流包描述中,它说:"对于大多数数据源,防止干扰意味着确保在流管道的执行期间根本不修改数据源."

这篇文章没有提到修改元素的状态?

例如,假设"形状"是非线程安全的集合(例如ArrayList),下面的代码是否被认为有干扰?(问题2)

shapes.stream() 
      .filter(s -> s.getColor() == BLUE)
      .forEach(s -> s.setColor(RED));
Run Code Online (Sandbox Code Playgroud)

这个例子取自可靠的来源(至少可以说),所以它应该是正确的.但是,如果我改变stream()parallelStream(),它仍然是安全和正确的吗?(问题3)

另一方面,另一个可靠来源Naftalin Maurice的"掌握Lambdas"清楚地表明,通过管道操作改变元素的状态(值)确实是干扰.从关于不干涉的部分(3.2.3):

"但是流的规则禁止对流源进行任何修改 - 包括,例如,通过任何线程更改元素的值,而不仅仅是管道操作."

如果书中所说的是正确的,是否意味着我们不能使用Stream API来修改元素的状态(使用forEach),并且必须使用常规迭代器(或for-each,或Iterable.forEach)来做到这一点?(问题4)

java lambda java-8 java-stream

10
推荐指数
1
解决办法
1328
查看次数

什么是初始化的java对象字段?

它是nullObject类型?

class C {
    int i;
    String s;
    public C() {}
}
Run Code Online (Sandbox Code Playgroud)

s永远null吗?

简单类型怎么样int?那会是什么?零或任意值?

方法中的局部变量怎么样?

public void meth() {
    int i;
}
Run Code Online (Sandbox Code Playgroud)

什么是酉值i


然而,依赖于这样的默认值通常被认为是糟糕的编程风格.

好的,你建议我们做什么?

class A {
    String s = "";
    int i = 0;
}
Run Code Online (Sandbox Code Playgroud)

要么:

class A {
    String s;
    int i;
    public A() {
        // default constructor
        s = "";
        i = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个更好?为什么?

java initialization

9
推荐指数
1
解决办法
2万
查看次数

动态编程 - 油漆栅栏算法

有一个有n个帖子的围栏,每个帖子都可以涂上一种k颜色.您必须绘制所有帖子,使得不超过两个相邻的栅栏柱具有相同的颜色.返回可以绘制栅栏的总方式.

diff - 具有不同颜色的组合的数量,
相同 - 具有相同颜色的组合的数量,
n - 发布的数量,
k - 颜色的数量.

对于n = 1:

diff = k;
same = 0;
Run Code Online (Sandbox Code Playgroud)

对于n = 2:

diff = k * (k - 1);
same = k;
Run Code Online (Sandbox Code Playgroud)

对于n = 3:

diff = (k + k * (k - 1)) * (k - 1);
same = k * (k - 1);
Run Code Online (Sandbox Code Playgroud)

最后的公式是:

diff[i] = (diff[i - 1] + diff[i - 2]) * (k - 1);
same[i] =  diff[i - …
Run Code Online (Sandbox Code Playgroud)

algorithm dynamic-programming combinatorics

9
推荐指数
3
解决办法
4659
查看次数

消除接受不同功能接口的重载方法的歧义

我在Utils类中有以下可用方法:

protected <U> U withTx(Function<OrientGraph, U> fc) {
    // do something with the function
}

protected void withTx(Consumer<OrientGraph> consumer) {
    withTx(g -> {
        consumer.accept(g);
        return null;
    });
}
Run Code Online (Sandbox Code Playgroud)

myClass我的方法中:

withTx(g -> anotherMethod(g));
Run Code Online (Sandbox Code Playgroud)

第二段代码有一个编译错误:

The method withTx(Function<OrientGraph, Object>) is ambiguous for the type myClass

我想这来自编译器,它无法确定lambda是a Consumer还是a Function.是否有一种消除歧视这种情况的高尚方式?

无论方法anotherMethod返回什么(void,Object什么),我都不想使用这个返回值.

一种解决方案是:

withTx(g -> { anotherMethod(g); });
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的东西,因为这会触发SonarLint.

java lambda java-8

9
推荐指数
1
解决办法
167
查看次数

减少java中自定义对象的操作

如何使用Reduce操作在对象的两个字段上执行求和.

例如

class Pojo
{
    public Pojo(int a, int b) {
        super();
        this.a = a;
        this.b = b;
    }
    int a ;
    int b;
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }

}

Pojo object1 = new Pojo(1, 1);
Pojo object2 = new Pojo(2, 2);
Pojo object3 = new Pojo(3, 3);
Pojo object4 = new Pojo(4, …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

8
推荐指数
2
解决办法
2688
查看次数