字符串String
字符串是java程序中最常用的一个类;
在Java中,字符和字符串是两个不同的类型
字符串类型 String 是引用类型,Java将字符串作为String类型对象来处理,用双引号 "…" 表示字符串。理论上一个字符串可以存储0个到任意个字符;
但实际上:字符串有长度限制,在编译期,要求字符串常量池中的常量不能超过 65535,并且在javac 执行过程中控制了最大值为 65534。在运行期,长度不能超过 Int 的范围,否则会抛异常;
<参考网上的关于JVM常量池相关的文章>
字符串是不可变的
当创建一个String对象时,被创建的字符串是不能被改变的。这也就是说一旦一个String对象被创建,将无法改变那些组成字符串的字符。
String 类的所有方法都没有改变字符串本身的值,都是返回了一个新的对象。
如果需要一个可修改的字符串,应该使用 StringBuffer 或者 StringBuilder。否则会有大量时间浪费在垃圾回收上,因为每次试图修改都有新的 string 对象被创建出来。
构造方法
默认构造函数:创建空String的构造函数
String str = new String();
String类支持多种构造函数。如下:
String s1 = new String("ad");
String s2 = new String(new char[]{
b,c})
System.out.println(s1);
System.out.println(s2);
全部构造方法可以查看源码:
字符串的方法:
String类包括了50多个用于操作字符串的方法。大多数都会用到;如
获取字符串的长度:字符串的长度是指其所包含的字符的个数。调用如下的length( )方法可以得到这个值;
String s1 = new String("ad");
s1.length();提取子串:substring(int start,int end) 从一个较大的字符串提前子串
Java 中常用的替换字符的方法:replace、replaceAll 和 replaceFirst
replace(CharSequence target, CharSequence replacement) ,用replacement 替换所有的 target,两个参数都是字符串。
replaceAll(String regex, String replacement) ,用 replacement 替换所有的regex 匹配项,regex 很明显是个正则表达式,replacement是字符串。
replaceFirst(String regex, String replacement) ,基本和 replaceAll 相同,区别是只替换第一个匹配项
- 字符串比较:equals( )和 equalsIgnoreCase( )
如果两个字符串具有相同的字符和长度,它返回true,否则返回false。这种比较是区分大小写的。为了执行忽略大小写的比较,可以调用equalsIgnoreCase( )方法。当比较两个字符串时,它会认为A-Z和a-z是一样的。
搜索字符串 ·
indexOf( ) 搜索字符或子字符串首次出现。
lastIndexOf( ) 搜索字符或子字符串的最后一次出现。特殊的字符串操作
对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量初始化String对象;
String str = "abc";
由于对应每一个字符串常量,有一String对象被创建,因此在使用字符串文字的任何地方,都可以使用String对象。
通常,Java不允许对String对象进行操作; Java的编译器对字符串做了特殊照顾,可以使用 + 连接任意字符串和其他数据类型;
字符串连接的一个实际使用是当创建一个很长的字符串时,可以将它拆开,使用+将它们连接起来,避免源代码中长字符串的换行
字符串可以和其他类型的数据连接;只要+运算符的一个运算数是字符串(String)实例,编译器就将另一个运算数转换为它的字符串形式。
当Java在连接时将数据转换为其字符串形式时,它是通过调用一个由字符串(String)定义的字符串转换方法valueOf( )的重载来完成的。valueOf( )方法对所有简单的类型和类型Object重载。对于简单类型,valueOf( )方法返回一个字符串,该字符串包含了相应其被调
用的值的可读值。对于对象,valueOf( )方法调用toString( )方法。
定义字符串变量的 StringBuffer 和StringBuilder
Java 中除了定义了一个可以用来定义字符串常量的 String 类以外,还提供了可以用来定义字符串变量的 StringBuffer 类,它的对象是可以扩充和修改的。除了 StringBuffer 以外,还有一个类 StringBuilder 也可以使用,其用法和StringBuffer 类似。
StringBuffer是提供了大量的字符串功能的字符串(String)类的对等类。StringBuffer可有插入其中或追加其后的字符或子字符串。StringBuffer可以针对这些添加自动地增加空间,同时它通常还有比实际需要更多的预留字符,从而允许增加空间。
StringBuffer定义了下面三个构造函数:
- StringBuffer( )
- StringBuffer(int size)
- StringBuffer(String str)
最常用的方法append()
append( )方法将任一其他类型数据的字符串形式连接到调用StringBuffer对象的后面。对所有内置的类型和Object,它都有重载形式。
- StringBuffer append(String str)
- StringBuffer append(int num)
- StringBuffer append(Object obj)
每个参数调用String.valueOf( )方法获得其字符串表达式。结果追加在当前StringBuffer对象后面。对每一种append( )形式,返回缓冲区本身。
null值和空字符串
- 引用类型的变量可以指向一个空值 null ,它表示不存在,即该变量不指向任何对象。
- 空字符串是一个有效的字符串对象,它不等于 null
字符串池
在 JVM 中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池。
当代码中出现双引号形式(字面量)创建字符串对象时,JVM 会先对这个字符串进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回;否则,创建新的字符串对象,然后将这个引用放入字符串常量池,并返回该引用。
这种机制,就是字符串驻留或池化