详解|JAVA 修炼秘籍第八章(《String类》)

往期:
JAVA 修炼秘籍第一章:《痛苦的折磨》
JAVA 修炼秘籍第二章:《逐渐魔化》
JAVA 修炼秘籍第三章:《绝地反击》
JAVA 修炼秘籍第四章:《闭关修炼》
JAVA 修炼秘籍第五章:《卧薪尝胆》
JAVA 修炼秘籍第六章:《鏖战》
JAVA 修炼秘籍第七章:《面向对象编程》
JAVA修炼秘籍(番外篇)第一章:《这四道代码题,你真的会吗?》
JAVA修炼秘籍(番外篇)第二章:《图书馆管理系统》
——————————————————————生活以痛吻我,我却报之以歌。

文章目录

  • 一、String
    • 1. 创建字符串
    • 2. 字符串常量池
      • 1. 介绍
      • 2. 存储形式
    • 3. String 中‘+’号连接符
      • 1. 介绍
      • 2. ‘+’号连接符的运行过程
      • 3. ‘+’号连接符的速度
    • 4. intern方法
    • 5. Stirng中常用的方法
      • 1. int length()
      • 2. char charAt(int index)
      • 3. Stirng subString(int beginIndex)
      • 4. String subString(int beginIndex,int endIndex)
      • 5. int compareTo(String anotherString)
      • 6. int compareTolgnoreCase(String anotherString)
      • 7. boolean equals(Object anotherObject)
      • 8. boolean equalsIgnoreCase(String anotherString)
      • 9. String concat(String str)
      • 10. int indexOf(int ch或String str)
      • 11. int indexOf(int ch或String str , int fromIndex)
      • 12. int lastIndexOf(int ch或String str)
      • 13. lastIndexOf(int ch或String str , int fromIndex)
      • 14. String toLowerCase();
      • 15. String toUpperCase()
      • 16. String replace(char oldChar,char newChar)
      • 17. String replaceFirst(String regex,String replacement)
      • 18. String replaceAll(String regex, String replacement)
      • 19.String trim()
      • 20. Boolean contains(String str)
      • 21.String[] split(String str)
    • 6. 字符串与基本类型的转换
      • 1. 字符串转换为基本类型
      • 2.基本类型转换为字符串类型。

一、String 前言:字符串广泛应用于JAVA编程中,而JAVA中的字符串属于对象,JAVA中创建了String类来操作和创建字符串。
1. 创建字符串 String类有11种构造方法,创建字符串最简单的方式。
String str="Hello";

遇到"Hello"这个字符串常量时,编译器会使用该值创建一个String对象,和其他对象一样,也可以使用关键字和构造方法来进行创建。如下。
String str=new String("Hello"); char[] str1={ 'H','e','l','l','o'}; String str2=new String(str1);

String创建的字符串存储在字符串常量池中,而new创建的字符串对象存储在堆上。
2. 字符串常量池 1. 介绍
  1. 字符串常量池 ——> 常量池 ——> 公共池。
  2. 字符串常量池是通过一个StringTable类实现的,它是一个Hash表默认值大小长度是1009。
  3. 常量池中不存在重复的两个相同的对象。
2. 存储形式
String str1="Hello"; String str2="Hello"; String str3=new String("Hello"); System.out.println(str1==str2); System.out.println(str1==str3);

图解:
详解|JAVA 修炼秘籍第八章(《String类》)
文章图片

  1. str1查看常量池中是否存在"Hello",结果为不存在,则"Hello"会在常量池中存储,str1也就指向常量池中的"Hello";
  2. str2查看常量池中是否存在"Hello",结果为存在,指向常量池中的"Hello";
  3. str3首先会在堆上new一个String类的对象,所以str3的这行代码,产生了两个对象,保存在栈中的str3与在堆上String的对象,String的对象保存的是在常量池中已经存在的"Hello"。
  4. 输出结果为:str1==str2输出true,str1与str2同时指向常量区的"Hello"。
  5. 输出结果为:str1==str3输出false,str3指向的是堆上的对象。
