考虑以下代码:
String first = "abc";
String second = new String("abc");
Run Code Online (Sandbox Code Playgroud)
使用new关键字时,Java会abc String再次创建吗?这会存储在常规堆还是String池中?多少人String在将s结尾String池?
由于这些问题#1说明:问题1和问题2我的理解是" 字符串常量 "被拘留时:
String s = "abc";
Run Code Online (Sandbox Code Playgroud)
在以下情况下,JVM将创建一个新的String对象,而不是使用String Pool中的现有对象:
String s = new String("abc");
Run Code Online (Sandbox Code Playgroud)
但是,在阅读以下两个类似的陈述后,我有一个疑问.
当编译器遇到String文本时,它会检查池以查看是否已存在相同的String.如果找到匹配项,则对新文本的引用将定向到现有String,并且不会创建新的String文本对象.
在这种情况下,由于关键字"new",我们实际上最终会遇到略微不同的行为.在这种情况下,对字符串文字的引用仍然放在常量表(String Literal Pool)中,但是,当你来到关键字"new"时,JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.
因此,当我们使用"new"并基于上面的定义创建对象时,我们还在非池内存和池内存中放置引用.当我们这样做时,JVM是否也应该返回相同的引用?:
String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false
Run Code Online (Sandbox Code Playgroud)
因为在声明字符串文字时String three = "test";它会存在于池中吗?因此应该返回相同的参考和打印真实?或者之前的陈述是否意味着它们将被放入池内存中,但只是在使用new运算符时跳过?
受到关于这个问题的评论的启发,我很确定Java String是在运行时而不是编译时间实现的 - 当然,事实上可以在不同的时间编译类,但在运行时仍然会指向相同的引用.
我似乎无法找到任何证据支持这一点.谁能证明这一点?
我是Java的新手,我对于对象分配有一些问题.例如,
Test t1 = new Test();
Test t2 = t1;
t1.i=1;
Run Code Online (Sandbox Code Playgroud)
假设变量i的测试类中定义的,我说得对假设T1和T2点到修改同一个对象t1.i=1会影响t1和t2?实际上我测试了它,看起来我是对的.但是,当我尝试相同的操作时String,修改仅发生在另一侧不受影响的一侧.这背后的原因是什么?
编辑:我尝试使用String的情况.
String s1 = "0";
String s2 = s1;
s1 = "1";
System.out.println(s1);
System.out.println(s2);
Run Code Online (Sandbox Code Playgroud)
我通过测试String上的案例来实现我的错误,因为它是不可变的.我认为s1="1"修改字符串的情况实际上是将"1"的引用返回给s1.不过,我的问题仍然存在.是否Test t2 = t1;导致t2和t1指向同一个对象,或者现在每个都有自己的对象?这种情况是否适用于Java上的所有对象?
如果我写
String s= new String("how many object b created by this method ");
Run Code Online (Sandbox Code Playgroud)
与这样做相比,将创建多少个参考对象和对象:
Sting s1="Is this method is good as compare to upper";
Run Code Online (Sandbox Code Playgroud) 我在这里有这个对象:
public class ItemInfo {
String productName;
String rfidTagNumber;
String originalLocal;
String currentLocal;
double productPrice;
public ItemInfo(String name, String tag, String origLoc, String curLoc, double price) {
productName = name;
rfidTagNumber = tag;
originalLocal = origLoc;
currentLocal = curLoc;
productPrice = price;
}
Run Code Online (Sandbox Code Playgroud)
我需要ItemInfo在这里创建并引用一个对象:
public class ItemInfoNode {
ItemInfoNode next;
ItemInfoNode prev;
public ItemInfoNode(){
}
public void setInfo(ItemInfo info) {
}
public ItemInfo getInfo(){
return null;
}
public void setNext(ItemInfoNode node) {
}
public void setPrev(ItemInfoNode node) { …Run Code Online (Sandbox Code Playgroud)