String
String-java.lang
0.实现接口
没有任何继承关系 实现三个接口Serializable, CharSequence, Comparable<String>。
1.构造方法创建对象
String是一个非常特殊的引用数据类型 可以像基本类型一样 创建 赋值。
String s1 = "abc";//直接将字符串常量赋值给str----字符串常量池。
String s2 = new String("abc");----堆内存。
String str = new String();//无参数构造方法创建空的对象 String str = “”;
String str = new String(byte[] )//将数组中的每一个元素转化成对应的char 组合成String。
String(byte[] bytes, Charset charset)
String(byte[] bytes, int offset, int length)//将数组中char元素, 下标从offset开始, length位拼接成最终的String。
String(byte[] bytes, int offset, int length, Charset charset)
String str = new String(char[] )//将数组中的每一个char元素拼接成最终的String。
String(char[] value, int offset, int count)
String(StringBuffer buffer)
String(StringBuilder builder)


2.String类的特性—不可变。
String类中包含一个private final char[] value;//存储String中的每一个字符
体现在两个地方 长度及内容。
长度--->final修饰的数组 数组长度本身不变 final修饰数组的地址也不变。
内容--->private修饰的属性 不能在类的外部访问//那么数组中的内容也修改不到了
当然可以通过—反射—修改数组的内容。
*3.String类中常用的方法 20+
特别注意:重写equals方法一般得重写hashCode方法,否则可能达不到预期效果。
1:equals()方法继承自Object boolean = equals(Object obj);
Object中的 equals()方法--效果和==没啥差别---比较二者地址是否相同。
String重写equals()后---比较两个字串中的字面值是否相等。
重写前Object下equals方法源码。

String类重写equals()后的源码:

2 hashCode()--继承自Object—String类重写--将当前字符串的每一个char元素拆开 乘以31+后面一个字母ASCII求和,最后一个字母没有乘以31直接加上它对应的ASCII。
Object类下hashCode()源码.

String类重写hashCode()后的源码:
int = hashCode();



3:String类实现了Comparable<String>接口。
按照字典(Unicode编码)索引的顺序比较。

int = compareTo(String str);


String类实现Comparable接口中ComparaTo()方法源码。
概述算法就是:
如果没有字符不同的索引位置,返回这两个字符串长度的差(当前字符串长度-传入字符串长度);
否则返回比较不同时对应ASCII相减(当前-传入)。

4: String = toString();
继承自Object---重写后--不再输出 类名@hashCode--现在输出字符串中的字面值。
Object类下的toString源码:

String重写后toString()的源码:

