Java中基本数据类型
数值型: 整数类型(byte、int、long、short)、浮点类型(double、float)
字符型 :char
布尔型:boolean
equals和==的区别
==
- 比较基本数据类型时,比较的是表面值内容
- 比较两个对象时,比较的是两个对象的内存地址值
equals
- 不能作用于基本类型变量的比较
- 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;Integer、String等类对equals方法进行了重写,比较的是所指向的对象的内容
boolean flag1=true;
boolean flag2=true;
System.out.println(flag1==flag2);
System.out.println("=============");
Integer a=5;
Integer b=5;
System.out.println(a.equals(b));//true
System.out.println(a==b);//true
System.out.println("=============");
Integer c=new Integer(6);
Integer d=new Integer(6);
System.out.println(c==d); //false
System.out.println(c.equals(d)); //true
System.out.println("=============");
String str1="123";
String str2="123";
System.out.println("=============");
System.out.println(str1.equals(str2)); //true
System.out.println(str1==str2); //true
System.out.println("=============");
String str3=new String("456");
String str4=new String("456");
String str5=str3;
System.out.println(str3==str4); //false
System.out.println(str3==str5); //true
System.out.println(str5.equals(str3)); //true
下面这段代码返回true的原因
Integer a=5;
Integer b=5;
System.out.println(a==b);//true
因为定义一个Integer变量时,会默认进行Integer.valueOf(a)
操作
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
high的值为127,low的值为-128。
当进行这个方法时如果值在-128-127之间,返回的值也就是地址是相同的,即a和b的地址相同
当a=b=128
时输出为false
String和new String的区别
如String a="123";
和String b=new String("123");
的区别
String a="123";
String b="123";
System.out.println(a==b); //a和b的地址一样,输出为true
String c=new String("123");
String d=new String("123");
System.out.println(c==d); //c和d的地址不一样,输出为false
System.out.println(System.identityHashCode(a)); //245257410
System.out.println(System.identityHashCode(b)); //245257410
System.out.println(System.identityHashCode(c)); //1705736037
System.out.println(System.identityHashCode(d)); //455659002
- 如果a==b,那么
System.identityHashCode()
一定相等 - 如果
System.identityHashCode()
相等,不能保证a==b
对象和变量的概念
- a和b都为变量
- 对象通过new在堆中创建,关键字new绝对会在堆空间创建内存区域。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在常量池中,常量池的一个好处就是可以把相同的字符串合并,占用一个空间。
String a="123";
String b="123";
System.out.println(a==b); //所以a和b的地址一样,输出为true
string a="123";
直接给变量a赋值123,存储在常量池中。
如果常量池中存在“123”
,a直接引用,此时不创建String对象;如果常量池中不存在"123"
,先在常量池先创建“123”
内存空间,再引用。
string a="123";
最多创建一个String对象,最少不创建String对象。
String b=new String("123");
通过构造器构造
String b=new String("123")
中的123
本身就是常量池中的一个变量,在运行 new String()时,把常量池中的字符串123
复制到堆中,并把这个对象的应用交给b
,所以创建了两个String对象,一个在常量池中,一个在堆中。
String b=new String("123");
最多创建两个String对象,最少创建一个String对象。
String a="123"和String b=new String(“123”)结合的例子
String a="123";
String b=new String("321");
System.out.println(a==b); //false
System.out.println("================");
b="123";
System.out.println(a==b); //true
String a="123"
和String b=new String("123")
的区别内存的分配方式不一样,前者是在常量池中,后者是在堆内存中。