String 类
String类 : 代表字符串 。JAVA程序中的所有字符串字面值(如"abc")都作为此类的实例实现
String是一个final 类 代表不可变的字符序列
字符串是常量 ,用双引号引起来表示.它们的值在创建之后不能更改
String 对象的字符内容是存储在一个字符数组value[]中。
String : 字符串 使用一对“” 引起表示
1String 声明为final 不可被继承
2 String 实现了Serializable 接口 表示字符串是支持序列化的
3 实现了Comparable接口 表示String可以表示大小
4 .String 内部定义了 final char[] value 用于存储字符串数据
String 不可变性 体现: 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
党对现有的字符串进行连接操作时,也需要重新制定内存区域赋值 不能使用原有的value赋值
当调用String 的replace()方法 修改指定字符串时,也需要重新制定内存区域赋值 不能使用原有的value赋值。
5,通过字面量的方式 (区别于new直接赋值 例如 String s =“abc”)给一个字符串赋值,此时字符串值声明在字符串常量池
字符串常量池中是不会存储相同内容的字符串。
String的实例化方式
方式一: 通过字面量的方式
方式二: 通过new +构造器的方式
//通过字面量定义的方式 此时的s1和s2的数据javaEE声明在方法区的字符串常量池中
String s1= "javeEE";
String s2 = "javeEE";
//通过new 加构造器的方式 此时 s3 和s4 保存的地址值是数据在堆空间开辟空间以后对应的地址值
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
//(从堆空间指向共同的常量池 是两个对象所以地址不同)
System.out.println(s3==s4);//false
思考:String s = new String (“abc”) 方式创建对象 在内存中创建了几个对象?
两个: 一个堆空间的new 结构 另一个是char[]对应的 常量池中的数据“abc”
String s1 ="a";
String s2 ="b";
String s3 ="ab";
String s4 =s1+s2;
String s5 ="a"+S2;
String s6= "a"+"b";
System.out.println(s3==s6);//true
System.out.println(s3==s4);//false
System.out.println(s3==s5);//false
结论
常量与常量的拼接结果在常量池,切常量池不会存在相同内容的常量
只要其中有一个是变量 结果就在堆中
如果拼接的结果调用intern()方法 返回值就在常量池中
String 常用方法
类型 | 方法 | 作用 |
---|---|---|
int | length() | 返回字符串的长度 |
char | charAt(int index) | 返回索引处的字符 |
boolean | isEmpty() | 判断是否是空字符串 |
String | toLowerCase() | 将String中的所有字符转换为小写 |
String | toUppreCase() | 将String中所有字符转换成大写 |
String | trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
String | concat(String str) | 将指定字符串连接到此字符串的结尾 等价于用+ |
int | conparaTo(String anotherString) | 比较两个字符串大小 |
String | substring(int beginIndex) | 返回一个新的字符串 ,它是此字符串的从index开始截取到最后一个子字符串 |
String | substring(int beginIndex,int endIndex) | 返回一个新的字符串 ,它是此字符串的从index开始截取到endIndex(不包含)一个子字符串 |
boolean | endsWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
boolean | statrtWith(String preflx) | 判断此字符串是否以指定的前缀开始 |
boolean | statrtWith(String preflx,int toffset) | 测试此字符串从指定索引开始子字符串是否以指定的前缀开始 |
boolean | contains( CharSequence s) | 当且仅当此字符串包含指定的char值序列时 返回 true |
int | indexOf(String srt) | 返回指定子字符串在此字符串中第一次出现的索引 |
int | indexOf(String srt,int fromIndex) | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
int | lastIndexOf(String str) | 返回指定字符串在此字符串中最右边出现处的索引 (从后往前找 但是返回索引还是从前面数) |
int | lastIndexOf(String str,int fromIndex) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
String | replace(char oldChar,char newChar) | 返回一个新的字符串 ,它是通过newChar 替换此字符串中出现的所有oldChar得到的 |
String 和 其他结构的转换
String与基本数据类型的转换调用包装类的静态方法 parseXXX(str)
基本数据类型 转换成String ---- String,valueof()
String 与 字符数组之间转换 (char[])
String → 字符数组 String.toCharArray();
字符数组→String 调用String的构造器 new String( char[])
String 与byte[]之间的转换
编码 String → byte[] 调用String的 getBytes()方法 使用默认的字符集 进行转换
解码 调用String的构造器 new String(byte[]) 解码时要求解码使用的字符集必须与编码时使用的一致 ,否则会出现乱码
StringBuffer 和StringBuilder
String 和 StringBuffer 和StringBuilder 的异同
String : 不可变字符序列 底层使用char[]数组存储
StringBuffer 可变字符序列 线程安全的 效率偏低 底层使用char[]数组存储
StringBuilder 可变字符序列 JDK5.0新增的 线程不安全 效率高 底层使用char[]数组存储
StringBuffer sb =new StringBuffer(); char[] c =new char[16] ;底层创建了一个长度是16的char型数组
若盛不下了 则会进行自动扩容 默认扩容为原来容量的2倍+2 同时将原有数组中的元素复制到新的数组中
append();添加
sb.append("a") c[0]='a';
sb.append("b") c[1]='b';
如果 StringBuffer sb =new StringBuffer(“abc”); 相当于实在你str的长度的基础上再加16
建议使用StringBuffer( int capacity) 或StringBuild(int capacity) 指定容量 避免扩容
StringBuffer类的常用方法
方法 | 作用 |
---|---|
append() | 用于字符串拼接 |
delete(int start,int end) | 删除指定位置的内容 |
replace(int start, int end, String str) | 把【start,end) 位置替换为str |
reverse() | 把当前字符序列逆转 |
insert(int offset,xxx) | 在指定位置插入xxx |
indexof(String srt) | 跟String的一样 |
substring(int beginIndex,int endIndex) | 同上 |
length() | 同上 |
charAt(int n ) | 指定位置的字符 |
setCharAt( int n ,char ch) | 修改指定位置的字符 |
总结 :
增 append
删 delete
改 setCharAt /replace
查 charAt
长度 length
效率 StringBuilder > StringBuffer >String