3. String 中‘+’号连接符 1. 介绍
  1. 在JAVA中,字符串对象可以使用‘+’号来与其他对象进行连接。
  2. ‘+’号的连接过程是通过StringBuilder或StringBuffer中的append()方法进行实现的。
  3. 其他对象转换为字符串是通过toString()方法实现的。
2. ‘+’号连接符的运行过程
String str1="Hello"; int sum=10; String str2=str1+sum;

而实际‘+’连接符背后的方法调用是这样的。
String str1="Hello"; int sum=10; String str2=((new StringBuffer()).append(str1).append(sum).toString());

3. ‘+’号连接符的速度
  1. 每次进行连接都会隐性new一个StirngBuffer对象,然后调用append,最后再toString返回。
  2. 一般情况下使用不会造成代码效率的降低。
  3. 当循环多次进行‘+’号连接则会造成代码效率的损失。
错误示范
String str=""; for (int i = 0; i < 100; i++) {str=str+i; } System.out.println(str);

字符串每进行一次连接都会隐式创建一个StringBuffer对象。
4. intern方法
  1. 上面说到,当直接进行双引号声明出来的String对象会直接存储在常量池中。
  2. 而通过new一个String对象,来进行声明的String对象则会存储在堆中。
  3. 不是用双引号声明的String对象,可以使用intern方法。
  4. intern作用是将当前字符串与常量池中已经存在的对象进行比较,如果存在返回当前字符串,如果不存在,将当前字符串存储到常量池中。
String str2=new String("He")+new String("llo"); str2.intern(); String str1="Hello"; System.out.println(str1==str2);

此时输出结果为true。
5. Stirng中常用的方法 1. int length()
  1. 作用:返回值为int类型,得到一个字符串的字符个数包括(中,英,空格,转义字符,字符)都计入长度。
  2. 实例:
String str="abcde"; int len=str.length();

  1. 此时:len=5。
2. char charAt(int index)
  1. 作用:返回当前字符串index位置的字符
  2. 实例:
String str="abcde"; char ch=str.charAt(3); System.out.println(ch);

  1. 输出:‘d’
3. Stirng subString(int beginIndex)
  1. 作用:从当前字符串中beginIndex位置起到结尾的字符作为一个新的字符串返回。
  2. 实例:
String str1="abcdef"; String str2=str1.substring(2); System.out.println(str2);

  1. 此时输出:" cdef " ;
4. String subString(int beginIndex,int endIndex)
  1. 作用:从当前字符串中beginIndex位置起到endIndex位置的字符作为一个新的字符串返回。
  2. 实例:
String str1="abcdef"; String str2=str1.substring(2,4); System.out.println(str2);

  1. 此时输出:" cd " ;
5. int compareTo(String anotherString)
  1. 作用:对当前字符串与参数字符串的内容以字典的顺序进行比较,如果当前字符串大于参数字符串返回>0的数字,反之返回<0的数字,等于返回0;
  2. 实例:
String str1="abcdef"; String str2="ABCDEF"; System.out.println(str1.compareTo(str2));

  1. 此时输出:大于0的数
6. int compareTolgnoreCase(String anotherString)
  1. 作用:与compareTo方法不同于,此方法忽略大小写比较。
  2. 实例:
String str1="abcdef"; String str2="ABCDEF"; System.out.println(str1.compareToIgnoreCase(str2));

  1. 此时输出:0
7. boolean equals(Object anotherObject)
  1. 作用:将当前字符串与参数比较,相等返回true,反之返回false;
  2. 实例:
String str1="abcdef"; String str2="ABCDEF"; System.out.println(str1.equals(str2));

  1. 此时输出:false;
8. boolean equalsIgnoreCase(String anotherString)
  1. 作用:与equals方法不同与,此方法忽略大小写。
  2. 实例:
String str1="abcdef"; String str2="ABCDEF"; System.out.println(str1.equalsIgnoreCase(str2));

  1. 此时输出:true
9. String concat(String str)
  1. 作用:将参数字符串连接到当前字符串的尾部
  2. 实例:
String str1="abcdef"; String str2="ABCDEF"; System.out.println(str1.concat(str2));

  1. 此时输出:" abcdefABCDEF ";
