字符串类型的特点
- 1、不能被继承
- 因为String是final修饰的类
- 2、字符串对象是常量对象,一旦创建就不能修改,一旦修改就是新对象
- 3、因为字符串对象是常量对象,那么可以共享,字符串常量对象是在常量池中
- 常量池在哪里
- JDK1.6,方法区
- JDK1.7,堆
- JDK1.8,元空间
- 常量池在哪里
- 4、任何字符串字面量都是String的对象
- 5、字符串底层使用字符数组存储
- 6、字符数组是private final修饰符
拼接和比较
- 1、创建对象的个数
- String str1 = “hello”;
String str2 = “hello”;- 一个,在常量池
- String str1 = new String(“hello”);
String str2 = new String(“hello”);
- String str1 = “hello”;
- 三个
- 一个在常量池
- 两个在堆中
- 一个在常量池
- 2、拼接和比较
- 原则:+两边都是常量,结果也是常量,+两边有一个是变量,结果就不是常量,在堆中,如果结果使用了intern(),那么是常量
@Test
public void test3(){
String str1 = “hello”;
String str2 = “java”;
String str3 = “hellojava”;
String str4 = “hello” + “java”;//常量与常量拼接,还是常量
String str5 = “hello” + str2;//常量与变量拼接,结果在堆中
String str6 = str1 + str2;//变量与变量拼接,结果也在堆中
System.out.println("str3 == str4 " + (str3 == str4));//true
System.out.println("str3 == str5 " + (str3 == str5));//false
System.out.println("str3 == str6 " + (str3 == str6));//false
final String str7 = “hello”;
final String str8 = “java”;
String str9 = str7 + str8;//常量与常量拼接
System.out.println("str3 == str9 " + (str3 == str9));//true
String str10 = (str1 + str2).intern();//intern()的结果放常量池
System.out.println(str3 == str10);//true
}
- 原则:+两边都是常量,结果也是常量,+两边有一个是变量,结果就不是常量,在堆中,如果结果使用了intern(),那么是常量
常用的方法
- 1、基本方法
- (1)int length()
- 返回字符串的长度,即字符的个数
- (2)字符串的比较
- boolean equals(String other)
- this和other进行内容比较
- 对Object的equals进行重写
- 严格区分大小写
- boolean equalsIgnoreCase(String anotherString)
- this和anotherString进行内容比较
- 不区分大小写
- 自然排序
- public int compareTo(String anotherString)
- 如果是ASCII范围内,按照ASCII值的顺序
- public int compareTo(String anotherString)
- 定制排序
- java.text.Collator
String str3 = “中国”;//Z
String str4 = “美国”;//M
//如果想要按照字典顺序
//找定制排序,实现了java.util.Comparator接口,重写int compare(String s1,String s2)
//java.text.Collator
Collator c = Collator.getInstance();
int result = c.compare(str3, str4);
System.out.println(result);//中 > 美
- java.text.Collator
- boolean equals(String other)
- (3)去掉前后空格
- String trim()
- (4)转大小写
- String toUpperCase()
- public String toLowerCase()
- (5)是否是空字符串
- 方式一
- “”.equals(字符串)
- 方式二
- isEmpty()
- 方式一
- (1)int length()
- 2、和字节相关
- 编码:把字符串转成字节数组
- byte[] getBytes()
- 平台默认编码方式进行编码
- byte[] getBytes(字符编码方式)
- 按照指定的编码方式
- byte[] getBytes()
- 解码:把字节数组转成字符串
- new String(byte[])
- new String(byte[],int offset, int length)
- new String(byte[], 字符解码方式)
- 乱码
- (1)编码方式与解码方式不一致
- (2)缺字节
- 编码:把字符串转成字节数组
- 3、和字符相关
- 把字符串转字符数组
- char[] toCharArray()
- 把字符数组转字符串
- new String(char[])
- new String(char[],int offset, int count )
- 取指定位置的字符
- char charAt(index)
- 把字符串转字符数组
- 4、是否以xx开头和结尾
- boolean startsWith(xx)
- boolean endsWith(xx)
- 5、字符串截取
- String subString(int start)
- 从[start,最后]
- String subString(int start, int end)
- 从[start,end)
- String subString(int start)
- 6、拆分
- String[] split(支持正则)
- 7、查找
- 是否包含
- boolean contains(子串)
- 查找索引位置
- int indexOf(xxx)
- 如果存在返回索引
- 如果不存在返回-1
- int lastIndexOf(xx)
- int indexOf(xxx)
- 是否包含
- 8、替换
- String replace(目标子串, 新子串)
- String replaceAll(目标子串, 新子串)
- 支持正则
- String replaceFirst(目标子串, 新子串)