5: 返回给定index对应位置的那个char值。
char = charAt(int index);//"abc" 0-->a
6:返回给定index对应位置的那个char所对应的code码
int = codePointAt(int index);//"abc" 0-->97
7:返回字符串的长度。
int = length();
8:将给定的字符串拼接在当前字符串之后。
String = concat(String);
+
StringBuild/StringBuffer
效率: +<concat(String)< StringBuild/StringBuffer。
9.boolean = contains(CharSequence s);
CharSequence描述的就是一个字符串
判断给定的s是否在字符串中存在
10. startsWith(String prefix);
endsWith(String suffix);
判断此字符串是否已xx开头/结尾 如.java等
11.
将当前的字符串转化成字节数组
byte[] getBytes()
byte[]---getBytes(Charset charset);
将当前的字符串转化成字符数组
char[] = toCharArray();---char类型2字节
"我爱你中国" char[] '我' '爱' '你' '中' '国'。
12. 找寻给定的元素在字符串中第一次出现的索引位置 若字符串不存在则返回-1
int index = indexOf(int/String str [,int fromIndex] );
Int相当于ASCII码—对应的字母 后面[]可以选择从第几个index开始查找
找寻给定的元素在字符串中最后一次出现的索引位置 若不存在则返回-1
lastIndexOf(int/String str , [int fromIndex]);
13.boolean = isEmpty();
判断当前字符串是否为空字符串 (length是否为0)
注意: 与null之间的区别
14.replace();
将给定的字符串替换成另外的字符串
replaceAll(“原数组需要替代的字符”,“需要替换的字符”);
换第一次出现的那个字串
replaceFirst(原数组需要替代的字符”,“需要替换的字符”);
15. 按照给定的表达式将原来的字符串拆分开的
String[] = split(String regex [,int limit限度界限]);
16.String = substring(int beginIndex [,int endIndex]);
将当前的字符串截取一部分.
从beginIndex开始至endIndex结束 [beginIndex,endIndex)
若endIndex不写 则默认到字符串最后。
Index从0开始。
17.
String = toUpperCase();
String = toLowerCase();
将全部字符串转换成大写/小写
18.String = trim();
去掉字符串前后多余的空格—中间的空格去不掉注意哈。
19.boolean = matches(String regex)
regular有规律的 expression表达式
正则表达式
//更多查看----自己回去查看API文档
4.笔试考察String的特点
== equals方法的区别
==可以比较基本类型 可以比较引用类型
比较基本类型比较值 比较引用类型比较地址
equals只能比较引用类型(方法)
默认比较地址this==obj
如果想要修改其比较规则 可以重写equals方法
通常重写equals方法时会伴随着重写hashCode方法
比如String类 比如Integer
*String的不可变特性
长度及内容
String类中包含一个private final char[] value;//存储String中的每一个字符
体现在两个地方 长度及内容
长度--->final修饰的数组 数组长度本身不变 final修饰数组的地址也不变
内容--->private修饰的属性 不能在类的外部访问//那么数组中的内容也修改不到了
可以通过—反射—修改数组内容。
String与StringBuffer区别
A:
String:对象为不可变对象,一旦被创建,就不能修改它的值。但是可以修改它的引用。 不可变字符串 private final char[] value;
StringBuffer: 对象是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象。
可变字符串 char[] value; 动态扩容
B:
String中的字符串拼接(+与concat())效率远远低于StringBuffer字符串拼接 append()
StringBuffer/StringBuilder没有compareTo方法
StringBuffer/StringBuilder含有一个String没有的方法 append();拼接
StringBuffer与StringBuilder区别
StringBuffer和StringBuilder是可变的,所做的操作是在原字符串的基础上进行的。
StringBuffer是线性安全的,支持并发操作,适合多线程。
StringBuilder线性不安全,不支持并发操作,适合单线程。
String对象的存储
"abc"---->字符串常量池
new String("abc")--->堆内存
"a"+"b"+"c"+"d"

代码解释:
1




3







byte 1个字节
char 两个字节
byte[] = getBytes();
char[] = toCharArray();
将当前的字符串转化成数组
"我爱你中国" char[] '我' '爱' '你' '中' '国‘
如果我爱你中国调用 getBytes(); 我2个字节 byte1个字节 存不下 需要两个byte才存的下 所以 拆的时候是这个规律拆开 组装回去的时候也得是这个规律组回去 否则乱码










1.字符串的格式校验 String类中提供的一个方法 boolean =str.matches("regex");
2.字符串的拆分及替换 String类中提供的方法replace split
3.字符串的查找 Pattern模式 Matcher匹配器
3.字符串的查找
Pattern模式 Matcher匹配器


习题巩固
字符串反转。
1.设计一个方法 将字符串反转 ok-->ko
思路:
a:将字符串变化为数组
b:交换
c:数组组合成字符串


方法2:


字符串正序和反序进行连接
2.设计一个方法 将给定字符串的正序和反序进行连接 ok-->okko
思路:根据第一个的反序+之前的正序就可以了。


其实这个地方不该用+
应该用str.concat(new String(a));效率高一些。


concat的效率比+高
字符串是否是回文
3.设计一个方法 判断给定字符串是否是回文 abccba abcba
思路:
a:将字符串变化为数组
b:判断一下首尾是否相同

思路二:应该效率没得第一种思路高

字符串右位移x位置
4.设计一个方法 将给定的字符串右位移x位置 (helloworld,2) --> ldhellowor
思路1:

字符串中最长
5.设计一个方法 寻找若干字符串中最长的那个 ab,abc,abcd--->abcd.

字母在字符串中出现的次数
6.设计一个方法 统计给定字母在字符串中出现的次数 "this is a test of java","a"--->3。

给定的字符串每一个首字母大写
7.设计一个方法 将给定的字符串每一个首字母大写 "this is a test of java"--->"This Is A Test Of Java"
1:拆分 split
2:首字母大写
3:转化为string

获取给定字符串中的全部数字
8.设计一个方法 获取给定字符串中的全部数字 "za1o1zbp24tcq"--->1124。

浙公网安备 33010602011771号