(资料图片仅供参考)
一、字符串相关的类
1.String
String的特性
String类:代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作 为此类的实例实现。String是一个
final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。String对象的字符内容是存储在一个字符数组value[]中的。
public final class String implements java.io.Serializable, Comparable, 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
String s1 = "abc";//字面量的定义方式String s2 = "abc";s1 = "hello";
string对象的创建
String str = "hello";//本质上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 str1 = “abc”;与String str2 = new String(“abc”);的区别?
字符串常量存储在 字符串常量池,目的是共享字符串非常量对象 存储在堆中。
练习1
String s1 = "javaEE";String s2 = "javaEE";String s3 = new String("javaEE");String s4 = new String("javaEE");System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//falseSystem.out.println(s1 == s4);//falseSystem.out.println(s3 == s4);//false
字符串对象是如何存储的
字符串特性
结论
常量与常量的拼接结果再常量池。且常量池中不会存在相同内容的常量。只要其中有一个是变量,结果就在堆中如果拼接的结果调用intern()方法返回值就在常量池中
String使用陷阱
String s1 = "a";说明:在字符串常量池中创建了一个字面量为"a"的字符串。s1 = s1 + "b";说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响 程序的性能。String s2 = "ab"; 说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。String s3 = "a" + "b";说明:s3指向字符串常量池中已经创建的"ab"的字符串。String s4 = s1.intern();说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串 赋值给s4。
String常用方法
int length():返回字符串的长度: return value.lengthchar charAt(int index): 返回某索引处的字符return value[index]boolean isEmpty():判断是否是空字符串:return value.length == 0String 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 值序列 时,返回 trueint indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后 一次出现处的索引,从指定的索引开始反向搜索注:indexOf和lastIndexOf方法如果未找到都是返回-1String 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 str = "12hello34world5java7891mysql456"; //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉 String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", ""); System.out.println(string);
String str = "12345"; //判断str字符串中是否全部有数字组成,即有1-n个数字组成 boolean matches = str.matches("\\d+"); System.out.println(matches); String tel = "0571-4534289"; //判断这是否是一个杭州的固定电话 boolean result = tel.matches("0571-\\d{7,8}"); System.out.println(result);
String str = "hello|world|java";String[] strs = str.split("\\|");for (int i = 0; i < strs.length; i++) {System.out.println(strs[i]);}System.out.println();String str2 = "hello.world.java";String[] strs2 = str2.split("\\.");for (int i = 0; i < strs2.length; i++) {System.out.println(strs2[i]);}