相关疑难解决方法(0)

Java中的自动装箱与手动装箱

为什么第二段代码更快?

Map<Integer, Double> map = new HashMap<Integer, Double>();
for (int i = 0; i < 50000; i++) {
    for (double j = 0.0; j < 10000; j++) {
        map.put(i, j);
    }
}

Map<Integer, Double> map=new HashMap<Integer, Double>();
for (int i = 0; i < 50000; i++) {
    for (double j = 0.0; j < 10000; j++) {            
        map.put(new Integer(i), new Double(j));
    }
}
Run Code Online (Sandbox Code Playgroud)

java autoboxing

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

为什么编译器/ JVM不能让autoboxing"正常工作"?

Autoboxing相当可怕.虽然我完全理解之间的差异==.equals我不能不帮助有后续错误的地狱了我:

    final List<Integer> foo = Arrays.asList(1, 1000);
    final List<Integer> bar = Arrays.asList(1, 1000);
    System.out.println(foo.get(0) == bar.get(0));
    System.out.println(foo.get(1) == bar.get(1));
Run Code Online (Sandbox Code Playgroud)

那打印

true
false
Run Code Online (Sandbox Code Playgroud)

他们为什么这样做?它与缓存的整数有关,但如果是这样的话,为什么它们不只是缓存程序使用的所有整数?或者为什么JVM始终不会自动拆箱到原始状态?

打印虚假或真假会更好.

编辑

我不同意旧代码的破坏.通过foo.get(0) == bar.get(0)返回true,您已经破坏了代码.

通过在字节代码中将int替换为int(只要从未赋值为null),就不能在编译器级别解决这个问题.

java autoboxing caching integer

12
推荐指数
3
解决办法
2486
查看次数

Java自动装箱规则

我是一个java新手,并且对以下示例感到困惑.是否可以认为"=="符号将比较Integers和int中的"autoboxed"整数之间的值,并比较整数之间的参考地址?

双打和0/0怎么样?

import edu.princeton.cs.introcs.*;

public class Autoboxing {

    public static void cmp(Integer first, Integer second) {
        if (first < second)
            StdOut.printf("%d < %d\n", first, second);
        else if (first == second)
            StdOut.printf("%d == %d\n", first, second);
        else if (first > second)
            StdOut.printf("%d > %d\n", first, second);
        else
            StdOut.printf("%d and %d are incomparable\n", first, second);
    }

