== 和 equals() 的区别
== 和 equals() 的区别
- 基本数据类型:
- 六数字 :byte、short、int、long、float、double;
- 一布:boolean
- 一字节:char
== 比较运算符
比较的是内存地址
在比较 基本 数据类型的时候比较的是他们的 值 是否相等
在比较 引用 数据类型的时候比较的是他们的引用(内存地址)是否相等<是否指向同一个对象>
注意:你可以用==来比较基本数据类型和它对应的包装类,二者类型兼容可比较(java底层给你自动转换了)若不兼容,编译会报错
这里还需要注意char类型,它比较的是字符的ASCLL码值。具体char的玩法自己去研究吧。
equals() 方法
该方法是Object的一个方法,因为java中所有的类都默认继承了Object类,所以,所有的类对象都可以使用此方法。如果有特殊要求还可以对这个方法进行重写。
因为它是一个方法,所以基本数据类型的变量是点不出这个方法的哟,它只能用于引用类型的比较
他在比较File、Date、String 及其包装类,比较的是对象的内容是否相等,因为这些特殊的类都重写了equals()方法,
比较其他类型的时候,比较的是他们的引用(内存地址)是否相等<是否指向同一个对象>
String对象的创建
字面量创建String对象
虽然创建了两个变量,但c和c2引用的是常量池中的同一个 "崩坏酱"。(常量池 位于堆中单独的一块内存区域)
-
在创建的过程中,系统会先去常量池中找 有没有 "崩坏酱" 这个字符串,如果有,则将引用赋值给c和c2;如果没有则会在常量池中添加 "崩坏酱" 这个字符串,然后再赋值给c和c2.
String c = "崩坏酱"; String c2 = "崩坏酱"; //所以 System.out.println(c==c2); // true
new创建String对象
- 在创建的过程中,系统会先去常量池中找有没有 "律化娜" 这个字符串,如果有,则直接在堆中创建 "律化娜" 这个对象,然后把引用赋值给a和b;如果没有则会在常量池中添加 "律化娜" 这个字符串,然后在堆中创建一个 "律化娜" 对象,再把这个对象的引用赋值给a和b
String a = new String("律化娜");
String b = new String("律化娜");- 总结:字面量创建字符串比new的方式创建更高效,更省内存。
字符串相加问题
String字面量相加,如果一开始常量池中没有"崩坏";这种情况现在的JVM做优化以后,它会将相加的结果 "崩坏" 直接添加到常量池中,而不会添加 "崩"、"坏"、"崩坏" 三个字符串,然后再将"崩坏"的引用赋值给s。
String s = "崩"+"坏";
String对象相加,java会通过StringBuilder去实现这三个对象的相加,同样的情况,如果常量池中没有"233",它会先在常量池中添加2和3 ,然后根据相加的结果在堆中创建一个"233"字符串对象,然后把这个对象的引用赋值给s2.
String s2 = new String("2")+new String("3")+new String("3");