码迷,mamicode.com
首页 > 其他好文 > 详细

String

时间:2016-09-03 09:41:13      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

String是Java中最常用的存储字符型数据的类,被final修饰,无法被继承且字符串长度无法修改,维护在常量池中(常量池属于方法区的一部分)。

1. 初始化方式

String主要有两种初始化方式

  1)String str = "abc";

这是一种最基本的初始化方式,过程如下:

① 首先在常量池中查找是否存在abc的字符串对象

② 若不存在则在常量池中创建abc字符串对象,并让引用指向该对象

③ 若存在则直接让引用指向该对象

  2)String str = new String("abc");

① 首先在堆中创建一个abc字符串对象,并让引用指向该对象

② 查找常量池中是否存在abc字符串对象

③ 若存在,则将堆中的abc字符串对象和常量池的abc字符串对象关联起来

④ 若不存在,则在常量池中创建一个,并与堆中abc字符串对象关联起来

这里经常会有面试题问道:String str = new String("abc"); 总共创建了几个对象?

通过上面分析应该知道,得先看常量池中有没有abc,若有则创建一个,若没有则两个。

2. 常用API

boolean equals(String str); // 比较字符串是否相同,区分大小写

boolean equalsIgnore(String str); // 比较字符串是否相同,不区分大小写

String toLowerCase(); // 字符串的字符全部变成小写

String toUpperCase(); // 字符串的字符全部变成大写

String trim(); // 去除字符串两边的空格(包括\n等特殊符号)

boolean startsWith(String str); // 判断字符串是否以str开头

boolean startsWith(String str, int from); // 判断字符串是否以str开头,从下标from开始

int length(); // 计算字符串长度

int indexOf(String str); // 返回字符串中第一次出现str的位置,不存在返回-1

int indexOf(String str, int from); // 返回字符串中第一次出现str的位置,从下标from开始,不存在返回-1

int lastIndexOf(String str); // 返回字符串中最后一次出现str的位置,不存在返回-1

char charAt(int index); // 返回字符串下标index位置的字符

String substring(int start, int end); // 截取下标start到end位置的字符串,不含end

String substring(int start); // 截取下标start到最后位置的字符串

String[] split(String rex); // 用给定正则表达式拆分字符串,返回拆分后的数组

  // 如果字符串末尾拆分出来的都是空字符串,则会全部去除,例"a@b@@@",以@做分隔符,拆分结果[a, b],后面多余的空字符串全部移除

String[] split(String rex, int limit); // 用给定正则表达式拆分字符串,限制拆分为limit项,返回拆分后的数组

	// ① 若limit < 0 || limit >= 拆分结果总项,则保留空字符串,例"a@b@@",假设limit为-1或5,则拆分结果为[a, b, , ]

	// ② 若limit > 0 && limit < 拆分结果总项,假设limit为2,则拆分结果为[a, b@@]

String replace(String old, String new); // 将字符串中的old全部替换成new

String replace(char old, char new); // 同上,只不过替换字符

String replaceAll(String rex, String new); // 替换所有满足正则的子串

String replaceFirst(String rex, String new); // 替换第一个满足正则的子串

boolean matches(String rex); // 判断是否满足正则

char[] toCharArray(); // 转换为字符数组

byte[] getBytes(String charsetName); // 使用指定编码转成字节数组

3. StringBuffer/StringBuilder

可变长字符串,一般用于频繁操作字符串的场景下,避免不停创建字符串导致常量池内存溢出。

StringBuffer和StringBuilder的API完全相同,但StringBuffer线程安全,StringBuilder线程不安全,StringBuffer性能比StringBuilder会差一些。

相关API和String非常类似,比如substring,indexOf等都是有的,不重复列举,以下是不同部分

StringBuffer append(str); // 追加str

StringBuffer delete(int start, int end); // 删除start到end部分,不含end

StringBuffer replace(int start, int end, String new); // 将start到end位置子串替换成new

StringBuffer insert(int index, String str); // 在下标index位置插入str,其他字符向后移位

StringBuffer reverse(); // 反转字符串

String toString(); // 转换成字符串

4. 总结

字符串操作并不难,掌握常用API基本能得心应手,还有一些第三方的jar包封装了更强大的字符串操作功能,需要时再去了解即可。

一般情况下建议使用StringBuffer/StringBuilder来处理字符串,一方面是能够节约内存,另一方面是培养良好的编程习惯,最大程度的在代码层面优化。

我们去查看一些开源框架源码或者JDK的时候,往往底层复杂的字符串操作都是使用StringBuffer/StringBuilder去处理,很少使用直接的字符串相加。

String

标签:

原文地址:http://www.cnblogs.com/windyrain/p/5828256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!