    public static void main(String[] args) {
        cmp(new Integer(42), 43);
        cmp(new Integer(42), new Integer(42));
        cmp(43, 43);
        cmp(142, 142);

        Integer a0 = 1000;
        int b0 = …
Run Code Online (Sandbox Code Playgroud)

java autoboxing

11
推荐指数
2
解决办法
7361
查看次数

带有整数键的Java Map:如何比较键?

我只是想确保我的代码使用对象作为键是安全的Integer.这是一个简短的例子:

Integer int1 = new Integer(1337);
Integer int2 = new Integer(1337);

if (int1 == int2) {
    System.out.println("true");
} else {
    System.out.println("false");
}

if (int1.equals(int2)) {
    System.out.println("true");
} else {
    System.out.println("false");
}

Map<Integer, Object> map = new HashMap<Integer, Object>();
map.put(int1, null);
map.put(int2, null);

System.out.println(map.size());
Run Code Online (Sandbox Code Playgroud)

代码将输出

false
true
1
Run Code Online (Sandbox Code Playgroud)

这就是我所期待的,参考文献有所不同,但它们彼此相同.现在我对Map的行为很感兴趣.

  • 是否可以保证像Map或Set这样的集合会按照内容而不是参考来比较密钥?
  • 或者取决于实际的实施,比如HashMap

java collections

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

在java中等于和==行为

请你解释下面的行为.

public class EqAndRef {

    public static void main(String[] args) {
        Integer i = 10;
        Integer j = 10;

        Double a = 10D;
        Double b = 10D;

        System.out.println(i.equals(j));
        System.out.println(i == j);


        System.out.println(a.equals(b));
        System.out.println(a == b);


    }
}
Run Code Online (Sandbox Code Playgroud)

输出jdk 6

true
true
true
false
Run Code Online (Sandbox Code Playgroud)

为什么a == b是假的而我= = j不是假的?

java

6
推荐指数
2
解决办法
388
查看次数

为什么object.equals(new Integer(1))等于true?

我正在努力理解这个Koan:

@Koan
public void equalsMethodCanBeChangedBySubclassesToTestsIfTwoObjectsAreEqual() {
    Object object = new Integer(1);
    assertEquals(object.equals(object), true);
    assertEquals(object.equals(new Integer(1)), __);
    // Note: This means that for the class 'Object' there is no difference between 'equal' and 'same'
    // but for the class 'Integer' there is difference - see below
}
Run Code Online (Sandbox Code Playgroud)

据我所知,因为objectObject类的一个实例,该.equals()方法尚未被覆盖,因此检查对象是否相等.

如果new Integer(1)创建一个新实例,那么它应该是一个单独的对象object.按照我的思路,正确的答案应该是false,但只有true通过.我逻辑中的缺陷在哪里?

编辑:我知道-128和127之间的整数是缓存的.如果我对该object对象的理解是正确的(如上所述),那么这是无关紧要的.

java

4
推荐指数
1
解决办法
412
查看次数

当它们是.equals()时,Java整数总是==吗?

通常,使用==无法比较Java库中对象的引用,但我刚刚检查过:

Integer x = 5;
Integer y = x + 1;
Integer z = y - 1;
x.equals(z)
true   (boolean)
x == z
true   (boolean)
Run Code Online (Sandbox Code Playgroud)

这只是我的IDE的工件,还是Java Integer对象保证在它们具有相同值时指向相同的Integer?后一种保证会简化我正在编写的一些代码.

java wrapper

3
推荐指数
1
解决办法
181
查看次数

为什么==对于Integer和String是不同的?

main(){

Integer i1 = 500;

Integer i2 = 500;

System.out.println(i1 == i2);  // O/P is "**false**"

String s1 = "Hello";

String s2 = "Hello";

System.out.println(s1 == s2);  // O/P is "**true**"

} // End of main.
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么输出不同.据我所知s1,s2将指向堆上的同一个对象.所以他们的参考地址是一样的.同样地,我认为整数也是一样的.但事实并非如此.它为什么不同?

java

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

java中的向量只包含对象?

我有这个问题,

java中的向量只接受对象吗?但这段代码编译得很好

Vector myv=new Vector();
myv.addElement(1);
myv.addElement(1);
Run Code Online (Sandbox Code Playgroud)

它将它封装为Integer的对象吗?如果确实如此,为什么要这样说

System.out.println(myv.elementAt(0)==myv.elementAt(1));
Run Code Online (Sandbox Code Playgroud)

真的吗!!! 他们应该是两个不同的对象......?

同时此语句抛出一个错误,确保该元素是一个对象.

int x=myv.elementAt(0);
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解释一下吗?谢谢.

java oop vector

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

为什么Comparator <Integer []>抛出异常?

我有一个例外

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at Main.main(Main.java:64)
Run Code Online (Sandbox Code Playgroud)

使用此代码时:

Arrays.sort(arr, new Comparator<Integer[]>(){  //arr is 2D array
        public int compare(Integer[] o1, Integer[] o2){
            return o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我认为这与不满足比较的传递性有关,但当我做了一点这样的改变时:

Arrays.sort(arr, new Comparator<Integer[]>(){  //arr is 2D array
        public int compare(Integer[] o1, Integer[] o2){
            return o1[2].compareTo(o2[2]); // here is the change
        }
    });
Run Code Online (Sandbox Code Playgroud)

不再生成异常.我无法理解这个问题的解释,因为我确信除了compareTo()方法之外,还可以使用关系运算符(>,<,=)来比较Integer实例

Integer x = 1;
Integer y = 2;
System.out.println(x<y);
Run Code Online (Sandbox Code Playgroud)

按预期打印true

任何机构都可以澄清吗?

java comparator

0
推荐指数
1
解决办法
187
查看次数

标签 统计

java ×10

autoboxing ×3

caching ×1

collections ×1

comparator ×1

integer ×1

oop ×1

vector ×1

wrapper ×1