字符串的使用

本文详细解释了Java中String类的特性,如final类、不可变性和内部的char数组结构,以及newString与StringBuilder在字符串连接中的差异。重点讲解了equals和hashCode的使用以及字符串操作方法如replace和substring的原理。
摘要由CSDN通过智能技术生成

开发java的项目

    定义接口
    定义抽象类
    面向对象开发思想

Java为字符串设计一个类 String(结合源码)

String是一个字符串类,类可以实例化成对象,new

New String()是一个空串,字符串是什么都没有的。

按住键盘ctrl+String就进入到源码中。

Java类前面带上了final,final终止。String类由final修饰,不能被任何类继承。同时实现接口CharSequence,实现接口的方法。

接口:不能携带方法体,接口后面带上default就可以跟上方法体。 Java原生的类,都很少用到abstract抽象类。在框架中。default相当于抽象类中的实现。

new String()就是执行构造方法。

 this.value=””.value

属性: value

Java的字符串把value定义成一个char型的数组

private final char value[];

String s=”123”

Java 把它变成char型数组, char只有一个字符

{‘1’,’2’,’3’}

这个char型数组还有修饰符,final,这个char型不能被改变。

 Java封装的String类只定义get方法,没有定义set方法,这个char型只能get读取,不能赋值.

 final修饰的变量,必须在定义时就要初始化,初始化在程序执行过程中不能修改.

总结:

Java的String是一个final类,不能被继承,同时定义的每一个字符串Java在后台会变成char型数组保存,这个char型数组是final的,final定义的值不能在程序的执行过程中改变的.

注意问题:

String str=new String("abc");

System.out.println(str);

String str1=new String("abc");

System.out.println((str1));

//两个串都是abc,这两个串是否相等。

System.out.println(str==str1);

//字符串的等于使用equals();

System.out.println(str.equals(str1));

得出的结果是 :使用==等号两个值为false,使用equals时就是true

原因: new String实际上定义一个char型数组,数组变量指向是一个地址,        

[Ljava.lang.String;@1b6d3586

地址指向才是数组中的值,我们在new 类实例化类时打印也是地址,在面向对象编程要求强制重写toString();

两个串都是abc,这两个串是否相等,使用==号,比较的是地址 。这表示两个地址是否相等, 一般发生new的一定是不相等的.使用equals就会相等,equals底层把字符串拆成字符,一个一个比较出来的相等.

如果代码中不发生new String,相当于没有对象产生.这时直接赋值的字符串是可以相等的.

String str="abc";
System.out.println(str);
String str1="abc";
System.out.println((str1));
//两个串都是abc,这两个串是否相等。这表示两个地址是否相等
System.out.println(str==str1);
//字符串的等于使用equals();
System.out.println(str.equals(str1));

根据字符串类的源码,得出字符串类中有一个final的char型数组,这是final,在运算过程中不能改变值.

new String(“a”)+new String(“b”) 这是产生了几个对象

new String(“a”)相当于产生一个对象a,a底层就是char[],final,不能改变值,最后连接的ab一定不是地址,最后产生的ab一定也是一对象.

new String(“b”)相当于产生一个对象b,b底层就是char[],final,不能改变值,最后连接的ab一定不是地址,最后产生的ab一定也是一对象.

根据字节码来决定这个操作发生了什么?

New String()发生了字符串运算操作,因为String是定长的char[],java使用了一个StringBuilder去操作字符串的相关运算.

 存储的值a做为一个对象来存储的.

New String()对象是一个地址

底层char[],value也是一个地址

最后合成ab是char数组,这个对象就是ab,这个没有new

结论:

凡是字符串的改变长度的操作,都有StringBuilder 的参与.

StringBuilder特点:调用父类AbstractStringBuilder,在AbstractStringBuilder中执行一个new char[16]

StringBuilder底层是有16长度的char型数组.数组定长,只要字符串不超过16位,StringBuilder就是同一个串

这里引用StringBuffer

如果超过16位,StringBuilder 可以扩容.

****length()方法

对字符串来说是一个方法,对于数组是一个属性

字符串的方法调用了数组的属性

 isEmpty()

判断字符串是否为空

 equals(null)

******charAt:返回当前字符串索引中的字符

getChars 获取子串,获取的结果是char数组

String[] arr={1,2,3}

String[] arr1=arr;

arr[0]=100

System.arraycopy 拷贝数组(java 改变数组长度的方法就是使用)

getBytes()取字节

相当于把String当中char 中的数组每一个字节转换成字节输出.

equals表示两个字符串的值是否相等,判断相等效率不高.底层源码是一个for循环.

equalsIgnoreCase 相等忽略大小写,帮助我们调用toLowerCase,toUpperCase,还是循环比较。使用这个方法跟使用toLowerCase,toUpperCase一个效率.

三元运算符

把if语句必成一句话解决.

compareTo也可以做两个字符比较,但返回两个字符之间的长度差.

在实际开发中,使用优化过的compareTo

项目修改后:上线前代码比对.(上线审批)

startsWith 字符串的开头是什么,有助于文件管理命名的问题,后面文件操作

(sd1,sd2,sd3)

endswith 字符串的结尾是什么,类似于文件中打开,都是以后缀名来解决的.

 hashCode 方法上返回的一个hash值

在String中的元素做算法,算一个hashCode值,如果hashCode值相等,这两个值可能相等.

String中每个元素hashCode的算法就是把每个元素的字节+31*前一个元素的哈希值,默认前一个元素哈希值为0.

比较字符串相等,每个字符是否相等,先比较hashCode,再比较equals,最科学的比较方法.(switch)用hashCode效率会非常高.

IndexOf正序输出字符在字符串中的索引

lastIndexOf倒序输出字符在字符串的索引

注意:找出一个就退出,注意前面找和后面找,输出的索引值可能是不一样的.

 Substring获取子串 获取的字符串

指定开始的位置和结束的位置,startIndex,endIndex

区间:左闭右开,底层endIndex-startIndex,就把endIndex就给去掉.底层是从当前的startIndex取几个,并不从startIndex取到endIndex.

 Concat两个字符串相连.

两个字符串相连可以用+

+和concat区别在哪里?

使用上就是连接字符串

区别底层:(1)+号会把字符串转成StringBuilder,然后再执行连接操作,最后把StringBuilder转回String。StringBuilder就有一个16的数组空间,去做a结合b的运算。这费内存,内存效率高。

      (2)concat使用System.array_copy再产生一个字节数组,长度过两个字符串的和,去存储数据。Concat占用内存空间少,效率不一定高。

replace替换方法

原理:从字符串的首到尾遍历,只要有吻合的字符,就替换。

考虑:如果字符串已经知道替换内容在哪里,

批量文件的扩展名:扩展名都在文件名的尾部

在字符串操作中,没有倒序替换

    doc,b.doc,c.doc,d.doc}

把doc的名字转成txt

字符串掌握的方法

replace 优化

 concat/+

indexOf/lastIndexOf

endsWith/startsWith

equals/hashCode

length()/charAt()

substring()子串

操作和理解 new String() String源码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值