String类与字符串
-
下列代码一共创建了几个对象?
String s1 = new String("abc"); String s2 = new String("abc"); //答:new了2个对象在堆区,"abc"字符串对象在字符串常量池中,一共3个对象。
-
下列情况是true还是false?
String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); String s4 = new String("hello"); // s1和s2指向方法区字符串常量池中同一块内存 System.out.println(s1 == s2);// true // s1指向常量池中的内存,s3指向堆中内存 System.out.println(s1 == s3);// false // s3和s4指向堆中不同的内存 System.out.println(s3 == s4);// false // s3和s4的内容相等 System.out.println(s3.equals(s4));// true
-
关于返回值为String类型的方法
Integer a = 1000; Integer b = 1000; Integer c = 2000; // 等价String s1 = new String(a.toString()); String s1 = a.toString(); // 等价String s2 = new String(b.toString()); String s2 = b.toString(); // 等价String s3 = new String(c.toString()); String s3 = c.toString(); // s1、s2、s3都指向不同的堆内存地址,所以为false System.out.println(s1 == s2);// false System.out.println(s1 == s3);// false
包装类
关于自动装箱和拆箱、包装类之间判等问题
-
自动装箱条件:用基本数据类型直接给对应包装类赋值。
-
自动拆箱条件:
(1) 包装类型与基本数据类型进行运算。
(2) 包装类型与包装类型直接进行运算(除==
外)。 -
关于整数型常量池:
java中为了提高程序的执行效率,将[-128, 127]之间所有包装类对象提前创建好了,放到了方法区的“整数型常量池”中(类比“字符串常量池”),只要使用这个区间的数据,那么包装类的引用不会指向堆区,而是直接指向“整数型常量池”中已存在的数据。
Integer a = 1000;
Integer b = 1000;
Integer c = 2000;
// 没有自动拆箱,比较的是引用指向的堆区的内存地址
System.out.println(a == b);// false
// 包装类型和基本数据类型运算,自动拆箱
System.out.println(a == 1000);// true
System.out.println(a < 2000);// true
// 包装类与包装类运算,自动拆箱
System.out.println(a < c);// true
// 先自动拆箱为基本数据类型,然后基本数据类型与包装类型判等(自动拆箱)
System.out.println(a + b == c);// true
System.out.println(a + 1000 == c);// true
Integer a = 128;
Integer b = 128;
Integer c = 127;
Integer d = 127;
// 128超过了[-128,127]区间取值,所以创建包装类对象时a,b引用指向的是堆区不同内存地址
System.out.println(a == b);// false
// 127在[-128,127]区间内,所以c,d引用指向是方法区的"整数型常量池"中同一个数据的内存地址
System.out.println(c == d);// true
集合
Collection<String> c = new ArrayList<>();
String s1 = "abc";
String s2 = "def";
String s3 = "abc";
c.add(s1);
c.add(s2);
System.out.println(c.contains(s3));// true
System.out.println(c.remove(s3));// true
System.out.println(c.contains(s1));// false
-
关于Collection集合中的
contains()
方法使用该方法时,其底层在比较元素时,会调用
equals()
方法,意味着比较的是集合中元素的内容而不是内存地址(前提是该元素的类重写了equals()
方法),所以只要存储在集合中的元素的内容和要查找的元素的内容一致,则会判定为同一个元素,元素属于该集合。 -
关于Collection集合中的
remove()
方法使用该方法时,其底层在比较元素时,也会调用
equals()
方法,原理同上,只要传入的元素的内容和集合中元素的内容相等,那么就会判定为同一个元素,相应的元素就会被删除。
IO流
拷贝含中文字符的文件时出现乱码问题