什么是Java中的String Interning,何时应该使用它,为什么?
Javadoc关于String.intern()没有提供太多细节.(简而言之:它返回字符串的规范表示,允许使用内部字符串进行比较==)
String.equals()?String.intern()吗?这两个陈述之间有什么区别?
String s = "text";
String s = new String("text");
Run Code Online (Sandbox Code Playgroud) class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
false
Run Code Online (Sandbox Code Playgroud)
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
true
Run Code Online (Sandbox Code Playgroud)
注意:-128到127之间的数字为真.
String Pool是什么意思?以下声明之间有什么区别:
String s = "hello";
String s = new String("hello");
Run Code Online (Sandbox Code Playgroud)
JVM存储这两个字符串有什么区别吗?
编辑:好的,好的,我误读了.我不是将int与Integer进行比较.正好指出.
我的SCJP书说:
当==用于将基元与包装器进行比较时,包装器将被解包,并且比较将是原始的.
所以你认为这段代码会打印出来true:
Integer i1 = 1; //if this were int it'd be correct and behave as the book says.
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)
但它打印出来false.
另外,根据我的书,这应该打印true:
Integer i1 = 1000; //it does print `true` with i1 = 1000, but not i1 = 1, and one of the answers explained why.
Integer i2 = 1000;
System.out.println(i1 != i2);
Run Code Online (Sandbox Code Playgroud)
不.是的false.
是什么赋予了?
public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里我已经对变量ab进行了同步.我已经创建了两个不同的类Check实例,但是我总是得到s1的输出,然后是s2,反之亦然,但是没有混合,为什么会这样呢?当我已经创建了两个单独的对象(在main中),那么两个不同的线程,两个不同的ab变量,那么它如何成为两个不同对象的共享资源?
我到处都读到,当你在Java中定义-128到127之间的整数时,它不是创建一个新对象,而是返回一个已创建的对象.
除了让新手程序员比较Integer对象==以查看它们是否是相同的数字之外,我认为没有任何其他的做法,但我认为这很糟糕,因为他们确实认为他们可以比较任何整数==,并且也是教学任何编程语言的不良做法:比较两个"不同"对象的内容==.
为什么要这样做还有其他原因吗?或者在设计语言时(在我看来)像JavaScript中的可选分号一样,这只是一个错误的决定?
编辑:我在这里看到他们解释了行为:为什么整数常量池的行为在127处变化?
我问为什么他们设计它有这种行为,而不是为什么这种行为发生.
在 Java 中,通过对象方式声明的 int 常量有什么好处:
public final static Integer SOME_CONSTANT = Integer.valueOf(99);
Run Code Online (Sandbox Code Playgroud)
而不是经典
public final static int SOME_CONSTANT = 99;
Run Code Online (Sandbox Code Playgroud)
我知道对象和原语之间的基本区别,还有自动装箱。但是我在我们公司的代码中看到了这个声明,我想知道将整数常量声明为对象有什么特别的原因吗?
List<Integer> test = List.of(955, 955);
if (test.get(1) == test.get(0))
...
Run Code Online (Sandbox Code Playgroud)
以上条件导致 false
List<Integer> test = List.of(955, 955);
int a = test.get(1);
int b = test.get(0);
if (a == b)
...
Run Code Online (Sandbox Code Playgroud)
上述条件返回true。
为什么会这样?片段之间有什么区别?