1.执行下面两条语句
System.out.println(1+2+"b"); // 3b
System.out.println("b"+1+2); // b+12
1.第一条输出3b 。原因是java中低类型遇到高类型向上自动转型为高类型。int < String类型,所以int自动强转为String. 先执行 1+2=3,3遇到"b", 强转为"3b"。
2.第二条输出b12。由上诉强转规则可知,"b"遇到1强转为"b1" ,"b1"+2 ,由于字符串+表示拼接。所以最后生成"b12"
2.执行下面两条语句
System.out.println(1+2+'a'); //100
System.out.println('a'+1+2); //100
两者都输出都是100 。原因由于发生了强转,在java的八大基本数据类型中,char<int。由于'a'是char类型,要自动转换为int类型,根据unicode编码,'a' 为97, 所以1+2+97=100。
3.下面语句是否正确?
byte b1 =1;
byte b2 =2;
byte b3 =b1+b2 //错误
----------------------
byte b1 =1;
byte b2 =++b1; //正确
1.上面三句会报错。原因虽然b1,b2定义为了byte类型,但是b3运算的时候,b1+b2调用的是1+2,运算结果的类型为整数型数据的默认类型,为int ,而定义的b3为byte,出现了两种数据类型不一。精度高的转精度低的,会发生丢失精度,改成byte b3 =byte(b1+b2);就可以了,将结果类型进行强制转换。
2.下面两句话正确。原因 ++b1 [byte] b2 = [byte] b1 + [byte] 1 ,是两个相同byte类型值相加
4.下面语句的输出结果:
int i =12;
int j =12;
System.out.println(i==j); //true
首先编译器处理int i=12 ,在内存栈区创建一个引用变量i,搜索常量池没有12,于是在常量池中创建12 ,让i指向12。 接着处理int j=12,在栈区创建另一个引用变量j,搜索常量池找到12, 于是让j指向12,所有i==j 输出true 。
Integer i = 12;
Integer j = 12;
System.out.println(i==j); //true
Integer i = 128;
Integer j = 128;
System.out.println(i==j); //false
对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
new关键字在堆中生成不同的两个对象,引用i,j分别指向这两个不同的对象。 所以最后输出结果为false
String a="a";
String b="b";
String c="a"+"b";
System.out.println(a+b==c); //false
System.out.println("ab"==c); //true
前三条语句在常量池中依次创建"a" ,"b" ,"ab" ,在栈区中创建变量a,b,c 。
第四条:String c = a + b(本质就是调用了new StringBuilder().append(a).append(b).toString
所以第四条语句在堆中创建了新对象,所以第四条错误。
第五条:"ab"由于已经存在常量池中,与c相同。 所以第五条正确