Java String 类

Java String 类

1. 创建字符串

常见的构造 String 的方式

// 方式一:创建字符串最简单的方式如下:
String str = "Hello Bit";
// 方式二:和其它对象一样,可以使用关键字和构造方法来创建 String 对象
// 如下为用构造函数创建字符串:
String str2 = new String("Hello Bit");
// 方式三:使用字符数组做参数用构造函数创建字符串
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);

注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在上:

public static void main(String[] args)
    {
        String s1 = "Hello";              // String 直接创建
        String s2 = "Hello";              // String 直接创建
        String s3 = s1;                    // 相同引用
        String s4 = new String("Hello");   // String 对象创建
        String s5 = new String("Hello");   // String 对象创建
    }

其在内存中的布局如下图所示:

image-20210718203828420

如果我们将上述代码改为如下所示,那么更改s3,s1的值会发生变化吗?

String s1 = "Hello";              // String 直接创建
String s2 = s1;                    // 相同引用
s2 = "Good";
System.out.println(s1);
System.out.println(s2);

我们发现, “修改” s2 之后, s1 也没发生变化, 还是"Hello"

事实上, s2 = “Good” 这样的代码并不算 “修改” 字符串, 而是让 s2 这个引用指向了一个新的 String 对象,其内存布局如下图所示
在这里插入图片描述

2. 字符串比较相等

如果现在有两个int型变量,判断其相等可以使用 == 完成。

int x = 10 ;
int y = 10 ;
System.out.println(x == y); 
// 执行结果
true

如果说现在在String类对象上使用 == ?

代码1

String s1 = "Hello";
String s2 = "Hello"; 
System.out.println(s1 == s2); 
// 执行结果
true

代码2

String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
// 执行结果
false

​ 这是为什么呢?我们通过观察下面的内存布局就可以发现,通过代码1创建的两个字符串将指向指向同一个对象代码2创建的两个 String 对象相当于再堆上另外开辟了空间来存储"Hello" 的内容, 也就是内存中存在两份 "Hello”。

https://i.loli.net/2021/07/18/98T3ka1fsZiGO5o.png
在这里插入图片描述

String 使用 == 比较并不是在比较字符串内容,而是比较两个引用是否是指向同一个对象

那么我们该如何比较两个字符串值是否相等呢?

Java 中要想比较字符串的内容, 必须采用String类提供的equals方法.

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true

equals 使用注意事项

现在需要比较 str 和 “Hello” 两个字符串是否相等, 我们该如何来写呢?

String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));

在上面的代码中, 哪种方式更好呢?

我们更推荐使用 “方式二”. 一旦 str 是 null, 方式一的代码会抛出异常, 而方式二不会

String str = null;
// 方式一
System.out.println(str.equals("Hello"));  // 执行结果 抛出 java.lang.NullPointerException 异 常
// 方式二
System.out.println("Hello".equals(str));  // 执行结果 false

注意事项: “Hello” 这样的字面值常量, 本质上也是一个 String 对象, 完全可以使用 equals 等 String 对象的方法

3. 不可变字符串

字符串是一种不可变对象. 它的内容不可改变.

String 类的内部实现也是基于 char[] 来实现的, 但是 String 类并没有提供 set 方法之类的来修改内部的字符数组.

感受下形如这样的代码:

String str = "hello" ; 
str = str + " world" ; 
str += "!!!" ; 
System.out.println(str); 
// 执行结果
hello world!!!

形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是. 内存变化如下:

在这里插入图片描述

+= 之后 str 打印的结果却是变了, 但是不是 String 对象本身发生改变, 而是 str 引用到了其他的对象

那么如果实在需要修改字符串 例如, 现有字符串 str = “Hello” , 想改成 str = “hello” , 该怎么办?

借助原字符串, 创建新的字符串

str = "h" + str.substring(1);
System.out.println(str);
// 执行结果
hello

4. 空串与null串

空串**“”**是长度为零的字符串,可以调用以下代码检查一个字符串是否为空:

 if(s1.length()==0)
 或者
 if(s1.equals(""))

公众是一个java对象,有自己的长度(0)和内容(空),不过,String变量还可以存放一个特殊的值,名为null,表示目前没有任何对象与该变量关联。

5.常用字符串函数

5.1 charAt

public char charAt(int index) 返回指定索引处的 char 值。

代码示例:

String str = "hello" ; 
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h 
System.out.println(str.charAt(10)); 
// 执行结果
产生 StringIndexOutOfBoundsException 异常

5.2 toCharArray

public char[] toCharArray()  将此字符串转换为一个新的字符数组。 

代码示例:

String str = "helloworld" ; 
// 将字符串变为字符数组
char[] data = str.toCharArray() ; 
for (int i = 0; i < data.length; i++) 
{ 
 System.out.print(data[i]+" "); 
} 
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换

5.3 toUpperCase / toLowerCase

public String toUpperCase()//将此 String 中的所有字符都转换为大写
public String toLowerCase()//将此 String 中的所有字符都转换为小写

5.4 trim

public String trim()//返回字符串的副本,忽略前导空白和尾部空白。    

此方法可用于截去字符串开头和末尾的空白

代码示例:

 String s = "  abcdef ";
 System.out.println(s.trim());//abcdef

6. 字符串比较函数

6.1 equalsIgnoreCase

public boolean equalsIgnoreCase(String anotherString) 
//将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。 

代码示例:

String str1 = "hello" ; 
String str2 = "Hello" ; 
System.out.println(str1.equals(str2)); // false 
System.out.println(str1.equalsIgnoreCase(str2)); // true

6.2 compareTo

public int compareTo(String anotherString)
//按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;

代码示例:

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1 
System.out.println("刘".compareTo("杨"));

7. 字符串查找函数

7.1 contains

public boolean contains(CharSequence s)
//当且仅当此字符串包含指定的 char 值序列时,返回 true。 

代码示例:

String s = "你好 小白";
System.out.println(s.contains("白"));//true
System.out.println(s.contains("大"));//false

7.2 indexOf

public int indexOf(int ch)
//返回指定字符在此字符串中第一次出现处的索引。 如果未出现该字符,则返回 -1。

使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置

代码示例:

String s = "hello xatu";
System.out.println(s.indexOf("o"));//4
System.out.println(s.indexOf("z"));//-1

7.3 startsWith

public boolean startsWith(String prefix)
 //测试此字符串是否以指定的前缀开始。

7.4 endsWith

public boolean endsWith(String suffix)
//测试此字符串是否以指定的后缀结束。

代码示例:

 String s = "hello xatu";
 System.out.println(s.startsWith("hello"));//true
 System.out.println(s.startsWith("hi"));//false
 System.out.println(s.endsWith("xatu"));//true
 System.out.println(s.endsWith("xi"));//false

8. 字符串替换函数

8.1 replace

public String replace(CharSequence target,CharSequence replacement)
//使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。

8.2 replaceAll

public String replaceAll(String regex,String replacement)
//使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 

8.3 replaceFirst

public String replaceFirst(String regex, String replacement)
//使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 

代码示例:

String s = "ababcabcd";
System.out.println(s.replace("ab", "12"));//1212c12cd
System.out.println(s.replaceAll("ab", "12"));//1212c12cd
System.out.println(s.replaceFirst("ab", "12"));//12abcabcd

8.4 matches

public boolean matches(String regex)
//告知此字符串是否匹配给定的正则表达式。 

代码示例:

 String s = "[1]{1,3}";//正则表达式 意思为:1出现1~3次
 String s1 = "111";
 String s2 = "1111";
 System.out.println(s1.matches(s));//true
 System.out.println(s2.matches(s));//false

9.字符串拆分函数

split

public String[] split(String regex)
//根据给定正则表达式的匹配拆分此字符串。 

该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。

注意事项:

  1. 字符"|","*","+“都得加上转义字符,前面加上”".

  2. 而如果是"",那么就得写成"\".

  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符

代码示例:

 String s = "123 456 789";
 System.out.println(Arrays.toString(s.split(" ")));//[123, 456, 789]

10.字符串截取函数

substring

public String substring(int beginIndex)
// 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾   
public String substring(int beginIndex,int endIndex)
//返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。   

代码示例:

String s = "abcdef";
System.out.println(s.substring(2));//cdef
System.out.println(s.substring(2, 5));//cde




## 10.字符串截取函数

### substring

```java
public String substring(int beginIndex)
// 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾   
public String substring(int beginIndex,int endIndex)
//返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。   

代码示例:

String s = "abcdef";
System.out.println(s.substring(2));//cdef
System.out.println(s.substring(2, 5));//cde
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值