String

发布时间 2023-09-09 11:49:22作者: SimpleWord
title: String
index_img: img/5.svg
tags:
  - Java SE
  - 字符串
categories:
  - Java SE
hide: false
excerpt: String、对象创建、字符串方法

String

String字符串的内容不会发生改变,它的对象在创建后不能被更改

创建对象

//直接创建(常用)
String str = "Tom"

// new 构造
	String str = new String(); //空白字符串
	
	char[] charArry = {'a','b',...};   
	String str = new String(charArry); //要修改字符串的值,只需要修改字节数组就可以了【字符数组】
 
	byte[] bytes = {99,98,100};
	String str = new String(bytes); //要修改字符串的值,只需要修改字节数组就可以了【字节数组】
public class Test {
    public static void main(String[] args) {
        String s = "hello";
        s = "java";
        s = "kk";
    }
}

Test创建了3个对象,都在字符串常量池,随着赋值,对象s的指向新对象java,最后指向kk

String对象创建

String str = "abc";

这种形式会在字符串常量池创建abc对象,如果已经存在了abc对象,就不会创建,而是直接引用

下方案例创建了1个对象,字符串常量池中的abc

new String = new String("abc");
  • 如果常量池中没有abc,会在常量池中创建对象,在堆中也创建对象,堆中对象引用常量池中的对象

  • 如果常量池有abc,则在堆中创建对象,堆中对象引用常量池中的对象

下方案例

  • 前者创建了2个对象,字符串常量池的abc堆中String对象
  • 后者创建了1个对象,即堆中String对象

常用操作

字符串比较

  • equals(str):两个比较值完全一样
  • equalsIgnoreCase:忽略大小写(英文)

==equals

特征 == equals()
用途 比较两个变量或对象的值是否相等 比较两个对象内容是否相等
适用类型 基本类型和用类型 主要适用于引用类型
比较规则 对于基本类型,比较它们的值 默认情况下,比较对象的引用地址,但可以通过重写equals()方法来改变比较规则
返回值 对于基本类型,如果相等返回true,否则返回false 如果对象内容相等返回true,否则返回false
注意事项 对于引用类型==比较的是对象的引用地址,而不是对象的内容 在使用equals()方法前,需要确保对象不为null

注意,String已经重写了equals,对于String对象比较的是对象的值。

public class Test {
    public static void main(String[] args) {
        String str1 = "Hello"; //常量池
        String str2 = "Hello"; //常量池
        String str3 = new String("Hello"); //堆

        System.out.println(str1 == str2); //true,地址相同
        System.out.println(str1 == str3); //false,地址不同

        System.out.println(str1.equals(str2)); //true,值相同
        System.out.println(str1.equals(str3)); //true,值相同
    }
}

根据索引返回字符

public char charAt(int index);
public class Test {
    public static void main(String[] args) {
        String str = "Hello,Java! ";
        byte num1 = 0;
        byte num2 = 0;
        byte num3 = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if ('A' <= c && c <= 'Z') {  //大写字母
                num1++;
            } else if ('a' <= c && c <= 'z') { //小写字母
                num2++;
            } else { //其它符号
                num3++;
            }
        }
        System.out.println("大写字母有" + num1 + "个"); //大写字母有2个
        System.out.println("小写字母有" + num2 + "个"); //小写字母有7个
        System.out.println("其它字符有" + num3 + "个"); //其它字符有3个
    }
}

返回指定索引开始到结束的子字符串

substring(start, end)包含左边,不包含右边

public class Test {
    public static void main(String[] args) {
        String str = "Hello, World!";
        String sub1 = str.substring(7); //7到末尾
        System.out.println(sub1); // 输出:World!

        String sub2 = str.substring(0, 5);
        System.out.println(sub2); // 输出:Hello

    }
}

返回定字符串在原字符串中第一次出现和最后一次出现的索引位置

public class Test {
    public static void main(String[] args) {
        String str = "Hello, World!";
        int firstIndex = str.indexOf('l');
        System.out.println(firstIndex); // 输出:2

        int lastIndex = str.lastIndexOf("l");
        System.out.println(lastIndex); //输出:10
    }
}

大小写转换

public class Test {
    public static void main(String[] args) {
        String str = "Hello, World!";
        String lowerCase = str.toLowerCase();
        System.out.println(lowerCase); // 输出:hello, world!

        String upperCase = str.toUpperCase();
        System.out.println(upperCase); // 输出:HELLO, WORLD!
    }
}

去除字符串两端的空白字符

public class Test {
    public static void main(String[] args) {
        String str = "   Hello, World!   ";
        String trimmedStr = str.trim();
        System.out.println(trimmedStr); // 输出Hello, World!
    }
}