String类的理解:(以jdk8为例)
——类的声明:
public final class String implements java.io.Serializable,Comparable,CharSequence
·final:String是不可被继承的。
·Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输。
·Comparable:凡是实现此接口的类,其对象都可以比较大小。
——内部声明的属性:
(jdk8中)
private final char value[ ]; 存储字符串数据的容器
·final:指明value数组一旦初始化,其地址就不可变。
(jdk9开始)(为了节省内存空间,做了优化,将char 变为了byte)
private final byte[ ] value; 存储字符串数据的容器
字符串常量的存储位置
·字符串常量都存储在字符串常量池(StringTable)中。
·字符串常量池中不允许放两个相同的字符串常量。
·字符串常量池在不同的jdk版本中,存放的位置也不同。
jdk7之前:字符串常量池存放在方法区。
jdk7及之后:字符串常量池存放在堆空间。
String的不可变性的理解:
①当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置进行修改。
②当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接之后的字符串,不能在原有的位置修改。
③当调用字符串replace( )替换现有的某个字符时需要重新开辟空间保存修改以后的字符串
String实例化的两种方式
第一种方式:字面量的定义方式实例化: String s1 = "hello";
第二种方式:String s2 = new String("hello");
第二种方式在内存中 创建了两个对象,一个是堆空间中引用数据类型为String类的对象(假设是a),另一个是存在a中的value(存着指定的字面量)。
String的连接操作: (连接符: + )
情况①:常量+常量:结果仍然存储在字符串常量池中。
(被final修饰的String的变量,相当于常量。)
情况②:常量+变量 或 变量+变量:都会new一个新的String的对象。
情况③:调用字符串的inrern( )方法:返回的是字符串常量池中字面量的地址。
情况④:concat( )方法:调用即连接字符串(无论常量与变量),都会new一个新的String的对象。
String的构造器和常用方法:
构造器:
public String( ) :初始化新创建的String对象,以使其表示空字符序列。
String(String original) :初始化一个新创建的String对象,使其表示一个与参数列表相同的字符序列。即新创建的字符串是该参数字符串的副本。
public String(char[ ] value) :通过当前参数中的字符数组来构造新的String
public String(char[ ] value,int offset,int count) :通过字符数组的一部分来构造新的String。
public String(byte[ ] bytes) :通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
public String(byte[ ] bytes,String charsetName) :通过使用指定的字符集解码当前参数中的字节数组来构造新的String。
一般情况下,idea默认使用utf-8字符集。
utf-8字符集中,一个汉字占用三个字节,一个字母占用一个字节。
gbk字符集中,一个汉字占用两个字节,一个字母占用一个字节。
utf-8和gbk都向下兼容了ASCII码。
编码与解码:
解码时使用的字符集必须与编码时使用的字符集一致,否则出现乱码。
String类的常用方法:(常用方法太多了,后面直接抄尚硅谷的笔记了)
①boolean isEmpty( ) :判断字符串是否为空。
②int length( ):返回字符串的长度。
③String concat( ):拼接
④boolean equals(Object obj):比较字符串是否相等,区分大小写。
⑤boolean equalsIgnoreCase(Object obj):比较字符串大小,不区分大小写。
⑥int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小。(两组的字符逐一比较,直到找到一对不一样的,返回这对不一样的字符的编码值的差值)
⑦int compareToIgnoreCase(String other):比较字符串大小,不区分大小写。
⑧String toLowerCase( ):将字符串中大写字母转为小写。
⑨String toUpperCase( ):将字符串中小写字母转为大写。
⑩String trim( ):去掉字符串前后空白符。
①①public String intern( ):结果在常量池中共享。
与查找相关的:
①②int indexOf(xx):从前往后找到当前字符串中的xx,如果有返回第一次出现的下标,要是没有返回-1。
①③int indexOf(String str,int fromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的索引开始。
①④int lastIndexOf(xx):往后从前找到当前字符串中的xx,如果有返回最后一次出现的下标,要是没有返回-1。
①⑤int lastIndexOf(String str,int fromIndex):返回指定子字符串在此字符串中最后一次出现的索引,从指定的索引开始反向搜索。
①⑥boolean contains(xx):判断字符串是否包含xx。
字符串截取:
①⑦:String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
①⑧:String substring(int beginIndex,int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的子字符串。
和字符、字符数组相关:
①⑨char charAt(int index):返回index的字符。
②⊙char toCharArray( ):将字符串转换为一个新的字符数组返回。
②①static String valueOf(char[ ] data):返回指定数组中表示该字符序列的String。
②②static String valueOf(char[ ] data,int offset,int count):返回指定数组中表示该字符序列的String。
②③static String copyValueOf(char[ ] data):返回指定数组中表示该字符序列的String。
②④static String copyValueOf(char[ ] data,int offset,int count):返回指定数组中表示该字符序列的String。
②⑤boolean startWith(xx):测试字符串是否从指定索引开始的子字符串是否以指定前缀开始。
②⑥boolean startWith(string prefix,int offset):测试此字符串从指定索引开始是否的子字符串是否以指定前缀开始。
②⑦boolean endWith(xx):测试此字符串是否以指定的后缀结束。
和替换相关的:
②⑧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 替换此字符串匹配给定的正
则表达式的第一个子字符串。