public final class String implements java.io.Serializable, Comparable, CharSequence { private final char value[]; ... }
- String类是final的,不可被继承。String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小。String内部定义了final char[] value用于存储字符串数据,也就是说String的值是不可变的,具体体现在:
1)当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
2)当对现有的字符串进行连接 *** 作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
3) 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
String的实例化方式有如下两种:
- 通过字面量定义的方式
此时的字符串值声明在字符串常量池中。
String s1 = "abc"; String s2 = "abc"; System.out.println( s1== s2);//true
字符串常量池中是不会存储相同内容的字符串的,而s1和s2都是字符串常量池中字符串“abc”的引用,因此二者相等。
- 通过new + 构造器的方式
String s1 = new String ("abc"); String s2 = "abc"; System.out.println( s1== s2);//falsle
new的对象在堆里,因此二者不同。
String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
String构造器方法
//本质上this.value = new char[0]; String s1 = new String(); //this.value = original.value; String s2 = new String(String original); //this.value = Arrays.copyOf(value, value.length); String s3 = new String(char[] a); String s4 = new String(char[] a,int startIndex,int count);
各种场景内存分析
String s1 = "hello"; String s2 = "java"; String s3 = "hellojava"; String s4 = "hello" + "java"; String s5 = s1 + "java"; String s6 = "hello" + s2; String s7 = s1 + s2; System.out.println(s3 == s4);//true System.out.println(s3 == s5);//false System.out.println(s3 == s6);//false System.out.println(s3 == s7);//false System.out.println(s5 == s6);//false System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false String s8 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“hellojava” System.out.println(s3 == s8);//true
常量(包括用final声明的常量)与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。只要其中有一个是变量,结果就在堆中。如果拼接的结果调用intern()方法,返回值就在常量池中 String的常用方法
int length():返回字符串的长度: return value.length char charAt(int index): 返回某索引处的字符return value[index] boolean isEmpty():判断是否是空字符串:return value.length == 0 String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写 String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写 String trim():返回字符串的副本,忽略前导空白和尾部空白 boolean equals(Object obj):比较字符串的内容是否相同 boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大 小写 String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+” int compareTo(String anotherString):比较两个字符串的大小 String substring(int beginIndex):返回一个新的字符串,它是此字符串的从 beginIndex开始截取到最后的一个子字符串。 String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。 boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始 boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始 boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列 时,返回 true int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引 int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 注:indexOf和lastIndexOf方法如果未找到都是返回-1 String replace(char oldChar, char newChar):返回一个新的字符串,它是 通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 String replace(CharSequence target, CharSequence replacement):使 用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 String replaceAll(String regex, String replacement) : 使 用 给 定 的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 String replaceFirst(String regex, String replacement) : 使 用 给 定 的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。 String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。 String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此 字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。String与基本数据类型、包装类之间的转换
String --> 基本数据类型、包装类:
调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类–> String:
调用String重载的valueOf(xxx)
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器 String(char[])
编码:String --> byte[]:调用String的getBytes()
解码:byte[] --> String:调用String的构造器String(byte[], charsetName)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)