String类及相应的字符串操作方法

简介: String类及相应的字符串操作方法



一、认识String类及学会使用

1.三种构造方式

(1)直接使用常量构造

public static void main(String[] args) {
        String str = "I love you";
        System.out.println(str);
    }

内存展示图:

(2)new一个String对象

public static void main(String[] args) {      
         String str2 = new String("love you too");
        System.out.println(str2);
    }

(3)使用数组进行构造

public static void main(String[] args) {
        char[] arr = {'6','6','6'};
        String str3 = new String(arr);
        System.out.println(str3);
    }

为什么String的内存布局是这样呢?就需要先往下了解String类

2.认识String类

(1)String类

  • String属于一个类,可以用来实例化对象。
  • String定义的变量称为引用变量,简称引用,引用中存放的是地址
  • String对象中也不是直接存放字符串的

(2)String类的空间分配

  • 用下面一段代码举例
String str = new String("abcd");
  • 调试观察其内部:

  • 我们暂时只需要知道对象里面有value和hash即可,下面看内存分布图

3.String引用类型的比较

(1)比较字符串是否相等

  • 先看错误的比较方法:使用等号
public static void main(String[] args) {
        String str1 = new String("abcd");
        String str2 = new String("abcd");
        System.out.println(str1==str2);
        if(str1==str2) {
            System.out.println("字符串str1==字符串str2");
        }else {
            System.out.println("字符串str1!=字符串str2");
        }
    }

错误原因:它们都属于引用类型,不能直接用等号(==)比较;而用等号比较则比较的是它们对象的地址

  • 使用euqls方法比较
public static void main(String[] args) {
        String str1 = new String("abcd");
        String str2 = new String("abcd");
        System.out.println(str1.equals(str2));
    }

  • 简单学习一下String类重写的equals方法

这是String类重写equals的原码:需要使用String类型的变量去调用才会使用该方法

Object(父类)的equals方法:

画图解析:

String类的equals方法

Object类的方法:如果没有去使用String变量去调用equals方法,而直接使用==号比较,本质会默认调用Object的equals方法

  • 忽视大小写比较的方法:equalsIgnoreCase

代码举例:

public static void main(String[] args) {
        String str1 = new String("abcd");
        String str2 = new String("ABCD");
        System.out.println(str1.equalsIgnoreCase(str2));
    }

(2)比较字符串大小

  • compareTo方法
public static void main(String[] args) {
      String str1 = new String("abcd");
      String str2 = new String("abce");
      String str3 = new String("abc");
        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareTo(str3));
    }

比较方式:

(1)一一对比它们的ASCII值,如a的ASCII值<b的ASCII值,则返回小于0的数字

(2)字符串长度不一,但是前面有的部分都相同时,长的字符串大;如:abc<abcd

返回值:

返回值的数字=它们之间的ASCII的差值;如:a<b。则返回-1,b>a,则返回1

  • 忽略大小写比较:compareToIgnoreCase
public static void main(String[] args) {
        String str1 = new String("abcd");
        String str2 = new String("ABCC");
        System.out.println(str1.compareToIgnoreCase(str2));
    }

二、字符/串查找方法

前言:都需要使用String类型来调用

1.charAt(int index)方法

  • 用于查看指定位置的字符

(1)方法认识

功能:返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常

(2)举例

public static void main(String[] args) {
        String str = new String("abcdefg");
        int index = str.charAt(3);
        System.out.println(index);
        System.out.println(str.charAt(0));
    }

2indexOf() 方法

(1)int indexOf(int ch)方法

  • 用来查找指定字符在字符串中第一次出现的位置

功能:返回ch第一次出现的位置,没有返回-1

举例:

public static void main(String[] args) {
        String str = new String("aabbccdd");
        int index = str.indexOf('b');//查找b
        System.out.println(index);
        System.out.println(str.indexOf('d'));//查找d
    }

