最后一个为FALSE是什么原因呢
解决方案 »
- XML中正则表达式替换问题
- 扫描条形码的原理的题目
- 使用httpUrlConnection如何自动识别字符集
- 急需InstallShield Professional 6.3的安装包和东方语言包,哪儿可以找到阿,
- 高分求一个小游戏!急!!
- 如何限制<textarea name="textcont" cols="30" rows="3"></textarea>输入文字的数量?
- 调查:作十个一万元项目,还是作一个十万元项目。
- 我今天下了jdk1.4beta-46兆呢-最大的变化是加了web start-这个是做什么的?
- 空格的网络传输
- 最近做课程设计,有用到通讯录,问前辈些问题。
- 誰能救救我??
- 三个月能学会JAVA吗?不要求融会贯通,可不可以开发程序?
所以用==来比较,是比较他们是否同一个对象,
因为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有专门的strings池存放。当你建立一个String变量,编译时,如果编译器发现池中有相同的变量,它就直接引用该变量,否则创建新的(这一切都是在编译时完成的)。“==”操作比较的不仅是两个变量的值,而且还要比较它们的地址(在池中的位置是否相同),而"ja"+va这句话中由于va不是常量,不能在编译时完成此操作,所以该String不能放到String池中,自然地址不一样,java==("ja"+va)为false了
学习ing.....
而要用equals.
原因如下:对象的比较用==其实是句柄的比较,他们是两个不同的对象,不过所指的内容是一样罢了,但其句柄是不一样的,不知以为然否?
true
true
false
而 equal()用来判断字符串内容是不是相等
string 兼有基本类型的一些特性,如果你用 String x =new String(...)
则另当别论。true true true false
/** 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 值,是在运行期建立的,
不与其他变量共享内存(建立的时候)。