. **
一、String类——不可变字符串
- java.lang.String 该类为final所修饰,为不可继承类
- 它的底层实现是一个char[]数组 value且该数组定义为final属性,因此该数组不可变
- 字符串String的不可变在于其方法都是返回一个新对象而非本对象,本对象字符串不能改变,而一个String类的引用是可以重新赋值的
- Java中字符串在内存采用Unicode编码,与系统的字符集无关,都是一个字符占两个字节
String常量池
对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象。
也就是说
String s1 = “Hello”;//这里就将Hello放入了常量池,此后不会产生新的"Hello"对象
String s2 = “Hello”
s1 == s2 ----> true
此外,常量字符串与常量字符串相加得到的还是会存入常量池;变量字符串与常量字符串相加将会产生新的对象:
String s1 = "He";
String s2 = "llo";
System.out.println("Hel"+ "lo" == "Hello");//true
System.out.println(s1 + "llo" == "Hello");//s1 参与运算时就会生成新的对象
构造器:
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[])
public String(char value[], int offset, int count)
public String(byte bytes[], int offset, int length, String charsetName)
无论是传入数组还是传入字符串都是对对象内的字符数组values核心量进行初始化
但是传入字节数组则需要解码这一步骤!因此还需传入环境字符集名字,当然是带有默认字符集的(未传入时)
API中的方法
str.length();
负责返回字符串内部数组value的长度 return this.value.length;
str.substring(beginIndex, endIndex)
beginIndex,endIndex分别是截取的上角标和下角标
当经过对于beginIndex和endIndex的是否非法判断是否抛出异常后
实际上使用了return new String(char[]value,offset,count)构造了一个新字符串
equal方法:判等函数:
1.判断是否是同一对象if(this==obj) return true;
2.判断待比较对象是否是String的实例if(obj instanceof String)
----判断长度是否一致if(this.value.length == obj.value.length)
----判断value数组是否一致:应用while/for循环逐位比较
while(){
if(v1[i]!=v2[i])
return false;
i++;
}
IndexOf(int ch,int fromIndex)
两个参数 一个是需要查找的字符第二个是查找的起点
做的事情也即先将字符串长度保存max = this.value.length 后判断length的越界问题
判断错误默认更正fromIndex为0 正确则自fromIndex采用for循环诸位寻找ch后返回下标i
若查找失败则返回-1;
Concat(String otherstr)
传入待连接的字符串 若字符串长为0则直接返回this.otherstr
否则,提出长度len = this.value.length
创建新value数组char newvalue[] = Array.copyOf(this.value,len+otherstrlen);
应用otherstr.getchars(newvalue,otherstrlen)为新数组otherstrlen下标后的部分注入外来字符串;
返回新数组对应的新字符串new String(newvalue)
replace(char oldchar,char newchar)
将字符串中旧字符替换成新字符.
hashcode() 对于String的hashcode与Object不同,String类重写了该方法,哈希码此时不是简单代表一个字符串的内存地址,hashcode的求值方法是通过逐位char字符的ASCii码与质数31相乘最后合成
因此内容相同的字符串即使不是同一对象也能得到相同哈希码.
其他几个常用的方法:
indexOf方法用于实现在字符串中检索另一个字符串
String提供几个重载的indexOf方法
String还定义有lastIndexOf方法:
使用substring获取子串
substring方法用于返回一个字符串的子字符串。
substring常用重载方法定义如下:
trim
valueOf 包含对于多种类型的重载,都是由对应类型输出String类型对象
编码问题:
String str = "你好";
byte[] bysUTF8 = str.getBytes("UTF-8");
byte[] bysGBK = str.getBytes("GBK");
System.out.println(Arrays.toString(bysGBK));
System.out.println(Arrays.toString(bysUTF8));
String s1 = new String(bysUTF8,"UTF-8");//正常显示
String s2 = new String(bysGBK, "GBK");//正常显示
String s3 = new String(bysGBK, "UTF-8");//解码异常
String s4 = new String(bysUTF8, "GBK");//解码异常
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
//重新编码再解码
byte[] bys = s3.getBytes("UTF-8");
System.out.println(Arrays.toString(bys));
System.out.println("s3更正后:"+new String(bys, "GBK"));
System.out.println("s4更正后:"+new String(s4.getBytes("GBK"), "utf-8"));