public class StringTest01
{
public static void main(String[] args)
{
int i1 = 10;
int i2 = 10; Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
Integer i5 = 10;
Integer i6 = 10; System.out.println("i1 == i2?" + (i1 == i2)); //true
//在输出的情况下,系统才自动调用toString()方法;在操作引用的时候,系统不会调用toString()方法。 System.out.println("i3 == i4?" + (i3 == i4)); //false System.out.println("i1 == i3?" + (i1 == i3)); //true
//自动拆箱 Integer i3 --> 拆箱 --> int temp System.out.println("i5 == i6?" + (i5 == i6)); //true
//java体制中的字符串常量区中已经存在了-128到127的常量数,所以在赋值这个范围内的常量时,自动找到对应常量的地址,而超过这个范围后,值就不会存在常量区了,而是相当于new了一个常量,也就是引用为地址 System.out.println("i1 == i6?" + (i1 == i6)); //true
//自动拆箱 Integer i3 --> 拆箱 --> int temp String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println("s1 == s2?" + (s1 == s2)); //true
System.out.println("s3 == s4?" + (s3 == s4)); //false
System.out.println("s1 == s3?" + (s1 == s3)); //false System.out.println("s3 == s4?" + s3.equals(s4));/true String s5 = "Abc";
System.out.println("s1 == s5?" + s1.equalsIgnoreCase(s5));//true
//不区分大小写的比较
}
}请教下 System.out.println("i3 == i4?" + (i3 == i4)); //false 这句话的输出结果为什么是false
我记得Integer()对toString()方法做了覆盖 所以返回的应该是值 值的比较为什么是不等的?
还有请高手看看我的注释对不对?
{
public static void main(String[] args)
{
int i1 = 10;
int i2 = 10; Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
Integer i5 = 10;
Integer i6 = 10; System.out.println("i1 == i2?" + (i1 == i2)); //true
//在输出的情况下,系统才自动调用toString()方法;在操作引用的时候,系统不会调用toString()方法。 System.out.println("i3 == i4?" + (i3 == i4)); //false System.out.println("i1 == i3?" + (i1 == i3)); //true
//自动拆箱 Integer i3 --> 拆箱 --> int temp System.out.println("i5 == i6?" + (i5 == i6)); //true
//java体制中的字符串常量区中已经存在了-128到127的常量数,所以在赋值这个范围内的常量时,自动找到对应常量的地址,而超过这个范围后,值就不会存在常量区了,而是相当于new了一个常量,也就是引用为地址 System.out.println("i1 == i6?" + (i1 == i6)); //true
//自动拆箱 Integer i3 --> 拆箱 --> int temp String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println("s1 == s2?" + (s1 == s2)); //true
System.out.println("s3 == s4?" + (s3 == s4)); //false
System.out.println("s1 == s3?" + (s1 == s3)); //false System.out.println("s3 == s4?" + s3.equals(s4));/true String s5 = "Abc";
System.out.println("s1 == s5?" + s1.equalsIgnoreCase(s5));//true
//不区分大小写的比较
}
}请教下 System.out.println("i3 == i4?" + (i3 == i4)); //false 这句话的输出结果为什么是false
我记得Integer()对toString()方法做了覆盖 所以返回的应该是值 值的比较为什么是不等的?
还有请高手看看我的注释对不对?
String s3 = new String("abc");// 不是基本数据类型;
不知道这样理解对你有帮助不?
String 不是基本类型
为什么这么讲呢,因为对象分为栈对象和堆对象。
基本类型是栈对象,栈对象有个特点就是:多个引用所指向的内存数据就一份,即新建的变量指向原来的内存数据,并没有新创建数据。(为节省内存)
而堆对象:new的时候就创建了一个新的内存数据拷贝。二、S3==S4为什么是false
因为String是一种特殊的包装类
String str = new String("abc");
String str = "abc";
第一种,在堆中new新对象,每new一次创建一个新对象!
第二种,在栈中,先查找后指向,与基本数据类型一致三、toString()方法。
可以使用“+”运算符来将两个字符串连接起来产生一个新的String对象。只要+运算符有一个运算数是字符串(String)实例时,编译器就将另一个运算数转换为它的字符串形式。这种操作是通过调用一个由String类定义的字符串转换方法valueOf()来完成的。对于简单类型,valueOf()方法返回一个字符串,该字符串包含了该类型的值的字符串。对于对象,valueOf()方法调用toString()方法。每一个类都执行toString()方法,因为它是由Object定义的。四、
int i1 = 10;
int i2 = 10;
Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
Integer i5 = 10;
Integer i6 = 10;
System.out.println("i1 == i2?" + (i1 == i2)); //true i1和i2相等,指向一个内存数据10
System.out.println("i3 == i4?" + (i3 == i4)); //false i3/i4指向的不同的堆内存数据
System.out.println("i5 == i6?" + (i5 == i6)); //true 同i1/i2
System.out.println("i1 == i6?" + (i1 == i6)); //true 栈中的有数据10.创建新的引用变量的时候,会搜索栈中是是否有10,如果有就直接指向它。所以i1==i6
System.out.println("i1 == i3?" + (i1 == i3)); //true ????这个有问题了。。应该是FALSE. 两个引用一个指向栈,一个指向堆,,不可能有相同地址的。
System.out.println("i1 == i3?" + (i1 == i3)); //true 能回答一下为什么是ture么??
Integer i3 = new Integer(10);
System.out.println("i1 == i3?" + (i1 == i3));
结果是false
和StringBuffer有关