一、string类内部结构
string类为final的不可继承,并且有一个char型数组属性也是final的(char value[]),代表不可变的字符序列。
string实现了comparable、serializable和charsequence接口(因此字符串可以比较)
字符串是值传递不是引用传递
sring有两种创建方法:
1.new 这时候创建的string对象在堆空间中,但是string的value属性还是要指向方法区的常量池。
2.直接赋字面量,这时候在栈里的指针直接指向常量池。
关于常量池:
常量池在方法区里,顾名思义,里面的量不可变,改变String其实是在常量池新建一个量(就算拼接也是重新在常量池造一个)
常量池不重复,也就是两个string值相同的话其实指向常量池里同一个char数组。
如果字符串拼接调用的是intern方法,返回值在常量池里。
两个字符串拼接,如果其中一个是变量(不是字面量,如果变量用final修饰就不是变量是常量了那还在常量池里),则返回结果在堆中(也就是s1+“a”其实在堆中,再指向常量池)
二、常用方法
1. int length()
2.char charAt(int)
3.boolean isEmpty()
4.String toLowerCase();String toUpperCase();
5.String trim();裁剪字符串前后的空格
6.boolean equals(Object)区分大小写
7.boolean equalsIgnoreCase(Sting)不区分大小写
8.String concat(String) 相当于+
9.int compareTo(String) 本质是字符串之间的字符逐个相减(ascall码),返回负数就是前面的字符串在字母表上比较前。
10.
String substring(int)从int开始到末尾返回一个新串
String substring(int,int)从int开始到int,[)
12.
boolean endsWith(String suffix)以指定后缀结束
boolean startsWith(String suffix)
boolean startsWith(String suffix,int) 指定int后的子串是不是以suffix开头
13.boolean contains(CharSequence s)其实就传一个string就行(实现了该接口),看是否包含这个串
14.
int indexOf(String str)
int indexOf(String str,int index) 从指定坐标往后找第一个符合的
int lastIndexOf(String str)
int lastIndexOf(String str,int index) 从指定坐标往前找第一个符合的
15.
String replace(char oldChar, char newChar)替换全部单个char
String replace(CharSequence target, CharSequence replacement)替换全部string
String replaceAll(String regex, String replacement) 用正则表达式替换所有
String replaceFirst(String regex, String replacement) 用正则表达式替换第一个
16.
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
17.
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
三、String和其他数据类型的转换
1.字符串 <=> 基本数据类型和包装类
XXX.parseXXX(String s)
String.valueOf(XXX x)
2.字符串 <=> 字符数组
str.toCharArray()返回一个字符数组
使用String构造器,String(chararr)
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。
String(char[],int offset,int length)
3.字符串 <=> 字节数组
str.getBytes()返回一个字节数组
使用String构造器,String(bytearr)
String(byte[],int offset,int length)
getBytes有重载方法,不给参数使用默认编码集,可以给参数指定编码集,如str.getBytes("gbk")(因为编码集可能不存在所以要抛异常)
同样的String(bytearr,"gbk")可以指定解码时也用gbk,不指定就是默认编码集
字符串到字节其实是把看得懂的文字变成看不懂的二进制数据(变成数字a->97这样ASCII码)
gbk专门针对中国,汉字是两个字节;utf-8面向世界,汉字是三个字节;但他们的a都是编码97(和ASCII一样,其他字母或者ASCII里有的同理)