Java笔记(2) - String相关

(1) 字符串的内容永不可改变

   因为在 String类 中, value 的修饰符为 final

(2) 所有双引号包起来的字符串,都是 String类 的对象

(3) 由于 String 不可改变,所以字符串可共享使用


字符串常量池:

直接用双引号写的字符串在字符串常量池中

但是用 new String(byte[] / char[]) 的字符串不在字符串常量池中。是新建的一个对象


字符串比较:

对于基本类型来说,== 比较数值

对于引用类型来说,== 比较地址


Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String x1 = "abc";
char[] c = {'a','b','c'};
String x2 = new String(c);
String x3 = "ABC";

//直接使用 == 进行字符串比较。比较的是这两个引用类型变量的地址值
System.out.println(x1==x2); //输出 false
//使用 String类 的 equals 方法进行字符串比较
//但是这个方法容易报空指针异常
System.out.println(x1.equals(x2)); //输出 true
//使用 Objects类 的 equals 方法进行字符串比较
//这个方法空指针安全
System.out.println(Objects.equals(x1,x2)); //输出 true
//忽略字符串大小写进行比较
//如果要用 String类 下的方法,建议将常量放左边,比较变量放右边
System.out.println("abc".equalsIgnoreCase(x3)); //输出 true

字符串拼接

由于在 String类 中,value的修饰符是 final。所以每个字符串都像个常量不可改变。

所以在 java 中进行字符串拼接,尤其是多个字符串拼接在一起时,就会产生效率的问题:


Demo:

1
String x = "a"+"b"+"c";

在这一段代码中, Java 的执行流程为

  1. 在内存中存放三个字符串: a, b, c
  2. 拼接 a 和 b。在内存中存放新字符串 ab
  3. 拼接 ab 和 c。在内存中存放新字符串 abc

这样子的拼接方式效率就很低了。并且造成许多内存空间的浪费


Java中有两个类 StringBuilder 和 StringBuffer ,顾名思义,它们是作为字符串操作的缓冲。

其中 StringBuilder 是非线程安全。StringBuffer 是线程安全的


Demo:

1
2
3
StringBuilder x3 = new StringBuffer();
x3.append("a").append("b").x3.append("c");
System.out.println(x3.toString()); //输出 abc

比较下效率:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String x1 = null;
StringBuilder x2 = new StringBuilder();
StringBuffer x3 = new StringBuffer();
System.out.println(x3.toString());

long start = System.currentTimeMillis();
for (Integer i=0;i<100000;i++){
//通过开关注释来比较运行时间
x1 += i.toString(); //运行时间 2659毫秒
// x2.append(i.toString()); //运行时间 14毫秒
// x3.append(i.toString()); //运行时间 18毫秒
}
long end = System.currentTimeMillis();
System.out.println(end-start);

字符串转换


基本类型 转 字符串。最简单的方式:

1
基本类型 + ""

字符串转基本类型:

1
2
3
Integer.parseInt("123");
Double.parseDouble("3.14");
//其他类型同理可得