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。

 

posted @ 2020-11-09 14:57  我多想让过去重来  阅读(723)  评论(0)    收藏  举报