每日坚持学习,即便不多,积少成多便可。
1、String是否可变?真的是不可变的吗?
一般可以回答是不可变的,因为每个字符串都有自己的内存地址。
String不可变,但是引用可变。
- String str = "Hello";
- str = str + " World";
- System.out.println("str=" + str);
结果打印:Hello World
解析:Hello字符串并没有变,只是str的引用地址从Hello 变成了 Hello World 而已。在第二行的时候,计算机给“Hello Word”开辟了个内容地址,并把str的地址引用指向了它。
所以说它可变,其实是指引用可变。
2、通过反射其实是可以修改所谓的"不可变"对象
- // 创建字符串"Hello World", 并赋给引用s
- String s = "Hello World";
-
- System.out.println("s = " + s);// Hello World
-
- // 获取String类中的value字段
- Field valueFieldOfString = String.class.getDeclaredField("value");
-
- // 改变value属性的访问权限
- valueFieldOfString.setAccessible(true);
-
- // 获取s对象上的value属性的值
- char[] value = (char[]) valueFieldOfString.get(s);
-
- // 改变value所引用的数组中的第5个字符
- value[5] = '_';
-
- System.out.println("s = " + s); // Hello_World
3、在使用 HashMap 的时候,用 String 做 key 有什么好处?
4、JDK 中常用的包有哪些?
6、数组有没有 length()方法?String 有没有 length()方法?
7、Integer a= 127 与 Integer b = 127相等吗?
如果整型字面量的值在 - 128 到 127 之间,那么自动装箱时不会 new 新的 Integer 对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1 的结果是 false
- public static void main(String[] args) {
-
- Integer a = new Integer(3);
- Integer b = 3; // 将3自动装箱成Integer类型
- int c = 3;
-
- System.out.println(a == b); // false 两个引用没有引用同一对象
- System.out.println(a == c); // true a自动拆箱成int类型再和c比较
- System.out.println(b == c); // true Integer a1 = 128; Integer b1 = 128;
- System.out.println(a1 == b1); // false Integer a2 = 127; Integer b2 = 127;
- System.out.println(a2 == b2); // true
-
- }
8、String str = new String("hello")创建了几个对象?
两个!new算一个,"hello"算一个
9、Java会存在内存泄漏吗?什么时候?
会、当有两个整数,第一个为足够大的整数、第二个为足够大的负数时,第一个减去第二个,结果会溢位,导致错误。
10、是否可以继承String类?