(2)int indexOf(int ch, int  fromIndex)方法

  • 从fromIndex位置开始找ch第一次出现的位置(该位置是从起始位置开始数),没有返回-1
  • 认识方法

  • 举例:
public static void main(String[] args) {
        String str = new String("aabbccdd");
        System.out.println(str.indexOf('c',2));
    }

直接从2位置(第一个b的位置)开始找;如果从d的位置,则会找不到

(3)int indexOf(String str) 方法

  • 用于查找指定字符串第一次出现的位置

功能:返回str第一次出现的位置,没有返回-1

  • 举例:
public static void main(String[] args) {
        String str = new String("aabbccdd");
        System.out.println(str.indexOf("ab"));
    }

(4)int indexOf(String str, int fromIndex)方法

  • 从指定位置查找指定字符串

功能:从fromIndex位置开始找str第一次出现的位置,没有返回-1

  • 举例
public static void main(String[] args) {
        String str = new String("aabbccdd");
        System.out.println(str.indexOf("ab",2));
    }

3.lastIndexOf() 方法

(1)int lastIndexOf(int ch) 方法

  • 从后往前找,返回ch第一次出现的位置,没有返回-1

  • 举例
public static void main(String[] args) {
        String str = new String("abcdef");
        System.out.println(str.lastIndexOf('b'));
    }

(2)int lastIndexOf(int ch, int  fromIndex)方法

  • 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1

  • 举例
public static void main(String[] args) {
        String str = new String("abcdef");
        System.out.println(str.lastIndexOf('b',5));
    }

(3)int lastIndexOf(String str) 方法

  • 从后往前找,返回str第一次出现的位置,没有返回-1

  • 举例
public static void main(String[] args) {
        String str = new String("abcdef");
        System.out.println(str.lastIndexOf("abc"));
    }

(4)int lastIndexOf(String str, int  fromIndex)方法

  • 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返
    回-1

  • 举例
public static void main(String[] args) {
        String str = new String("abcdef");
        System.out.println(str.lastIndexOf("abc",2));
    }

三、字符串转换方法

1.数字转字符串方法

(1)认识valueOf()

  • 调用格式:String.valueOf()
  • 参数:数字

(2)举例

public static void main(String[] args) {
       String str = String.valueOf(1234);
        System.out.println(str);
    }

从数字1234变成字符串1234

2.字符串转数字方法

一般用于转化数字字符串

(1)认识Integer.parseInt()

  • 格式:Integer.parseInt()
  • 参数:字符串/字符

(2)举例

public static void main(String[] args) {
       int tmp = Integer.parseInt("1234");
        System.out.println(tmp);
    }

字符串1234变成了数字1234

3.大小写转换方法

(1)小写转大写

  • 方法名:toUpperCase()
  • 使用String类型调用
  • 举例:
public static void main(String[] args) {
      String str = new String("abcd");
      String tmp = str.toUpperCase();
        System.out.println(tmp);
    }

(2)大写转小写

  • 方法名:toLowerCase()
  • 使用String类型来调用
  • 举例:
public static void main(String[] args) {
      String str = new String("ABCD");
      String tmp = str.toLowerCase();
        System.out.println(tmp);
    }

4.字符串转数组

(1)字符串转数字

  • 方法名:toCharArray()
  • 使用String类型来调用
  • 举例:
public static void main(String[] args) {
        String str = new String("abcde");
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

(2)数字转字符串

  • 这就是字符串的构造方法之一
  • 举例
public static void main(String[] args) {
        char[] ch = {'a','b','c'};
        String s = new String(ch);
        System.out.println(s);
    }

5.字符串格式化

  • 方法名:format()
  • 使用String类型来调用
  • 举例
public static void main(String[] args) {
        String str = String.format("%d--%d--%d",1999,5,1);
        System.out.println(str);
    }

四、字符串的替换、拆分与截取方法

1.字符串替换

(1)替换所有的指定内容

  • 方法名:replaceAll

  • 使用String类型来调用
  • 举例:
public static void main(String[] args) {
        String str = new String("aabbccdd");
       String tmp= str.replaceAll("ab","xx");
        System.out.println(tmp);
    }

(2)只替换第一个指定内容

  • 方法名:repalceFirst()

  • 使用String类型来调用
  • 举例:
public static void main(String[] args) {
        String str = new String("aabbccdd");
       String tmp= str.replaceFirst("a","xx");
        System.out.println(tmp);
    }

2.字符串拆分

(1)全部按指定拆分

  • 方法:split(String regex)
  • 使用String类型来调用
  • 拆分会形成多个字符串,需要拿String类型的数组接收
  • 举例:
public static void main(String[] args) {
      String str = new String("abc def ghi");
      String[] tmp = str.split(" ");//以空格作为拆分依据
        for (String s:tmp) {
            System.out.println(s);
        }
    }

(2)指定拆分n组

  • 方法:split(String regex, int limit)

  • 使用String类型来调用
  • 拆分会形成多个字符串,需要拿String类型的数组接收
  • 举例:
public static void main(String[] args) {
      String str = new String("abc def ghi");
      String[] tmp = str.split(" ",2);//拆成两组
        for (String s:tmp) {
            System.out.println(s);
        }
    }

(3)需要转义的拆分标志

  • 以这些标志来拆分的话需要转义:点号(.),竖线(|),加号(+),反斜杠(/),星号(*)
  •  点号(.):两个\\转义成一个\再与.转义
public static void main(String[] args) {
        String str = new String("aa.bb.cc");
        String[] tmp = str.split("\\.");
        for(String s:tmp) {
            System.out.println(s);
        }
    }

  • 反斜杠(/):
public static void main(String[] args) {
        String str = new String("aa\\bb\\cc");//两个\\表示一个\
        String[] tmp = str.split("\\\\");//四个\表示一个\
        for(String s:tmp) {
            System.out.println(s);
        }
    }
  • 加号(+):
public static void main(String[] args) {
        String str = new String("aa+bb+cc");
        String[] tmp = str.split("\\+");//2个\表示一个\
        for(String s:tmp) {
            System.out.println(s);
        }
    }

  • 竖线(|):
public static void main(String[] args) {
        String str = new String("aa|bb|cc");
        String[] tmp = str.split("\\|");//2个\表示一个\
        for(String s:tmp) {
            System.out.println(s);
        }
    }

  • 星号(*):
public static void main(String[] args) {
        String str = new String("aa*bb*cc");
        String[] tmp = str.split("\\*");//2个\表示一个\
        for(String s:tmp) {
            System.out.println(s);
        }
    }

(4)拆分多标志

  • 如果一个字符串中有多个分隔符,可以用"|"作为连字符
  • 举例:
public static void main(String[] args) {
        String str = new String("aa-bb cc");
        String[] tmp = str.split("-| ");//以-和空格拆分
        for(String s:tmp) {
            System.out.println(s);
        }
    }

3.字符串截取

(1)从指定位置截取到末尾

  • 方法:substring(int beginIndex)

  • 使用String类型来调用
  • 举例:
public static void main(String[] args) {
        String str = new String("0123456");
        String tmp = str.substring(2);//从2下标开始截取
        System.out.println(tmp);
    }

(2)截取指定区间

  • 方法:substring(int beginIndex, int endIndex)
  • 指定区间为前闭后开,如[3,5)
  • 举例:
public static void main(String[] args) {
        String str = new String("0123456");
        String tmp = str.substring(2,5);//截取[2,5)
        System.out.println(tmp);
    }

4.其他方法

  • 功能:去掉字符串中的左右空格,保留中间空格
  • 方法:String trim()
  • 举例:
public static void main(String[] args) {
        String str = new String("  I love you  ");
        System.out.println(str);//未去空格
        System.out.println(str.trim());//去掉空格
    }

五、String类的总结

1.字符串不可改变

(1)String类就是用来定义字符串的,而字符串中的内容不可修改

(2) 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

(3)简单认识String类

  • 这两个final都不是字符串不能被修改的原因

2.不可修改的原因

(1)原因1

  • 常量字符串不可被修改,如:
String str = "abcd";

(2)原因2

  • 想要修改字符串,就是拿要value指向的数组

如:

public static void main(String[] args) {
      char[] value = {'a','b','c','d'};
      value[1] = 'x';//修改数组内容
      value = new char[10];//指向新的对象
    }

加final前:

加了final后

  • 可以修改数组但不是字符串
public static void main(String[] args) {
      char[] arr = {'a','b','c','d'};
      arr[0] = 'x';
      arr[1] = 'q';
        String str = new String(arr);
        System.out.println(str);
    }

六、StringBuilder和StringBuffer

前言:SrtingBuilder和StringBuffer都是两个特殊的类,与String类似,都是字符串类型。

1.StringBuilder与StringBuffer介绍

(1)StringBuilder

  • 用来实例化对象
public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder("abcd");
        System.out.println(stringBuilder);
    }

  • 不能直接赋值常量字符串

  • StringBuilder中操作字符串的方法:和String类差不多,但是方法比String类少一些

  • append方法:拼接字符串
public static void main(String[] args) {
        StringBuilder stirngBuilder = new StringBuilder("abcd");
        stirngBuilder.append("1234");//在字符串后面拼接1234
        stirngBuilder.append("xxx").append("ppp");//可以多次拼接
        System.out.println(stirngBuilder);//操作的都是同一个对象
    }

  • reverse() 方法:逆置字符串
public static void main(String[] args) {
        StringBuilder stirngBuilder = new StringBuilder("abcd");
        stirngBuilder.reverse();
        System.out.println(stirngBuilder);
    }

  • StringBuilder对字符串操作不会产生新对象

(2)StringBuffer

  • 实例化对象
public static void main(String[] args) {
        StringBuffer stringBuffer  =new StringBuffer("abcd");
        System.out.println(stringBuffer);
    }

  • 同样不能直接赋值常量字符串

  • StringBuffer中同样有很多的方法
  • StringBuffer与StringBuilder内部很相似,后面不介绍

2.三者关系与区别

(1)StringBuffer与StringBuilder的区别

  • StringBuffer用于多线程部分,每次只能有一个对象调用该方法(一个马桶一个人)

(2)StringBuilder与String的相互转化

  • StringBuilder变为String: 调用toString()方法
public static void main(String[] args) {
       StringBuilder stringBuilder = new StringBuilder("abcd");
       String str = stringBuilder.toString();
        System.out.println(str);
    }

  • String变为StringBuilder:第一种,直接调用构造方法
public static void main(String[] args) {
       String str = new String("abcd");
       StringBuilder  stringBuilder = new StringBuilder(str);//调用构造方法
        System.out.println(stringBuilder);
    }

  • String变为StringBuilder:第二种,调用append()方法
public static void main(String[] args) {
       String str = new String("abcd");
       StringBuilder stringBuilder = new StringBuilder();
       stringBuilder.append(str);
        System.out.println(stringBuilder);
    }

(3)StringBuffer、StringBuilder和String的区别

  • String对象中的内容无法修改(每次操作都会产生新对象)
  • StringBuffer与StringBuilder可以修改(操作的都是同一个对象)
相关文章
|
6天前
|
索引 Python
String(字符串)
String(字符串)。
12 3
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
55 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
28天前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
37 4
|
29天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
24 2
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
51 4
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
33 5
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
25 2
|
1月前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
63 2
|
1月前
|
C语言 C++
C++番外篇——string类的实现
C++番外篇——string类的实现
20 0