==
java中虽然有引用传递和值传递但只会值传递对于对象参数,值的内容是对象的引用
基本数据类型除Boolean都可以用==来判断是否是值相等
public static void main(String[] args) {
int int_1=100;
double double_1=100.0;
if(double_1 == int_1 ){//本以为会是false,结果网上搜了之后,会自动转换。涉及到机组,以后买了书再来分析
System.out.println("true");
}
System.out.println(double_1 == int_1);
}
Integer 与 int
Integer 是 int 的包装类,int 则是 java 的一种基本数据类型
public static void main(String[] args) {
int int_01=100;
Integer integer_01=100;
Integer integer_02=new Integer(100);
System.out.println(int_01 == integer_01);//true
System.out.println(int_01 == integer_02);//true
int int_11=10000;
Integer integer_11=10000;
Integer integer_12=new Integer(10000);
System.out.println(int_11 == integer_11);//true
System.out.println(int_11 == integer_12);//true
}
结论:基本数据类型与自己的包装类比较时都相等不管是不是new对象
Integer 与 Integer 比较
public static void main(String[] args) {
Integer integer_1=100;
Integer integer_11=127;
Integer integer_111=128;
Integer integer_1111=5555;
Integer integer_2=100;
Integer integer_22=127;
Integer integer_222=128;
Integer integer_2222=5555;
System.out.println(integer_1 == integer_2);//true
System.out.println(integer_11 == integer_22);//true
System.out.println(integer_111 == integer_222);//false
System.out.println(integer_1111 == integer_2222);//false
}
结论:通过网上查阅,得出结论当第一个变量integer的值在-128~127之间时会缓存值,下一次出现同一值时不会去new对象并且
Integer integer_1 = 100 在编译时,会翻译成为 Integer integer_1 = Integer.valueOf(100)
Integer 与 new Integer() 比较
public static void main(String[] args) {
Integer integer_1=100;
Integer integer_11=127;
Integer integer_111=128;
Integer integer_1111=5555;
Integer integer_2=new Integer(100);
Integer integer_22=new Integer(127);
Integer integer_222=new Integer(128);
Integer integer_2222=new Integer(5555);
Integer integer_3=new Integer(100);
Integer integer_33=new Integer(127);
Integer integer_333=new Integer(128);
Integer integer_3333=new Integer(5555);
System.out.println(integer_1 == integer_3);//true
System.out.println(integer_11 == integer_33);//true
System.out.println(integer_111 == integer_333);//true
System.out.println(integer_1111 == integer_3333);//true
System.out.println(integer_2 == integer_3);//true
System.out.println(integer_22 == integer_33);//true
System.out.println(integer_222 == integer_333);//true
System.out.println(integer_2222 == integer_3333);//true
}
结论:很明显全是false,new对象时是在堆空间新建对象,Integer integer_1=100时是将值放在常量池
String 与 String 比较
public static void main(String[] args) {
String string1="a";
String string11="ab";
String string111="aa";
String string1111="a"+string1;
String string11111="aa";
String string2="a";
String string22="a"+"b";
String string222="a"+string1;
String string2222="a"+string1;
String string22222=string1+string2;
System.out.println(string1 == (string2));//@1
System.out.println(string11 == (string22));//@2
System.out.println(string111 == (string222));//@3
System.out.println(string1111 == (string2222));//@4
System.out.println(string11111 == (string22222));//@5
}
结果:
true
true
false
false
false
结论:因为String string1="a"是将值放在常量池,所以@1为true ,@2字符串拼接也为true是因为"a"与"b"都在常量池中,编译器直接拼接当成常量相加,没有new新对象,但@3@4@5都是后面加了一个字符串变量后就变了,是因为编译器不会去优化,不会去做常量处理于是我将string1与string2定义为常量后:
public static void main(String[] args) {
final String string1="a";
String string11="ab";
String string111="aa";
String string1111="a"+string1;
String string11111="aa";
final String string2="a";
String string22="a"+"b";
String string222="a"+string1;
String string2222="a"+string1;
String string22222=string1+string2;
System.out.println(string1 == (string2));
System.out.println(string11 == (string22));
System.out.println(string111 == (string222));
System.out.println(string1111 == (string2222));
System.out.println(string11111 == (string22222));
}
结果:全为true