常用类库 - String/Character
用于操作字符和字符串
一、String类
String(Java SE 11 & JDK 11)
String类表示字符串,所有字符串都是此类的对象。
概述:
字符串是不变的,它们的值在创建后无法更改,因为字符串实际上是用一串字符char[]来存储的,而数组长度一经确定则无法更改,所以字符串创建后就无法更改了。基于字符串不变的原理,当两个字符串内容相同,则它俩采用同一块内存地址。
public static void main(String[] args) {
String text = "123123";
String text2 = "123123";
System.out.println(text == text2); //true
}
众所周知,==号比较的是内存地址,所以两个内容相同的字符串采用同一块内存地址。但是,也有例外,如果明确的通过new来创建字符串,则会在内存中新开辟空间,即使字符串内容相同,他们的内存地址也是不相同的。
public static void main(String[] args) {
String text = "123123";
String text2 = new String("123123");
System.out.println(text == text2); //false
}
字符串常量池:
1.方法区:
方法区(Method Area),又称永久代(Permanent Generation),常称为PermGen,位于非堆空间,又称非堆区(Non-Heap space)。
方法区是被所有线程共享的。
所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。
2.堆(heap):
一个jvm实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把、类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。
堆在逻辑上分为三部分(perm):
新生代(Young generation,常称为YoungGen):刚创建的对象存在新生代,新生代GC机制是不一样的,GC进行的特别快。
老年代(Old Generation,常称为OldGen、TenuringGen):如果一个对象经过15次垃圾回收都没有被回收掉,这个对象会进入老年代,GC进行的比较慢。
永久代(Permannent):不会被垃圾回收,类、方法、常量以及静态修饰的所有东西,每一个字符串对象的创建都会放入永久代。
这样一来,使用+号拼接字符串,拼接的字符串虽然变成了内存垃圾,但是由于它们在永久代中不会被回收,就会导致大量的内存空间被浪费,那么如何拼接字符串才能解决这个问题呢?
3.拼接字符串:
如果需要字符串拼接,应该使用StringBuilder或StringBuffer,即可变字符序列,他们的内部实现差不多,主要区别在于StringBuffer是线程安全的实现(多个线程不能同时操作,效率低),而StringBuilder线程不安全的实现(多个线程可以同时操作,效率高)。
首先通过无参的构造方法构造一个StringBuilder或StringBuffer,其内部有一个长度为16的字符数组用于存数据,可以使用append()方法往字符数组中加数据,然后通过toString()转换为字符串输出,当字符数组容量存满后,会动态扩容。通过这种方式实现字符串在内存中没有进行缓存,每次拼接产生的内存垃圾都会及时的被回收。
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("1");
sb.append("2");
sb.append("3");
String text = sb.toString();
System.out.println(text);
}
StringBuffer和StringBuilder的使用方式一致,不再演示。这种拼接方式虽然没有+号拼接简单,但是它更节省内存,是我们更应该使用的字符串拼接方式。
构造方法:
1.String()
创建一个新的空的字符串。
2.String(byte[] bytes)
传字节数组,创建不指定编码的字符串。
3.String(byte[] bytes, String charsetName)
传入一个字节数组再传一个字符编码,创建指定编码的字符串。
4.String(char[] value)
传字符数组,创建不指定编码的字符串。
常用方法:
1.charAt(int index)
传入一个下标,返回字符串里面的某一个字符。
2.compareTo(String anotherString)
两个字符串按字典顺序进行比较,前者大返回int正数,相同返回0,前者小返回int负数。
System.out.println("123".compareTo("123")); //0
System.out.println("123".compareTo("456")); //-3
System.out.println("456".compareTo("123")); //3
3.compareToIgnoreCase(String str)
两个字符串忽略大小写按字典顺序进行比较,前者大返回int整数,相同返回0,前者小返回int负数。
System.out.println("abc".compareToIgnoreCase("abc")); //0
System.out.println("abc".compareTo("abc")); //0
System.out.println("abc".compareToIgnoreCase("ABC")); //0
System.out.println("abc".compareTo("ABC")); //32
4.contains(CharSequence s)
字符串中是否包含指定的CharSequence字符序列(CharSequence是String的父类,所以可以直接传递一个字符串进来),包含则返回true,否则返回false。
System.out.println("abc".contains("bc")); //true
System.out.println("abc".contains("BC")); //false
System.out.println("abc".contains("")); //true
5.contentEquals(CharSequence cs)
将此字符串与指定的CharSequence字符序列比较,相同则返回true,否则返回false。
System.out.println("abc".contentEquals("abc")); //true
System.out.println("abc".contentEquals("ABC")); //false
6.contentEquals(StringBuffer sb)
将此字符串与指定的StringBuffer字符序列比较,相同则返回true,否则返回false。
7.endsWith(String suffix)
判断此字符串是否以指定的字符串结尾,是则返回true,否则返回false。
System.out.println("abcd".endsWith("cd")); //true
System.out.println("abcd".endsWith("ab")); //false
8.equals(Object anObject)
将此字符串与指定的对象进行比较,若指定的对象不是String或为null,则直接返回false。若指定的对象是String并且其字符序列和此字符串的字符序列相同,则返回true,否则依然返回false。
StringBuilder sb = new StringBuilder("abcd");
System.out.println("abcd".equals("abcd")); //true
System.out.println("abcd".equals(sb)); //false
System.out.println("abcd".contentEquals(sb)); //true
9.equalsIgnoreCase(String anotherString)
将此字符串和另一个字符串忽略大小写比较,相等返回true,否则返回false。
10.format(String format, Object… args)
按照指定的格式来格式化字符串,返回的字符串使用本地语言环境。
11.format(Locale l, String format, Object… args)
按照指定的格式来格式化字符串,返回的字符串使用指定的语言环境。
12.getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符串中的字符从指定位置开始复制到目标字符数组的指定位置,srcBegin:字符串中的起始位置(包含),srcEnd:字符串中的结束位置(不包含),dst:目标字符数组,dstBegin:目标字符数组中的起始位置。
char [] s1 = new char[12];
"abcd".getChars(1,3,s1,5);
System.out.println(Arrays.toString(s1)); //[ , , , , , b, c, , , , , ]
13.hashCode()
返回int类型的字符串的哈希码。
System.out.println("abc".hashCode()); //96354
System.out.println("ABC".hashCode()); //64578
14.indexOf(int ch)
返回指定字符第一次出现在字符串中的位置。
15.indexOf(int ch, int fromIndex)
从指定位置开始查找,返回指定字符第一次出现在字符串中的位置。
16.indexOf(String str)
返回指定子字符串第一次出现在字符串中的位置。
17.indexOf(String str, int fromIndex)
从指定位置开始查找,返回指定子字符串第一次出现在字符串中的位置。
System.out.println("abcdefgabc".indexOf("BC")); //-1
System.out.println("abcdefgabc".indexOf('c')); //2
System.out.println("abcdefgabc".indexOf("bc")); //1
System.out.println("abcdefgabc".indexOf('c',5)); //9
System.out.println("abcdefgabc".indexOf("bc",5)); //8
18.isBlank()
如果字符串为空或仅包含white space则返回true,否则返回false。
19.isEmpty()
仅当length()是0时返回true,否则返回false。
20.lastIndexOf(int ch)
返回指定字符最后一次出现在字符串中的位置。
21.lastIndexOf(int ch, int fromIndex)
从指定位置开始向后查找,返回指定字符最后一次出现在字符串中的位置。
22.lastIndexOf(String str)
返回指定子字符串最后一次出现在字符串中的位置。
23.lastIndexOf(String str, int fromIndex)
从指定位置开始向后查找,返回指定子字符串最后一次出现在字符串中的位置。
24.length()
返回此字符串的长度。
25.replace(char oldChar, char newChar)
把字符串中所有的oldChar字符替换为newChar字符,并返回替换后的字符串。
26.replace(CharSequence target, CharSequence replacement)
把字符串中所有的target子字符串替换为replacement子字符串,并返回替换后的字符串。
System.out.println("abcdefgabc".replace('c','x')); //abxdefgabx
System.out.println("abcdefgabc".replace("bc","xy")); //axydefgaxy
27.replaceAll(String regex, String replacement)
把字符串中所有的regex子字符串替换为replacement子字符串,并返回替换后的字符串。
和replace的区别:replace的参数是char或CharSequence,支持字符和字符串的替换;replaceAll的参数是regex,是基于正则表达式的替换。例如,可以通过replaceAll (""\d, “*”)把一个字符串所有的数字字符都替换为星号。
System.out.println("\\\\\\\\".replace("\\", "++")); //++++++++
System.out.println("\\\\\\\\".replaceAll("\\\\", "++")); //++++++++
System.out.println("\\\\\\\\".replaceAll("\\", "++")); //PatternSyntaxException
28.replaceFirst(String regex, String replacement)
把字符串中第一个regex子字符串替换为replacement子字符串,并返回替换后的字符串,和replaceAll类似,都是基于正则表达式的替换。
System.out.println("abcdefgabc".replaceFirst("c","x")); //abxdefgabc
System.out.println("abcdefgabc".replace("c","x")); //abxdefgabx
29.split(String regex)
根据regex子字符串正则表达式分隔,将字符串分隔成多个字符串,最终返回字符串数组。
30.split(String regex, int limit)
根据regex子字符串正则表达式分隔,将字符串分隔成多个字符串,最终返回字符串数组。limit用于控制分隔次数,若为正数,则分隔次数为limit-1,按顺序分隔成limit个字符串;若为0,不限次数,丢弃尾随空字符串;若为负数,不限次数,不丢弃尾随空字符串。
String[] s1 = "abc:def:ghi:jkl".split(":");
String[] s2 = "abc:def:ghi:jkl".split(":",3);
System.out.println(Arrays.toString(s1)); //[abc, def, ghi, jkl]
System.out.println(Arrays.toString(s2)); //[abc, def, ghi:jkl]
31.startsWith(String prefix)
判断此字符串是否以指定的字符串开头,是则返回true,否则返回false。
32.startsWith(String prefix, int toffset)
判断此字符串从指定位置开始是否以指定的字符串开头,是则返回true,否则返回false。
System.out.println("abcdefgabc".startsWith("ab")); //true
System.out.println("abcdefgabc".startsWith("cd")); //false
System.out.println("abcdefgabc".startsWith("ab",2)); //false
System.out.println("abcdefgabc".startsWith("cd",2)); //true
33.strip()
返回此字符串删除所有前导和尾随white space的新字符串。
34.stripLeading()
返回此字符串删除所有前导white space的新字符串。
35.stripTrailing()
返回此字符串删除所有尾随white space的新字符串。
System.out.println(" a b c ".strip()); //"a b c",前后空格均删除
System.out.println(" a b c ".stripLeading()); //"a b c ",仅删除了前空格
System.out.println(" a b c ".stripTrailing()); //" a b c",仅删除了后空格
36.substring(int beginIndex)
返回此字符串从指定位置开始到结尾的子字符串。
37.substring(int beginIndex, int endIndex)
返回此字符串从指定位置开始到指定位置结束的子字符串。
System.out.println("abcdefgabc".substring(1)); //bcdefgabc
System.out.println("abcdefgabc".substring(5)); //fgabc
System.out.println("abcdefgabc".substring(3,7)); //defg
38.toLowerCase()
使用默认语言环境的规则将此字符串中的所有字符转换为小写。
39.toLowerCase(Locale locale)
使用指定语言环境的规则将此字符串中的所有字符转换为小写。
40.toUpperCase()
使用默认语言环境的规则将此字符串中的所有字符转换为大写。
41.toUpperCase(Locale locale)
使用指定语言环境的规则将此字符串中的所有字符转换为大写。
System.out.println("aBcDeFgAbC".toLowerCase()); //abcdefgabc
System.out.println("aBcDeFgAbC".toUpperCase()); //ABCDEFGABC
42.trim()
返回此字符串删除所有前导和尾随空格的新字符串,无法删掉Unicode空白字符。
System.out.println(" a b c ".trim()); //"a b c"
System.out.println("a b c ".trim()); //"a b c"
System.out.println(" a b c".trim()); //"a b c"
43.valueOf(double d)
将传入的参数转换为字符串输出,适用除byte和short外的基本数据类型及Object。
44.valueOf(char[] data)
将字符数组转换为字符串输出。
45.valueOf(char[] data, int offset, int count)
将字符数组从指定下标开始到指定长度结束的部分转换为字符串输出。
二、Character类
Character(Java SE 11 & JDK 11)
Character是char的包装类,提供了一些字符类型的处理方法,可以便捷地将字符转换为小写字母或大写字母。
常用方法:
1.isDigit(char ch)
判断字符ch是否为数字,是则返回true,否则返回false。
2.isLetter(char ch)
判断字符ch是否为字母(大小写皆可)。
3.isLetterOrDigit(char ch)
判断字符ch是否为数字或字母。
4.isLowerCase(char ch)
判断字符ch是否为小写字母。
5.isUpperCase(char ch)
判断字符ch是否为大写字母。
6.toLowerCase(char ch)
返回字符ch的小写形式。
7.toUpperCase(char ch)
返回字符ch的大写形式。