【Java】—— String类

1、String类的概念

String类是Java中的一个类,用于表示字符串。它是Java中最常用的类之一,用于处理文本。

2、创建 String 对象的方法

最常用的有以下三种:

2.1、使用常量串构造

String s1 = "hello";

2.2、使用 new String 对象构造

String s2 = new String("hello");

2.3、使用数组进行构造

char[] chars = {'h','e','l','l','o'};
String s3 = new String(chars);

3、字符串常量池

字符串常量池(String Pool)是Java中的一个特殊区域,用于存储字符串常量。在Java中,字符串常量池是在编译过程中就把代码里涉及的字符串常量收集好,等到程序启动,就立刻把这些常量创建好对应的 String 对象,放在一起就构成了 字符串常量池 。

这种存储字符串对象的缓存机制,可以避免重复创建相同内容的字符串对象,提高内存利用率。

4、字符串内存存储

代码示例1:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1==s2);
    }
}

这里创建了两个字面值常量 "hello" ,它就会被放在字符串常量池中,而字符串常量池里是不会有重复的,所以这里的 s1 和 s2 实际指向的是一个地址,可以通过 == 来验证

当使用 2.1 创建一个字符串常量时,Java会首先在字符串常量池中查找是否存在相同内容的字符串对象。如果存在,则直接返回该对象的引用;如果不存在,则在常量池中创建一个新的字符串对象,并将其引用返回。

代码实例2

public class Test {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1==s2);
    }
}

当使用 2.2 的方式创建一个字符串常量,程序会开辟的一个新的空间,内容是来自常量池中的一份拷贝,再通过 == 号去判断,可以看到引用的是两个不同的地址(所以这里更推荐使用 2.1 的写法,不容易对空间造成浪费)

由于字符串是不可变的,所以字符串常量池中的字符串对象一旦创建就无法修改。当我们对字符串进行连接、截取等操作时,实际上是创建了新的字符串对象,而原有的字符串对象仍然存在于字符串常量池中。

5、String类的核心方法

5.1 字符串的比较

比较相等关系:

分为两种,一个是对引用地址进行比较(只在学习语法时使用),另一个是对字符串的内容比较是否对应一致,需要使用到 equals 方法

语法格式:

字符串1.equals(字符串2)
//这里的字符串可以是变量名引用的,也可以是字面值常量
//equals 区分大小写
//相等返回ture,不相等返回false

代码示例:

//针对 String 引用进行比较
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));

//执行结果:true
//针对 String 字面值常量进行比较
String s3 = "hello";
System.out.println(s3.equals("hello"));

//执行结果:true

比较大小关系:

用 compareTo 方法,可以通过 “字典序” 规则,对字符逐一判断

语法格式:

字符串1.compareTo(字符串2)

//比较汉字是无意义的
//返回结果
//<0 字符串1 > 字符串2
//>0 字符串1 < 字符串2
//=0 字符串1 == 字符串2 

代码示例:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println("hello".compareTo(s2));
    }
}

//运行结果:
//0
public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hell";
        System.out.println("hello".compareTo(s2));
    }
}

//运行结果:
//1

5.2 字符串的查找

主要分为下面三种

给定下标,获取对应的字符( charAt 

字符串1.charAt(字符串2)

代码示例:

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        System.out.println(s1.charAt(0));
        System.out.println(s1.charAt(1));
    }
}

//运行结果:
//h
//e
public class Test {
    public static void main(String[] args) {
        String s1 = "你好";
        System.out.println(s1.charAt(0));
        System.out.println(s1.charAt(1));
    }
}
//运行结果:
//你
//好

indexOf:查找该字符串中某个子字符串(从左往右)

lastIndexOf:查找该字符串中某个子字符串(从右往左)

语法格式:

字符串1.indexOf(字符串2)
字符串1.lastIndexOf(字符串2)

//查找的子串在字符串中一定是连续的
//当查找到时,返回子串第一个字符所在的下标
//有多个子串时返回第一个子串所在的下标
//没有找到返回-1

代码示例:

public class Test {
    public static void main(String[] args) {
        String s1 = "abcdef";
        System.out.println(s1.indexOf("bc"));
        System.out.println(s1.lastIndexOf("bc"));
    }
}
   
//运行结果:
//1
//1
public class Test {
    public static void main(String[] args) {
        String s1 = "abcabcabc";
        System.out.println(s1.indexOf("abc"));
        System.out.println(s1.lastIndexOf("abc"));
    }
}

//运行结果:
//0
//6

5.3 字符串的转换

5.3.1、数字转字符串

一、Java中 String 的拼接,可以把其他类型自动转成 String

int n = 10;
String s = "" + n;

二、通过 valueOf 方法对字符串转换

valueOf 是 String 的类方法,通过 类名. 的方式进行调用,不需要创建实例

int n = 10;
String s = String.valueOf(n);

5.3.2、字符串转数字

使用 Integer.parseInt 可以转为整数

String s = "10";
int n = Integer.parseInt(s);

也可以转为 Double 类型

String s = "10.5";
Double n = Double.parseDouble(s);

5.3.3、字符串转大写

String s = "abcd";
System.out.println(s.toUpperCase());

5.3.4、字符串转小写

String s = "ABCD";
System.out.println(s.toLowerCase());

5.3.5、字符串转为字符数组

转化方式根据不同单位分为两种

转成字符数组:

public class Test {
    public static void main(String[] args) {
        String s = "你好";
        char[] chars = s.toCharArray();
        for(char c : chars){
            System.out.println(c);
        }
    }
}

//运行结果
//你
//好

转成字节数组:

public class Test {
    public static void main(String[] args) {
        String s = "你好";
        byte[] bytes = s.getBytes();
        for(byte b : bytes){
            System.out.printf("%x\n",b);
            //通过十六进制来表示,一个16进制刚好对应一个字节
        }
    }
}

//运行结果
//e4
//bd
//a0
//e5
//a5
//bd

Java中一个汉字可以通过一个 char 来表示,一个 char 占2个字节,这里打印两个汉字却出来6个字节,这是因为编码方式的不同,使用 char 时,使用了 utf16 来表示,这时就是占2个字节,当字符串转成字节数组是,则使用 utf8 来进行表示,所以是3个字节

5.3.6、格式化字符串

让字符串使用特定格式输出

一、printf

int x = 10;
System.out.printf("x=%d",x);

二、format

int x = 10;
String s = String.format("x = %d\n",x);
System.out.println(s);

5.4 字符串的替换

 replace:替换字符串中所有的字符

String s = "张同学,张同学";
System.out.println(s.replace('张','王'));
System.out.println(s.replace("张同学","王老师"));

//运行结果
//王同学,王同学
//王老师,王老师

 replaceFirst:替换找到的第一个字符串

String s = "张同学,张同学";
System.out.println(s.replaceFirst("张","王讯"));

//运行结果
//王迅同学,张同学

5.5 字符串拆分

指定一个分隔符号,把一个字符串拆成多个部分,得到一个字符串数组

String s = "张同学,王同学,陈同学";
String[] students = s.split(",");
for(String student : students){
    System.out.println(student);
}

//运行结果
//张同学
//王同学
//陈同学

当修改参数为"."时,就不会有任何的打印

String s = "张同学.王同学.陈同学";
String[] students = s.split(".");
for(String student : students){
    System.out.println(student);
}

//运行结果

这是因为 split 传入的形参是 regex (正则表达式),是一种特殊的字符串,其中包含了一些特殊的字符,这些特殊字符有特定的含义,描述了字符串的“一系列特征”,“,后续就可以通过正则表达式这样的字符串来匹配其他的字符串

 . ” 就是正则表达式中的特殊字符,要想使用原始的 " . " ,就需要进行转义

在Java中的字符串常量中,转义字符还需要被转义一下,也就是 \\

5.6 字符串截取

使用 substring 方法进行拆分,主要分为两种

String substring(int beginIndex) //从指定位置截取到末尾
String s = "abcdefg";
System.out.println(s.substring(2));

//运行结果
//cdefg
String substring(int beginIndex,int endIndex)
//截取指定区间[beg,end)
String s = "abcdefg";
System.out.println(s.substring(2,5));

//运行结果
//cde

5.7 去除左右两边的空白符

使用 trim 方法,可以去掉空格、换行、回车、制表等等,不会影响中间的空白符

String s = "   hello   \f     \n    \t     ";
System.out.println(s.trim());

//运行结果
//hello

5.8 intern 方法

手动把字符串添加到常量池中 

//这里创建的常量并不会添加到常量池里
String s = new String("hello");
//可以通过 == 来进行判断
System.out.println(s == "hello");

//运行结果
//false

这个时候就可以使用 intern 方法

String s = new String("hello");
String s2 = s.intern();
System.out.println(s2 == "hello");

//运行结果
//true

6、字符串的不可变性

注意:String 中的所有方法,都不会修改 String 本身,能修改的只有引用的位置

String类并没有提供任何一个 public 的,用来修改 value 数组的内容的方法

7、字符串修改

Java 还提供了另一个可变的字符串 StringBuilder ,用法和 String 非常相似,可以方便的和 String 相互转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值