String 类
-
定义:
在Java语言中,所有被双引号括住的都属于字符串,都是String类的实例;String类位于java.lang包下,提供了字符串的创建、比较、查找、截取、大小写转换等操作;字符串对象可以使用“+”连接其他对象。
-
创建字符串
方式一:
String str = "sss"; //创建字符串最简单的方式,双引号内为字符串常量,这里编译器使用该值创建了一个 String 对象。
方式二:
String str2=new String("sss"); //使用new对象的方式创建字符串
注意:
1、String类被final关键字修饰,所以不能被继承,并且它的成员方法都默认为final方法,字符串一旦创建就不能再修改。 2、String类实现了Serializable、CharSequence、 Comparable接口。 3、String实例的值是通过字符数组实现字符串存储的。
-
连接字符串:
“+”连接符原理:
Java语言为“+”连接符、对象转换为字符串提供了特殊的支持,字符串对象可以使用“+”连接其他对象,其中字符串连接是通过 StringBuilder(或 StringBuffer)类及其append 方法实现的,对象转换为字符串可以通过 toString 方法实现。 Java中使用"+"连接字符串对象时,会创建一个StringBuilder()对象,并调用append()方法将数据拼接,最后调用toString()方法返回拼接好的字符串。
“+”连接符的效率:
使用“+”连接符时,JVM会隐式创建StringBuilder对象,这种方式在大部分情况下并不会造成效率的损失,不过在进行大量循环拼接字符串时则需要注意。
-
字符串常量池(String Pool)
字符串的分配和其他对象分配一样,需要消耗时间和空间,而且字符串使用的非常多。JVM为了提高性能,在实例化字符串的时候进行了优化,即使用字符串常量池。创建字符串常量时,JVM会先检查字符串常量池,如果该字符串已经存在常量池中,就直接返回常量池中的实例引用。如果该字符串在常量池中不存在,就会实例化该字符串并且将其放到常量池中,常量池中一定不存在两个相同的字符串。
在JDK6及之前版本,字符串常量池放在Perm Gen区(也就是方法区)中;在JDK7版本中,字符串常量池被移到了堆中。
在JDK6及之前版本中,String Pool里放的都是字符串常量;在JDK7.0中,由于String.intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用。
代码举例:
String s1 = "A"; String s2 = "A"; String s3 = new String("A"); System.out.println(s1 == s2); System.out.println(s1 == s3);
常量池中不存在两个相同的对象,所以s1和s2都是指向JVM字符串常量池中的 “A” 对象。new关键字一定会产生一个对象,并且这个对象存储在堆中。所以 String s3 = new String(“A”) 产生了两个对象:保存在栈中的s3和保存堆中的String对象(其实 String s3 = new String(“A”) 一共包含三个对象:s3(栈中) 、 new String(堆中,常量池外)、 “A”(java7后在堆中常量池中,java7前在方法区中的常量池中) ,“A" 在前两个语句中已经创建好了,所以 String s3 = new String(“A”) 创建了两个对象)。