- 字符串相关类: String, StringBuffer, StringBuilder
- JDK8之前时间的API: System静态方法, Date类, Calendar类, SimpleDateFormat类
- JDK8中新日期时间的API: LocalDate, LocalTime, LocalDateTime, Instant, DateTimeFormat…
- Java比较器
- Comparable接口, Comparator接口
- System类
- Math类
- BigInteger和BigDecimal
String类
- 代表字符串,使用“ ”引起来表示
- String类是一个final类, 不可被继承
- String实现了Serializable接口:表示字符串是支持序列化的
- String实现了Comparable接口,表示String可以比较大小
- String内部定义了 final char[ ] value用于存储字符串数据
- String 代表不可变的字符串序列
- 通过字面量(区别于new方式)给字符串赋值,此时字符串值声明在方法区的字符串常量池中,字符串常量池中不会存储相同内容的字符串
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有value赋值
- 当对现有字符串进行连接操作时,也需要重新指定内存区域,不能在原有value上赋值
- 使用replace() 修改或替换指定字符时。也会重新指定内存区域
@Test
public void stringTest1() {
String s1 = "abc";
String s2 = "abc";
s1 = "hello";
System.out.println(s1 == s2);
System.out.println(s1);
System.out.println(s2);
String s3 = "abc";
s3 += "def";
System.out.println(s3);
System.out.println(s2);
String s4 = "abc";
String s5 = s4.replace('a', 'm');
System.out.println(s4);
System.out.println(s5);
}
一、String的实例化方式
- 通过字面量定义的方式
- 通过new + 构造器的方式
@Test
public void stringTest2() {
String s1 = "java1";
String s2 = "java1";
String s3 = new String("java1");
String s4 = new String("java1");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s4);
System.out.println(s3 == s4);
Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);
System.out.println(p1.name == p2.name);
System.out.println(p1.name.equals(p2.name));
p1.name = "Jerry";
System.out.println(p2.name);
}
- 字符串常量存储在字符串常量池中,目的是共享
- 字符串非常量对象存储在堆中
- String s = new String(“abc”); 创建了几个对象?
- 两个。①在堆空间new的结构 ②其次是char[ ] 对应的常量池中的数据
@Test
public void stringTest3() {
String s1 = "JavaEE";
String s2 = "Hadoop";
String s3 = "JavaEEHadoop";
String s4 = "JavaEE" + "Hadoop";
String s5 = s1 + "Hadoop";
String s6 = "JavaEE" + s2;
String s7 = s1 + s2;
System.out.println(s1 == s3);
System.out.println(s2 == s3);
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3 == s6);
System.out.println(s5 == s6);
System.out.println(s4 == s7);
}
- 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
- 只要其中有一个是变量,结果就在堆中
- 如果拼接的结果调用intern()方法,返回值就在常量池中
@Test
public void stringTest6() {
String s1 = "JavaEEHadoop";
String s2 = "JavaEE";
String s3 = s2 + "Hadoop";
System.out.println(s1 == s3);// false
final String s4 = "JavaEE";
String s5 = s4 + "Hadoop";
System.out.println(s1 == s5);// true
}
两种实例化方式内存对比
@Test
public void stringTest4() {
String s = "0";
for (int i = 1; i < 5; i++) {
s += i;
}
System.out.println(s);
}
01234
@Test
public void stringTest5() {
String s = new String("0");
for (int i = 1; i < 5; i++) {
s += i;
}
System.out.println(s);
}
01234