详解String类型


一、创建字符串

常见的创建字符串的方式:
1.String str = “Hello”;//直接赋值
2.String str2 = new String(“Hello”);//new一个新的String
3.char[] array = {‘a’,‘b’,‘c’};
String str3 = new String(array);
注:被双引号("")引起来的东西是字符串常量,储存在堆中的常量池中,如果常量池中有这个常量,则直接用这个常量。String是引用类型

二、字符串比较相等

public class StringPractice {
    public static void main(String[] args) {
        boolean tmp ;
        String str = "Hello";
        String str1 = str;
        System.out.println(str == str1);
        String str2 = "He";
        String str3 = "llo";
        String str4 = str2 + str3;
        System.out.println(str == str4);
    }
}

运行结果:
在这里插入图片描述
上述程序中,str == str1和str == str4都是比较str这个引用是否指向同一个对象。
在这里插入图片描述
但是

String str = "Hello";
String str5 = "He" + "llo";
    System.out.println(str == str5);

运行结果
在这里插入图片描述
注:如果两个常量在运算时,编译器默认是运算后的值,所以他们都指向常量池中的Hello,所以运行结果为true。
比如:
在这里插入图片描述
这里就会报错,在计算时,它会将数值类型提升到int,因为在编译时,编译器不知道a和b里面存的是什么,但是如果被final修饰呢?
在这里插入图片描述
这里就不会报错,也是上面的原理。

equals使用注意事项
String str = new String(“Hello”);
1.System.out.println(str.equals(“Hello”));
2.System.out.println(“Hello”.equal(str));
这两种方法中,方法2更保险,防止了str为空的情况空指针异常

String str = "Hello";
String str2 = "He";
String str3 = "llo";
String str4 = str2 + str3;
System.out.println(str == str4);
System.out.println(str.equals(str4));

运行结果
在这里插入图片描述
这里equals直接比较引用所指的对象。

三、字符串常量池

在这里插入图片描述
在上面我们已经举了常量池的例子,常量被存放在常量池中,如果常量池中有这个常量,那就可以直接使用这个常量。

1.直接赋值
String str = “Hello”;
System.out.println(str);
2.采用构造方法
String str = new String(“hello”);

四、理解字符串不可变

字符串是一种不可变的对象,它的内容不可改变,如果改变对象内容,改变的是其引用的指向而已。String类的内部实现也是基于char[]来实现的,但是String类并没有提供set方法之类的来修饰内部的字符数组

String str = "hello" ; 
str = str + " world" ; 
str += "!!!" ; 
System.out.println(str);

运行结果

hello world!!!

形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是。那么如果实在需要修改字符串, 例如, 现有字符串 str = “Hello” , 想改成 str = “hello” , 该怎么办?
常见办法: 借助原字符串, 创建新的字符串
特殊方法:利用反射

五、字符、字节和字符串

1.字符与字符串

(1)public String (char value[]) (构造类型)
将字符数组中的所有内容变为字符串
(2)public String(char value[],int offset,int count) (构造类型)
将部分字符数组中的内容变为字符串
(3)public char charAt(int index) (普通类型)
取得指定索引位置的字符,索引从0开始
(4)public char[] toCharArray() (普通方法)
将字符串变为字符数组返回

ublic class GetPos {
    public static void main(String[] args) {
    	//获取指定位置字符
        String str = "hello";
        System.out.println(str.charAt(0));//下标从0开始
        //将字符串变为字符数组
        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));//部分转换
    }
}

运行结果
在这里插入图片描述

2.字节与字符串

字节常用于数据传输以及编码转换的处理中,String也能方便的和byte[]相互转换
(1)public String(byte byte[]) (构造类型)
将字节数组变为字符串
(2)public String(byte byte[],int offset,int length) (构造类型)
将部分字节数组转为字符串
(3)public byte[] getBytes() (普通类型)
将字符串以字节数组的形式返回
(4)public byte[] getBytes(String charsetName)throws UnsupportedEncodingException (普通类型)
编码转换处理

//字符串与字节数组的转换处理
        //String 转byte[]
        byte[] data2 = str.getBytes();
        for (int i = 0; i < data2.length; i++) {
            System.out.println(data2[i] + " ");
        }
        
        //byte[] 转 String
        System.out.println(new String(data2));

运行结果
在这里插入图片描述

六、字符串常见操作

1.字符串比较

(1)public boolean equals(Object anObject) (普通类型)
区分大小写比较
(2)public boolean equalsIanoreCase(String anotherString) (普通类型)
不区分大小写比较
(3)public int compareTo(String anotherString) (普通方法)
比较两个字符串大小关系

观察compareTo()比较

System.out.println("A".compareTo("a"));
        System.out.println("a".compareTo("A"));
        System.out.println("A".compareTo("A"));
        System.out.println("AB".compareTo("AC"));
        System.out.println("刘".compareTo("杨"));

运行结果
在这里插入图片描述

2.字符串查找

(1)public boolean contains(CharSequence s) (普通类型)
哦按段一个字符串是否存在
(2)public int indexOf(String str) (普通类型)
在主字符串中查找子字符串的位置,返回下标
(3)public int lastIndexOf(String str) (普通类型)
从后往前查找字符串位置
(4)public boolean startWith(String prefix) (普通类型)
判断是否以指定字符串开头
(5)public boolean endsWith(String suffix) (普通类型)
判断是否以指定字符串结尾

