1、 定义接口
2、 定义抽象类
3、 面向对象开发思想
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 替换方法
原理:从字符串的首到尾遍历,只要有吻合的字符,就替换。
考虑:如果字符串已经知道替换内容在哪里,
批量文件的扩展名:扩展名都在文件名的尾部
在字符串操作中,没有倒序替换
{a. doc,b.doc,c.doc,d.doc}
把 doc 的名字转成 txt
字符串掌握的方法
replace 优化
concat/+
indexOf/lastIndexOf
endsWith/startsWith
equals/hashCode
length()/charAt()
substring()子串
操作和理解 new String() String 源码