一.String类的常用方法
1. int indexOf(String s) 字符串查找
2. int lastIndexOf(String str) 3. char charAt(int index) 获取指定索引位置的字符 4. String substring(int beginIndex) 获取子字符串
5. String substring(int beginIndex, int endIndex) 6. String trim() 去除空格 7. boolean startsWith(String prefix) 判断字符串的开始与结尾
8. boolean endsWith(String suffix) 9. boolean equals(String otherstr) 判断字符串是否相等
10. boolean equalsIgnoreCase(String otherstr) 11. int compareTo() 按字典顺序比较两个字符串
12. String toLowerCase() 字母的大小写转换
13. String toUpperCase()
14. String[] split(String regex) 字符串分割
15. String[] split(String regex, int limit) 16. static String valueOf(boolean,char(char[]),int,long,float,double,Object) 得到各种类型的字符串表示 17. String intern() 为每一个唯一的字符序列生成一个且仅生成一个String引用,intern:放入的意思,放入常量池
二.String类的特性
在 JAVA 语言中有8中基本类型和一种比较特殊的类型String
。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。8种基本类型的常量池都是系统协调的,String
类型的常量池比较特殊。它的主要使用方法有两种:
- 直接使用双引号声明出来的
String
对象会直接存储在常量池中。 - 如果不是用双引号声明的
String
对象,可以使用String
提供的intern
方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中
String 有 3 个基本特点:
1. 不变性(只读特性);
2. 针对常量池的优化;
3. 类的 final 定义。
不变性指的是 String 对象一旦生成,则不能再对它进行改变。String 的这个特性可以泛化成不变 (immutable) 模式,即一个对象的状态在对象被创建之后就不再发生变化。不变模式的主要作用在于当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅提高系统性能。
针对常量池的优化指的是当两个 String 对象拥有相同的值时,它们只引用常量池中的同一个拷贝,当同一个字符串反复出现时,这个技术可以大幅度节省内存空间。
String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。(外部(例如重新赋值)和内部修改都是重新创建了一个新的String对象)
为什么不变?源码分析:
String 对象可以认为是 char 数组的延伸和进一步封装,它主要由 3 部分组成:char 数组、偏移量和 String 的长度。char 数组表示 String 的内容,它是 String 对象所表示字符串的超集。String 的真实内容还需要由偏移量和长度在这个 char 数组中进行定位和截取。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[]; /** The offset is the first index of the storage that is used. */
private final int offset; /** The count is the number of characters in the String. */
private final int count; /** Cache the hash code for the string */
private int hash; // Default to 0
Java7中略有改变:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; /** Cache the hash code for the string */
private int hash; // Default to 0
在JDK7中,只有一个value变量,也就是value中的所有字符都是属于String这个对象的
三.编译器对String的优化
1.用于String的“+”与“+=”是Java中仅有的两个重载过的操作符
2.重载“+”与StringBuilder
当String对象之间通过“+”连接时,编译器自动引入了java.lang.StringBuilder类。虽然我们在源码中没有使用StringBuilder类,但是编译器却自作主张地使用了它,因为它更高效。