public class TestClass {
	public static void main(String[] args) {
        String str = "**@@HelloWorld";
        System.out.println(str.indexOf("World"));//由前往后找字符串位置
        System.out.println(str.indexOf("bit"));
        if(str.indexOf("Hello") != -1){
            System.out.println("可以查到指定字符串!");
        }
        System.out.println(str.lastIndexOf("W"));//从后往前找字符串位置
        System.out.println(str.startsWith("**"));
        System.out.println(str.endsWith("ord"));
    }
}

运行结果
在这里插入图片描述

3.字符串替换

(1)public String replaceAll(String regex,String replacement) (普通类型)
替换所有指定内容
(2)public String replaceFirst(Strinf regex,String replacement) (普通类型)
替换首个内容

public class TestClass {
	public static void main(String[] args) {
		String str = "**@@HelloWorld";
		System.out.println(str.replaceAll("l","@"));
        System.out.println(str.replaceFirst("l","&"));
    }
}

运行结果
在这里插入图片描述

4.字符串拆分

(1)public String[] split(String regex) (普通类型)
将字符串全部拆分
(2)public String[] split(String regex,int limit) (普通类型)
将字符串部分拆分

public class TestClass {
	public static void main(String[] args) {
		String str2 = "hello wo&rld hel&lo bit";
	    String[] s = str2.split(" ");
	    String[] s2 = str2.split("&");
	    for (int i = 0; i < s.length; i++) {
	        System.out.print(s[i] + " ");
	    }
	    System.out.println();
	    for (int i = 0; i < s2.length; i++) {
	        System.out.print(s2[i] + " ");
	    }
	}
}

运行结果
在这里插入图片描述

5.字符串截取

(1)public String substring(int beginIndex) (普通类型)
从指定索引截取到结尾
(2)public String substring(int beginIndex,int endIndex) (普通类型)
截取部分内容

public class TestClass {
	public static void main(String[] args) {
	    String str3 = "helloworld";
	    System.out.println(str3.substring(4));
	    System.out.println(str3.substring(4,8));
	}
}

运行结果

6.其他操作

(1)public String trim() (普通类型)
去掉字符串中的左右空格(换行,制表符等),保留中间空格
(2)public String toUpperCase() (普通类型)
字符串转大写,只转换字母
(3)public string toLowerCase (普通类型)
字符串转小写,只转换字母
(4)public native String intern() (普通类型)
字符串入池操作
(5)public String concat(String str) (普通类型)
字符串连接,等同于+,不入池
(6)public int length() (普通类型)
取得字符串长度
(7)public boolean isEmpty() (普通类型)
判断是否为空字符串,但不是null,而是长度为0

public class TestClass {
	public static void main(String[] args) {
		String str4 = "   hello world   ";
        System.out.println(str4);
        System.out.println(str4.trim());//去除前后空格,保留中间空格

        System.out.println(str4.toUpperCase());//小写转大写
        System.out.println(str4.toLowerCase());//大写转小写
        System.out.println(str4.length());//字符串长度
	}
}

运行结果
在这里插入图片描述

七、StringBuffer和StringBuilder

通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。
StringBuffer 和 StringBuilder 大部分功能是相同的,StringBuffer的方法前面都有synchronized,为了保护多线程安全。
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:

public synchronized StringBuffer append(各种数据类型 b) 

代码示例

		String str = "hello";
        String str2 = "world";
        StringBuffer sb = new StringBuffer();
        sb.append(str);
        sb.append(str2);
        String str3 = sb.toString();
        System.out.println(sb);

运行结果
在这里插入图片描述
注意:在循环中不要用String += 来拼接字符串。
String、StringBuffer和StringBuild的区别
1.String的拼接会产生新的对象,但其他两个使用append方法进行拼接,返回的是自己当前的对象
2.String的拼接会被优化为StringBuild
3.多线程使用StringBuffer进行字符串的拼接,采用同步处理,保护了多线程的安全
单线程使用StringBuild进行字符串的拼接
4.String的内容不可修改,StringBuffer和StringBuild的内容可以修改。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 C++ 中,string 是一个类,可以用来存储和操作字符串。使用 string 类型需要包含头文件 <string>。 string 类型的特点如下: 1. 可以动态改变字符串的长度。 2. 支持下标访问、迭代器操作和常用的字符串操作函数(如 find、substr 等)。 3. 可以与 C 语言的字符串(即以 '\0' 结尾的字符数组)进行互相转换。 下面是一些常用的 string 类型操作: 1. 初始化字符串: ```cpp string str1 = "hello"; // 直接用字符串初始化 string str2("world"); // 用字符数组初始化 string str3(5, 'a'); // 用字符和长度初始化 ``` 2. 获取字符串长度: ```cpp int len = str.length(); // 获取字符串长度 ``` 3. 字符串拼接: ```cpp string str4 = str1 + str2; // 直接使用加号拼接字符串 str1 += str2; // 使用加等于号拼接字符串 ``` 4. 字符串查找: ```cpp int pos = str.find("world"); // 查找子串,返回第一次出现的位置 ``` 5. 字符串截取: ```cpp string substr = str.substr(pos, len); // 截取子串,从 pos 开始,长度为 len ``` 6. 字符串转换为字符数组: ```cpp const char* cstr = str.c_str(); // 获取指向字符数组的指针 ``` 7. 字符数组转换为字符串: ```cpp string str5 = "hello"; const char* cstr2 = "world"; string str6 = str5 + cstr2; // 直接使用加号拼接字符串和字符数组 string str7(cstr2); // 使用字符数组初始化 ``` 以上是 string 类型的一些常用操作,具体用法还需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心事付流年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值