String s1 = "ja";
String s2 = s1+ "va";
String s3= "java";
System.out.println(s2==s3);
输出为什么为true
String s2 = s1+ "va";
String s3= "java";
System.out.println(s2==s3);
输出为什么为true
解决方案 »
- 求!!关于用java判断输入3个数组成什么三角形
- 如何在程序种调用其他程序啊
- 关于解析ascii码生成的报文的中文问题,急!!!
- J2SE-1.4中取整函数是什么?在哪个类中?
- 给三个float 数r,g,b随机赋值,而且限定范围[0,255],应该怎样写?
- tomcat怎么运行
- 有些问题学的糊涂,请大家指教一下
- 急急!!60分请问一下JPasswordField的个getpassword()怎么用数组实现 还有。。。
- java 的环境配置,请高手指教!
- 求救:安装了JB5以后,怎么提示要我输入序列好(licensing)?
- 关于java生成bmp图像
- Java Word PDF PPT 读写
package com.riyun.test;public class Demo { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1="va";
String s2="ja"+s1;
String s3="java";
System.out.println(s2==s3);//false
System.out.println(s2.equals(s3));//true
StringBuffer sb1=new StringBuffer("va");
StringBuffer sb2=new StringBuffer("ja");
StringBuffer sb3=new StringBuffer("java");
System.out.println(sb3==sb2.append(sb1));//false
System.out.println(sb3.equals(sb2.append(sb1)));//false }}我也不知道为什么,求大神!
这个代码的执行过程是这样的
StringBuffer value = new StringBuffer();
value.append("ja");
value.append(si);
s2 = value.tonString();所以S2和S3是不同的对象,那就不同了 就出现false。我的理解不对请大家改正
String s2="ja"+s1;
这个代码的执行过程是这样的
StringBuffer value = new StringBuffer();
value.append("ja");
value.append(s1);
s2 = value.toString();
String s1="java";
String s4="java";
System.out.println(s1==s4);
这样才是true的
String s1 = "ja";
String s2 = s1+ "va";
String s3= "java";System.out.println(s2==s3);
==比较的是内存地址,s2是通过s1+“va”然后放在s2这个变量里面的,很明显和s3指的内存地址是不一样的,所以结果是false啊。要比较两个字符串的值是否相等应该用equal。
String s2 = s1+ "va";并不是从字符串对象池中找了,s1+"va" 由于字符串s1改变了,所以创建了个新对象。
1.String s1 = new String("java");
2.String s2 = "java";两种创建方式在内存中是有区别的:
1.对于String s1 = new String("java");用new创建一个String对象,是在内存的堆中,开辟空间,创建一个String类型的对象,而s1是这个对象的一个引用,s1指向该String对象的地址。
用new创建对象,new多少次,就产生多少个对象。
2.对于String s2 = "java";在创建对象时,先查看堆中,有没有与将要创建对象“java”相同的对象存在,如果有,不会真正的创建一个对象,而是这个引用s2直接指向已存在的那个对象;如果没有,就才创建一个对象。上面所说的,对象的引用(s1,s2),是存放在栈中的
引用指向该对象(“java”)的地址,就是将对象的地址,赋值给引用。