当前位置: 技术问答>java相关
对JAVA基础掌握比较好的,没什么说的,进来看看吧!!!!!!!!!!
来源: 互联网 发布时间:2015-04-11
本文导语: 给出下面程序的输出:并请说明原因。 ------------------- class StringLiteral { public static void main(String[] args) { String java = "Java", va = "va"; System.out.println(java == "Java")...
给出下面程序的输出:并请说明原因。
-------------------
class StringLiteral {
public static void main(String[] args) {
String java = "Java", va = "va";
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
}
}
class Other { static String java = "Java"; }
-------------------
class StringLiteral {
public static void main(String[] args) {
String java = "Java", va = "va";
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
}
}
class Other { static String java = "Java"; }
|
为了说明问题,我对原来的程序进行了如下改动:
/** BEGIN */
class StringLiteral {
public static void main(String[] args) {
String java = "Java", va = "va";
String java2 = new String("Java");
System.out.println("=== 1 ===");
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
System.out.println("=== 2 ===");
System.out.println(java . equals ( "Java"));
System.out.println(Other.java . equals ( java));
System.out.println(java . equals ( "Ja"+"va"));
System.out.println(java . equals ( "Ja"+va));
System.out.println("=== 3 ===");
System.out.println(java == new String( "Ja"+va));
System.out.println(java .equals( new String( "Ja"+va)));
System.out.println("n=== 4 ===");
System.out.println(java2 == "Java");
System.out.println(Other.java == java2);
System.out.println(java2 == ("Ja"+"va"));
System.out.println(java2 == ("Ja"+va));
System.out.println("=== 5 ===");
System.out.println(java2 . equals ( "Java"));
System.out.println(Other.java . equals ( java2));
System.out.println(java2 . equals ( "Ja"+"va"));
System.out.println(java2 . equals ( "Ja"+va));
System.out.println("=== 6 ===");
System.out.println(java2 == new String( "Ja"+va));
System.out.println(java2 .equals( new String( "Ja"+va)));
}
}
class Other { static String java = "Java"; }
/** END */
输出结果是:
=== 1 ===
true
true
true
false
=== 2 ===
true
true
true
true
=== 3 ===
false
true
=== 4 ===
false
false
false
false
=== 5 ===
true
true
true
true
=== 6 ===
false
true
问题应该已经说明白了。
1、 "==" 比较的是内存地址,而不是值。
而"equals"比较的是值,不是地址
2、 通过变量声明,没有 new 的String变量,是在编译时确定的,
所有值相同的变量指向同一个地址(共用一个实例)。
3、 通过 new 生成的 String 值,是在运行期建立的,
不与其他变量共享内存(建立的时候)。
/** BEGIN */
class StringLiteral {
public static void main(String[] args) {
String java = "Java", va = "va";
String java2 = new String("Java");
System.out.println("=== 1 ===");
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
System.out.println("=== 2 ===");
System.out.println(java . equals ( "Java"));
System.out.println(Other.java . equals ( java));
System.out.println(java . equals ( "Ja"+"va"));
System.out.println(java . equals ( "Ja"+va));
System.out.println("=== 3 ===");
System.out.println(java == new String( "Ja"+va));
System.out.println(java .equals( new String( "Ja"+va)));
System.out.println("n=== 4 ===");
System.out.println(java2 == "Java");
System.out.println(Other.java == java2);
System.out.println(java2 == ("Ja"+"va"));
System.out.println(java2 == ("Ja"+va));
System.out.println("=== 5 ===");
System.out.println(java2 . equals ( "Java"));
System.out.println(Other.java . equals ( java2));
System.out.println(java2 . equals ( "Ja"+"va"));
System.out.println(java2 . equals ( "Ja"+va));
System.out.println("=== 6 ===");
System.out.println(java2 == new String( "Ja"+va));
System.out.println(java2 .equals( new String( "Ja"+va)));
}
}
class Other { static String java = "Java"; }
/** END */
输出结果是:
=== 1 ===
true
true
true
false
=== 2 ===
true
true
true
true
=== 3 ===
false
true
=== 4 ===
false
false
false
false
=== 5 ===
true
true
true
true
=== 6 ===
false
true
问题应该已经说明白了。
1、 "==" 比较的是内存地址,而不是值。
而"equals"比较的是值,不是地址
2、 通过变量声明,没有 new 的String变量,是在编译时确定的,
所有值相同的变量指向同一个地址(共用一个实例)。
3、 通过 new 生成的 String 值,是在运行期建立的,
不与其他变量共享内存(建立的时候)。
|
我觉的,首先,String是一个Object来的,
所以用==来比较,是比较他们是否同一个对象,
因为java的编译优化的机制,所以
String java = "Java", va = "va";
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
前面三个都是在编译的时候就可以静态确定的,所以分配到了
同一个对象,所以比较结果是true
而第四个,由于"Ja"+va是要等到运行的时候才能确定,
所以会新分配了一个对象,所以是false
所以用==来比较,是比较他们是否同一个对象,
因为java的编译优化的机制,所以
String java = "Java", va = "va";
System.out.println(java == "Java");
System.out.println(Other.java == java);
System.out.println(java == ("Ja"+"va"));
System.out.println(java == ("Ja"+va));
前面三个都是在编译的时候就可以静态确定的,所以分配到了
同一个对象,所以比较结果是true
而第四个,由于"Ja"+va是要等到运行的时候才能确定,
所以会新分配了一个对象,所以是false
|
前三个为“true”就不用说了,最后一个为false是因为:
在JAVA中,String有专门的strings池存放。当你建立一个String变量,编译时,如果编译器发现池中有相同的变量,它就直接引用该变量,否则创建新的(这一切都是在编译时完成的)。“==”操作比较的不仅是两个变量的值,而且还要比较它们的地址(在池中的位置是否相同),而"ja"+va这句话中由于va不是常量,不能在编译时完成此操作,所以该String不能放到String池中,自然地址不一样,java==("ja"+va)为false了
在JAVA中,String有专门的strings池存放。当你建立一个String变量,编译时,如果编译器发现池中有相同的变量,它就直接引用该变量,否则创建新的(这一切都是在编译时完成的)。“==”操作比较的不仅是两个变量的值,而且还要比较它们的地址(在池中的位置是否相同),而"ja"+va这句话中由于va不是常量,不能在编译时完成此操作,所以该String不能放到String池中,自然地址不一样,java==("ja"+va)为false了