解析:true。当整数值在 [ -128, 127 ] 范围内时,下列代码结果始终为true:
Integer a = 5;
Integer b = 5;
System.out.println(a == b);
原因:当执行 Integer x = 5 时,Java采用自动装箱功能,实际上编译器执行了Integer.valueOf(5)的操作。这个方法返回一个 Integer 对象,但是在返回之前,先作一个判断,判断当前 i 的值是否在 [-128,127] 区间内,且 IntegerCache 中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新的对象。
public static Integer valueOf (int i)的官方注释如下:
If an new Integer instance is not required, this method should generally be used in preference to the constructor Integer(int), as this method is likely to yield significant better space and time performance by caching frequently requested values. This method will always cache values in the range -128 to 127,inclusive, and may cache other values outside of this range.
如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来产生明显更好的空间和时间性能。 此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
因此,当 i 值在 [-128,127] 区间内,相应的对象已经存在了,所以会直接返回已存在对象的引用,而不会创建新的对象。因此,a == b 的结果为true;而当 i < -128 或 i > 127 时,则每次调用valueOf方法,会创建新的对象,此时 a==b结果为false。
解析:false。不论整数值是多少,下列代码结果永远为false:
Integer a = new Integer(23);
Integer b = new Integer(23);
System.out.println(a == b);
因为new Integer(23)创建的是新的对象,a 和 b 永远是不同的引用。不过,比较a和b的数值是否相等,应该用equals方法。
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a == b); //输出false
System.out.println(a.equals(b)); //输出true
重要参考:包装类介绍
char[] ch = {'C','S','D','N'};
String s1 = new String(ch);
String s2 = String.valueOf(ch);
String s3 = Arrays.toString(ch);
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
System.out.println("s3: " + s3);
结果为:
s1: CSDN
s2: CSDN
s3: [C, S, D, N]
总结:如果只是单纯要把char[]里面的字符内容转为String的话,不能用Arrays.toString()方法,会额外生成括号和逗号!
String[] a = {"hello", "world"};
String[] b = {"hello", "world"};
System.out.println(Arrays.equals(a,b));
>> true
String a = "hello";
String b = "he" + "llo";
System.out.println(a == b);
>> true
---------------------------------
String a = "hello";
Stirng b = "hello";
System.out.println(a == b);
>> true
Note:String类型的对象与其他类(如:Student类)不同,字符串第一次生成的时候会被存放在“常量池”中,所以生成两个相同的字符串a和b,会有a == b 是“true”。需要特别记住。
情况一:
String a = "abc";
String b = "abc";
System.out.println(a == b);
>>
true
情况二:
String a = "abc";
char[] chars = {'a','b','c'};
String b = new String(chars);
System.out.println(a == b);
>> false
System.out.println(a.equals(b));
>> true
解释:关于何时字符串在常量池中,何时不在常量池中——
1) 只有直接用双引号"abc"写的字符串才在字符串常量池中
2) new出来的字符串不在字符串常量池中
1 子类可以调用父类中的静态方法
public class Animal {
public static void fun() {
System.out.println("父类静态方法");
}
}
class Dog extends Animal {
}
Dog dog = new Dog();
dog.fun(); //正确,子类可以调用父类的静态方法
2 接口的实现类不可以调用接口中的静态方法,只能接口自己调用
public interface Jiekou {
public static void method() {
System.out.println("接口的静态方法");
}
}
class Shixian implements Jiekou {
}
Shixian sx = new Shixian();
//sx.method(); 错误,接口的实现类不能直接调用接口的静态方法
Jiekou.method(); //正确,接口可以调用自己的静态方法