您的位置:首页 > 编程语言 > Java开发

java字符串

2015-12-14 23:31 232 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/STMUQI/article/details/50302409

java中常见的处理字符串的类有:String、StringBuffer、StringBuilder。

String

特点:

该类创建的字符串的值是不可变的。

常见构造方法:

String(String value)
String(char[] value)
String(char[] value,int offset,int count)

也可以通过字符串直接量定义一个字符串,如:

String s1 = "字符串直接量";

字符串创建过程

就我目前所学,对象的创建过程一般是在堆中创建对象,在栈中创建一个变量,该变量的值就是该对象的一个引用,即地址。
字符串也是一个对象,故其创建过程类似于上述。

但字符串的创建也有一些特殊的地方:
如:

String s = "abc";

该语句调用时,jvm会先判断字符串常量池中是否已有该字符串值,如果不存在,则创建新的对象,并将其存放在字符串常量池中;如果已存在该字符串,则直接返回该字符串的地址,无需再创建新对象。

但并不是所有字符串的创建过程都是如上述。
又如:

String s1 = new String("abc");

该语句调用时,jvm会在堆或栈区内而不是在常量池中创建对象。

再看两个特殊的创建方式

String s3 = "ab";
String s4 = "ab" + "c";
String s5 = s3 + "c";

这里的”+”可以串联字符串,生成新的字符串。

s4,s5的对象分别是在哪创建的呢?

s4在字符串常量池中创建(假设常量池中不存在”abc”),而s5在栈或堆区创建。
解析:
s4:“ab”和”c”在编译过程中合并为”abc”,故s4相当于使用字符串常量值创建字符串对象。
s5:因为该语句中存在s3这个变量,故s5的值必须在运行期间才能确定,故是在堆中创建的。

粗浅地谈一下字符串常量池:
就目前所了解,常量池应当是一种字符串缓冲区,在编译期确定字符串,以提高程序效率。当你通过直接值创建多个相同值的字符串时,实际上只存在一个对象在常量池中,不同的变量中存放的是同一个对象的地址,这样即减少了创建新对象的时间花费,也避免了空间上的浪费。

常见方法

1.public boolean equals(Object anObject)
该方法重写了Object 类中的equal()方法,仅当两字符串的值相等时,就返回true,不要求引用的地址相同。

2.public int length()
该方法返回字符串的长度。

3. public char charAt(int index)
该方法返回指定索引处的字符。

4. public int indexOf(int ch)
该方法返回指定字符在此字符串中第一次出现处的索引。

5. public boolean matches(String regex)
public String replaceAll(String regex, String replacement)
public String[] split(String regex)
这三个方法通过正则表达式,分别实现字符串的匹配,替换,切割。

6.public String substring(int beginIndex, int endIndex)
该方法返回一个新的字符序列,它是此序列的一个子序列。

StringBuffer与StringBuilder

特点

值可变化。

区别

StringBuffer是线程安全的,但效率较低。
StringBuilder是非线程安全的,但效率较高。

常用方法

1.append()
该方法追加各种对象于字符串中。

2.insert()
该方法在字符串指定的位置插入新的值。

3.reverse()
该方法倒置字符串。

4.setCharAt()
该方法将字符串指定位置的值设为新字符。

5.delete()
该方法删除字符串中指定的字符。

暂完

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: