【Java】第二讲:字符串相关类

个人主页:深情秋刀鱼@-CSDN博客 

Java专栏:Java程序设计

目录

 一、String

1.Java中的数据类型

2.字符串概述

3.字符串构造方法

4.字符串构造内存原理

 5.字符串比较

6.字符串常见方法

二、StringBuilder 

1.定义

2.常用方法

 3.StringBuilder内存分析

三、StringJoiner

1.定义

2.常用方法


 一、String

1.Java中的数据类型

        在Java中数据类型被分为基本数据类型引用数据类型

  • 基本数据类型:数值存储在自己的空间而不是堆内存或其他的空间中,如int、float、double、boolean等
  • 引用数据类型:数值存储在其他的空间,本身的空间存储的是地址值,如数组、创建的对象、字符串等。

        在本节中,我们将介绍的字符串就是一种引用数据类型。

2.字符串概述

        a.在Java中所有字符串的定义都在java.lang.String中,在使用String定义字符串时应先导包。       

//导包
java.lang.String;

//定义
String s = "abcdef";

        b.字符串参与的所有运算都属于字符串的拼接操作。由于字符串的内容自创建之后就不能改变,所以每次执行字符串的拼接操作时都会在内存中重新申请空间储存拼接后的字符串。

String s1 = "abc";
String s2 = "123";
System.out.println(s1+s2);//执行结果:abc123

        在执行上面的代码时一共产生了三个字符串,分别是s1("abc")、s2("123")以及拼接后新产生的字符串"abc123"。       


String s1 = "abc";
s1="三连+关注";
System.out.println(s1);//执行结果:三连+关注

        c.字符串的值被创建后是无法改变的,因此在执行上面的代码时并没有改变"abc"里原本的内容,而是创建了一个新的字符串"三连+关注"并重新赋值给了s1。


        d.对于没有变量参与的字符串拼接操作是不同于有变量参与的拼接操作的。

  • 如果没有变量参与,系统会检查串池,如果串池中有该字符串,直接复用,没有再开辟新的内存空间。
  • 如果有变量参与,每一行代码都会创建新的字符串。

3.字符串构造方法

        a.直接定义

String s1 = "abc";
System.out.println(s1);//执行结果:abc

        b.通过new关键字获取一个空字符串

String s1 = new String();
System.out.println("!"+s1+"!");//执行结果:!!

        c.传递一个字符串,根据传递的字符串再构造一个新的字符串

String s1 = new String("abc");
System.out.println(s1);//执行结果:abc

        d.传递一个字符数组,根据字符数组的内容构造新的字符串

char[] ch = {'a','b','c'};
String s1 = new String(ch);
System.out.println(s1);//执行结果:abc

        e.传递一个字节数组,根据字节数组的内容构造新的字符串

byte[] by = {97,98,'c'};
String s1 = new String(by);
System.out.println(s1);//执行结果:abc

        在字节数组中,97和98不再代表整形,而是ASCII码表中码值为97、98的符号,即a、b。

4.字符串构造内存原理

        在Java中内存主要被分为栈、堆、方法区三部分(如下图)。

  • 栈:主要存储方法,方法开始执行时进栈,结束执时出栈。
  • 堆:存储对象或数组,使用new关键字时是在堆内存中开辟了空间。从键盘获取的字符串也是存储在堆中。
  • 方法区:存储可执行的class文件。

         在堆内存中,有一块被称作串池(String Table)的内存空间,它是专门用来存储字符串的内存空间。

        如果选择直接赋值(参考2.a)的形式构造字符串,系统会在串池中检查,如果两个字符串的内容完全相同,则直接服用已经构造好的字符串,而不会重新开辟空间存储,减少了空间浪费。

String s2 = "abc";
String s1 = "abc";//s1和s2中地址值是一样的

        而如果使用new关键字构造,系统不会检查串池并直接在堆空间中开辟内存。

String s2 = new String("abc");
String s1 = new String("abc");//使用new关键字构造的字符串地址不同

 5.字符串比较

        a.如果直接用==符号比较,可能并不能反馈正确的结果。由String定义的字符串是一种引用数据类型,在String创建的对象本身的空间中存储的是地址值,而不是数据,==符号比较的是对象本身内存中的数据,因此可能会输出错误的结果。

Scanner sc = new Scanner(System.in);//在键盘上输入"abc",输入的数据是存储在堆内存中的
String s1 = sc.next();
String s2 = "abc";
System.out.println(s1==s2);//执行结果:false

        b.比较两个字符串内容是否相同可以使用String类中的equals方法。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "abc";
boolean res = s1.equals(s2);//equals的返回值是boolean类型
System.out.println(res);//执行结果:true

        c.比较两个字符串内容是否相同且忽略大小写,使用String类中的equalsIgnoreCase方法。此处的忽略大小写只针对于英文字母而不针对于中文(如"1"和"一")。

Scanner sc = new Scanner(System.in);//输入"abc"
String s1 = sc.next();
String s2 = "Abc";
boolean res = s1.equalsIgnoreCase(s2);
System.out.println(res);//执行结果:true

6.字符串常见方法

  • public char charAt(int index);
  • 根据索引(索引下标从0开始)返回字符。
String s1 = "abcde";
char ch = s1.charAt(0);
System.out.println(ch);//执行结果:a

  • public int length();
  • 返回字符串的长度。
String s1 = "abcde";
int len = s1.length();
System.out.println(len);//执行结果:5

  • String substring(int begin,int end);
  • 从字符串中截取并返回下标从begin开始到end-1(不包含end)结束的字符串。
String s1 = "abcde";
String subs1 = s1.substring(0,2);//截取下标从0~1的字符串
System.out.println(subs1);//执行结果:ab

二、StringBuilder 

1.定义

        StringBuilder可以看作一个容器,不同于String,用StringBuilder创建的对象内容是可变的,它可以提高字符串的操作效率。

StringBuilder sb = new StringBuilder();

        括号中可传参可不传参。

2.常用方法

  •  toString();
  • 将StringBuilder类型的对象转换为String类型。
StringBuilder sb = new StringBuilder("abc");
String s1 = sb.toString();
System.out.println(s1);//执行结果:abc

        需要注意的是,通过StringBuilder创建的对象无法直接使用String中的方法,需要经过toString转换才能使用String中的方法。


  • append();
  • 向StringBuilder创建的对象中添加数据。
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.toString());//执行结果:abc
sb.append("123");
System.out.println(sb.toString());//执行结果:abc123

  • reverse();
  • 反转对象中的数据。
StringBuilder sb = new StringBuilder("abc123");
System.out.println(sb.toString());//执行结果:abc123
sb.reverse();
System.out.println(sb.toString());//执行结果:321cba

  • length();
  • 返回容器中字符串的长度。
StringBuilder sb = new StringBuilder("abc123");
int len = sb.length();
System.out.println(len);//执行结果:6

  • capacity();
  • 返回目前容器的容量。一个空的StringBuilder对象默认容量时16.
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16

 3.StringBuilder内存分析

        在创建StringBuilder的对象时,在内存中默认开辟容量为16的字节数组,如果载入的数据超容,则系统会自动 为StringBuilder扩容,新容量=老容量*2+2=34;如果新数据超容且超出自动扩容时的容量,那么新的容量以实际为准。

        需要注意的是,capacity指的是容器能容纳数据的空间大小,而length可以理解为存储在容器中的有效数据的长度。

  • 初始容量:16
StringBuilder sb = new StringBuilder();
System.out.println(sb.capacity());//执行结果:16

  • 数据内存没有超出默认扩容的内存空间(34)
sb.append("abcdefghijklmnopq");
System.out.println(sb.length());//执行结果:17
System.out.println(sb.capacity());//执行结果:34

  • 数据内存超出了默认扩容的内存空间
sb.append("abcdefghijklmnopqrstuvwxyz123456789");
System.out.println(sb.length());//执行结果:35
System.out.println(sb.capacity());//执行结果:35

三、StringJoiner

1.定义

         StringJoiner和StringBuilder一样。都可以看作一种容器,创建之后里面的内容是可变的。StringJoiner的代码编写十分简洁,可以快速有效的完成程序员指定的字符串拼接操作。StringJoiner是不支持空参构造的。

  • StringJoiner sj = new StringJoiner("---");
  • 创建一个对象,指定拼接时的间隔符号("---")。
StringJoiner sj = new StringJoiner("---");

  • StringJoiner sj = new StringJoiner("---", "[", "]");
  • 创建一个对象,指定拼接时的间隔符号("---")、开始符号("[")、结束符号("]")。
StringJoiner sj = new StringJoiner("---","[","]");

2.常用方法

  • public StringJoiner add(添加的内容);
  • 添加数据,并返回数据本身
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
System.out.println(sj);//执行结果:[aaa---bbb---ccc]

  • public int length();
  • 返回长度。这里的length同时包含间隔符号、开始符号、结束符号在内。
StringJoiner sj = new StringJoiner("---","[","]");
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
int len = sj.length();
System.out.println(len);//执行结果:17

  • public String toString();
  • 返回一个字符串。

  • 110
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 77
    评论
### 回答1: string常用方法之满足条件的子字符串: 1. substring(int beginIndex):返回从指定索引开始到字符串末尾的子字符串。 2. substring(int beginIndex, int endIndex):返回从指定索引开始到指定索引结束的子字符串。 3. startsWith(String prefix):判断字符串是否以指定的前缀开头。 4. endsWith(String suffix):判断字符串是否以指定的后缀结尾。 5. contains(CharSequence s):判断字符串是否包含指定的字符序列。 6. indexOf(int ch):返回指定字符在字符串中第一次出现的位置。 7. lastIndexOf(int ch):返回指定字符在字符串中最后一次出现的位置。 8. replace(char oldChar, char newChar):将字符串中的所有旧字符替换为新字符。 9. toLowerCase():将字符串中的所有字符转换为小写。 10. toUpperCase():将字符串中的所有字符转换为大写。 ### 回答2: string提供了很多方法来操作字符串,其中一个常用的方法是满足条件的子字符串。满足条件的子字符串是指符合某种特定要求的字符串片段。 其中一个方法是substring()方法,它可以从一个原始字符串中提取满足条件的子字符串。substring()方法接受两个参数,分别是起始索引和结束索引。起始索引是包含在子字符串中的第一个字符的索引,结束索引是不包含在子字符串中的第一个字符的索引。 下面是使用substring()方法来提取满足条件的子字符串的例子: ```java String str = "Hello World"; String subStr1 = str.substring(6); // 提取从索引为6开始的子字符串,结果为"World" String subStr2 = str.substring(0, 5); // 提取从索引为0到索引为5之间的子字符串,结果为"Hello" ``` 除了substring()方法,还可以使用其他方法来实现提取满足条件的子字符串,例如indexOf()方法和lastIndexOf()方法。这两个方法可以用来查找指定字符或子字符串在原始字符串中的位置,然后可以使用substring()方法来提取满足条件的子字符串。 总的来说,满足条件的子字符串可以通过使用substring()方法以及其他相关方法来实现。这些方法可以根据特定的条件(如起始索引、结束索引、指定字符或子字符串的位置等)来提取所需的子字符串。 ### 回答3: 满足条件的子字符串指的是在一个长字符串中符合某种特定条件的子串。 在Java中,使用String的常用方法可以满足这个需求。 常用方法包括: 1. substring方法:该方法可以从一个长字符串中截取子串。它接受两个参数,分别是开始位置和结束位置(不包括结束位置)。可以使用substring方法获取到满足条件的子字符串。 2. indexOf方法:该方法可以返回指定字符或字符串在原字符串中第一次出现的位置。可以使用indexOf方法找到满足条件的子字符串的起始位置。 3. charAt方法:该方法可以返回指定位置的字符。可以使用charAt方法检查满足条件的子字符串的某个位置上的字符是否符合条件。 4. startsWith和endsWith方法:分别用于检查一个字符串是否以指定的字符或子字符串开头或结尾。可以使用这两个方法来验证满足条件的子字符串的开头和结尾是否符合条件。 通过使用这些方法,我们可以遍历整个字符串,从中找到满足特定条件的子串。 例如,可以通过使用substring和indexOf方法找到一个长字符串中以指定字符开头的子字符串,或者通过使用startsWith和charAt方法找到一个长字符串中特定位置上的子字符串。 在编写代码时,需要注意处理边界情况,例如处理空字符串或长度较短的字符串等。同时,要根据具体需求合理选择使用上述方法中的哪些来实现满足条件的子串的获取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深情秋刀鱼@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值