String、StringBuilder以及StringBuffer(重点)
1.String
1.概述:Java程序中的所有字符串文本(例如“abc”)都是此类的实例。
2.创建方式:
String str1 = “Hello”;
String str2 = new String(“World”);
二者创建区别:
String str1 = “Hello”;首先在字符串常量池中查找有没有“Hello”,如果有则直接从字符串常量池中引用;如果没有则在字符串常量池中创建"Hello",并指向其引用。
String str2 = new String(“World”); 首先在字符串常量池中查找有没有“World”,如果有在堆内存中创建一个字符串对象,并指向常量池中的"World";即只在堆内存中创建了一个对象;如果在字符串常量池中没有找到"World",则在字符串常量池中创建"World",并在堆内存中创建对象指向字符串常量池;
示例:
String str1 = “Hello”;
String str2 = "Hello";
String str3 = new String(“Hello”);
System.out.println(str1==str2); //true ==比较的内存地址
System.out.println(str1==str3); //false
即使用直接创建方式创建字符串,最多创建一个对象;而使用new的方式创建则是创建了一个或两个,凡是new都会在堆内存中开辟新空间;所以str1==str3为false。
字符串常量池(String Pool):
字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能。
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化。为字符串开辟一个字符串常量池,类似于缓存区,创建字符串常量时,首先坚持字符串常量池是否存在该字符串,存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中。ps:编译期就已经存在。
String不可变的原因:
public final class String
private final char value[]; //底层源码
使用final修饰保证内存地址不可变;再使用private修饰极大的保证其封装性不被破坏;且不可被继承。
ps:jdk1.8后底层实现为byte数组
常用方法
方法名 | 作用 |
---|---|
public char charAt(int index) | 根据下标获取字符 |
public boolean contains(String str) | 判断当前字符串中是否包含str |
public char[] toCharArray() | 将字符串转换成数组。 |
public int indexOf(String str) | 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1 |
public int length() | 返回字符串的长度 |
public String trim() | 去掉字符串前后的空格 |
public String toUpperCase() | 将小写转成大写 |
public boolean endsWith(String str) | 判断字符串是否以str结尾 |
public String replace(char oldChar,char newChar) | 将旧字符串替换成新字符串 |
public String[] split(String str) | 根据str做拆分 |
public String subString(int beginIndex,int endIndex) | 在字符串中截取出一个子字符串 |
2.可变字符串StringBuilder,StringBuffer
1.概述:可在内存中创建可变的缓冲空间,存储频繁改变的字符串,也称字符串缓冲区。
2.创建方式:
String str1 = new StringBuilder("hello");
3.常用方法
方法名 | 作用 |
---|---|
public StringBuilder append(String str) | 追加内容。 |
public StringBuilder insert(int dstOffset, CharSequence s) | 将指定 字符串插入此序列中。 |
public StringBuilder delete(int start, int end) | 移除此序列的子字符串中的字符 |
public StringBuilder replace(int start, int end, String str) | 使用给定字符串替换此序列的子字符串中的字符。start开始位置、end结束位置 |
public int length() | 返回长度(字符数) |
3.三者区别
Sring一旦创建不可修改,StringBuilder,StringBuffer可以修改(即内存地址可改变)。
执行效率:
StringBuilder>StringBuffer>Sring
StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。