10. int indexOf(int ch或String str)
  1. 作用:查找当前字符串中字符或子串,返回字符或子串在当前字符串中第一次出现的位置,没有返回-1。
  2. 实例:
String str1="abcdef"; System.out.println(str1.indexOf(99)); System.out.println(str1.indexOf("cde"));

  1. 此时输出:2 , 2;
11. int indexOf(int ch或String str , int fromIndex)
  1. 作用:与indexOf一个参数的方法不同于,此方法是从当前字符串的fromIndex位置之后开始查找。
  2. 实例:
String str1="abcdbc"; System.out.println(str1.indexOf("bc",3));

  1. 此时输出:4
12. int lastIndexOf(int ch或String str)
  1. 作用:与indexOf一个参数方法不同于,此方法是从当前字符串的尾部向前查找。
  2. 实例:
String str1="abcdefa"; System.out.println(str1.lastIndexOf('a'));

  1. 此时输出:6
13. lastIndexOf(int ch或String str , int fromIndex)
  1. 作用:与indexOf两个参数的方法不同于,此方法是从当前字符串的fromIndex位置之前查找。
  2. 实例:
String str1="abcdefa"; System.out.println(str1.lastIndexOf('a',4));

  1. 此时输出:0
14. String toLowerCase();
  1. 作用:返回当前字符串中所有字符小写后的新字符串。
  2. 实例:
String str1="ABCDEFG"; System.out.println(str1.toLowerCase());

  1. 此时输出:" abcdefg " ;
15. String toUpperCase()
  1. 作用:返回当前字符串中所有字符大后的新字符串。
  2. 实例:
String str1="abcdefg"; System.out.println(str1.toUpperCase());

  1. 此时输出:" ABCDEFG ";
16. String replace(char oldChar,char newChar)
  1. 作用:将当前字符串中与参数oldChar字符想匹配的字符全部替换为参数newChar,返回新字符串。
  2. 实例:
String str1="abadafa"; System.out.println(str1.replace('a','c'));

  1. 此时输出:"cbcdcfc”;
17. String replaceFirst(String regex,String replacement)
  1. 作用:将当前字符串中第一个与参数regex相匹配的子串替换为参数replacem字符串,后返回新的字符串。
  2. 实例:
String str1="abadafa"; System.out.println(str1.replaceFirst("ada","cdc"));

  1. 此时输出:“abcdcfa";
18. String replaceAll(String regex, String replacement)
  1. 作用:将当前字符串中所有与参数regex相匹配的子串替换为参数replacem字符串,后返回新的字符串。
  2. 实例:
String str1="abadafada"; System.out.println(str1.replaceAll("ada","cdc"));

  1. 此时输出:“abcdcfcdc”;
19.String trim()
  1. 作用:截取当前字符串两端的空格,对字符串中间空格不做处理
  2. 实例:
String str1="aaaa"; System.out.println(str1.trim());

  1. 此时输出:”aa aa“;
20. Boolean contains(String str)
  1. 作用:判断当前字符串是否包含参数str字符串,包含返回true,不包含返回false;
  2. 实例:
String str1="XXOO"; String str2="XX"; System.out.println(str1.contains(str2));

  1. 此时输出:true;
21.String[] split(String str)
  1. 作用:将参数str作为分割符进行对当前字符串的分割操作,返回类型为字符串数组,保存每一段被分割的字符串。
  2. 实例:
String str1="aXaXaOaOa"; String[] str3=new String[10]; str3=str1.split("X"); for (String s: str3) {System.out.println(s); }

  1. 此时输出:“aaaOaOa”;
6. 字符串与基本类型的转换 1. 字符串转换为基本类型
parse… 需要转什么类型就在…填写什么类型的包装类。
  1. byte parseByte(String s);
  2. short parseShort(String s);
  3. int parseInt(String s);
  4. long parseLong(String s);
  5. float parseFloat(String s);
  6. double parseDouble(String s);
2.基本类型转换为字符串类型。
【详解|JAVA 修炼秘籍第八章(《String类》)】String类中提供了String valueOf()方法,用于将基本类型转换为字符串类型。
详解|JAVA 修炼秘籍第八章(《String类》)
文章图片

    推荐阅读