[JAVA学习笔记]String类

. **

一、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"));
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值