String详解

String详解

1 存储原理

  • String属于java.lang.String类,表示字符串,是引用数据类型。

  • 使用双引号括起来的都是String对象,在整个生命周期内是不可变的。

  • 显式的String常量放在方法区中的常量池,String对象放在堆中。

  • 垃圾回收器是不会释放常量的。

    package com.yupeng.string;
    
    public class StringTest01 {
        public static void main(String[] args) {
            // 字符串拼接表示一个新的字符串对象,所以以下两行代码表示共创建了3个字符串对象,分别是"abc","xy","abcxy"
            String sa = "abc"; // sa中保存的是字符串"abc"的内存地址
            String sb = "abc"+ "xy" ; // sb中保存的是字符串"abcxy"的内存地址
            
            
            // 第一句执行后在常量池中创建了一个字面量为string1的String类型对象
            // 第二句执行时,常量池中已经存在string1,就不再创建新的String类型对象
            // ==双等号比较的是引用中保存的对象地址
            // 引用s1和s2在栈中,保存的都是"string1"字符串对象在方法区内存池的内存地址
            String s1 = "string1";
            String s2 = "string1";
            System.out.println(s1 == s2); // true
    
            /*以下例子表明字符串对象之间的比较不能使用==,要调用String类的equals方法*/
            // 在类加载时,就在常量池中创建了一个值为string2的String对象
            // 第一句执行时会在堆里创建new String("string2")对象
            // 第二句执行时,因为常量池中存在string2,所以就不再创建新的String对象了,直接在堆里创建new String("string2")对象。
            // 两个引用s3和s4指向两个不同的堆中的String对象,但这两个对象中保存的都是同一个字面量String2的内存地址
            String s3 = new String ("string2");
            String s4 = new String ("string2");
            System.out.println(s3 == s4); // false
            System.out.println(s3.equals(s4)); // true
    
            // 分析以下程序共创建了几个对象?
            // 共3个:方法区常量池1个:"hello";堆内存中两个String对象
            String str1 = new String ("abcd");
            String str2 = new String ("abcd");
        }
    }

2 常用方法

2.1 常用构造方法

package com.yupeng.string;

public class StringTest02 {
    public static void main(String[] args) {
        // 最常用的方式
        String s1 = "hello world!";

        // 将字节数组转换为字符串
        byte[] bytes = {97, 98, 99}; // 97是a,98是b,99是c
        String s2 = new String(bytes);
        // String类已经重写了toString方法,输出字符串对象的时候,不是输出内存地址,而是输出对象本身
        System.out.println(s2); // abc
        System.out.println(s2.toString()); // abc

        // String(字节数组,数字元素的下标起始位置,长度)
        // 将字节数组中的一部分字符转换为字符串
        String s3 = new String(bytes, 1, 2);
        System.out.println(s3); // bc

        // 将字符数组转换为字符串
        char[] chars = {'你', '好', '世', '界'};
        String s4 = new String(chars);
        System.out.println(s4); // 你好世界
        
        // 将字符数组中的一部分字符转换为字符串
        // String(字符数组,下标起始位置,长度)
        String s5 = new String(chars, 2, 2);
        System.out.println(s5); // 世界
    }
}

2.2 charAt方法

输出指定位置的字符

public class StringTest03 {
    public static void main(String[] args) {
        String s1 = "中国人";
        char c = s1.charAt(1);
        System.out.println(c);
    }
}

2.3 compareTo方法

字符串之间比较大小(了解)

public class StringTest03 {
    public static void main(String[] args) {
        System.out.println("abcd".compareTo("abcd")); // 0
        System.out.println("abcd".compareTo("abcf")); // -2
        System.out.println("abcd".compareTo("abcc")); // 1
    }
}

2.4 contains方法

判断前面的字符串是否包含后面的字符串

System.out.println("abcd".contains("ab")); // true
System.out.println("abcd".contains("xyz")); // flase

2.5 endWith和startWith方法

判断当前字符串是否以某个字符串结尾或开始

System.out.println("test.java".endsWith(".java")); // true
System.out.println("test.java".endsWith(".txt")); // false
System.out.println("test.java".startsWith("test")); // true

2.6 equals方法

比较两个字符串方法是否相等,必须使用equals方法,不能使用"=="

2.7 equalsIgnoreCase方法

比较两个字符串方法是否相等,并且同时忽略大小写

System.out.println("ABc".equalsIgnoreCase("abc")); // true

2.8 getBytes方法

将字符串对象转换为字节数组

byte[] bytes = "ascm".getBytes();
for (int i = 0; i < bytes.length; i++) {
    System.out.println(bytes[i]); // 97 115 99 109
}

2.9 isEmpty方法

判断某个字符串是否为空字符串(底层通过length判断)

String s = "";
System.out.println(s.isEmpty()); // true

2.10 length方法

返回字符串的长度

System.out.println("abcd".length()); // 4
// 注意区分判断数组长度和字符串长度,判断数组长度是属性:.length,判断字符串长度是方法:.length()

2.11 replace方法

替换字符串

String newString = "http://www.baidu.com".replace("http://", "https://");
System.out.println(newString); // https://www.baidu.com

2.12 split方法

拆分字符串

String[] ymd = "1980-10-10".split("-"); // 以“-”将“1980-10-10”分隔符进行拆分
for (int i = 0; i < ymd.length; i++) {
    System.out.println(ymd[i]);
} // 1980 10 10

2.13 substring方法

截取字符串

System.out.println("substring方法");
System.out.println("http://www.baidu.com".substring(7)); // www.baidu.com
System.out.println("http://www.baidu.com".substring(7, 10)); // www  左闭右开,包含起始位置7,不包含结束位置10

2.14 toCharArray方法

将字符串转换称char数组

char[] chars = "你好世界".toCharArray();
for (int i = 0; i < chars.length; i++) {
    System.out.print(chars[i] + " "); // 你 好 世 界
}

2.15 toLowerCase和toUpperCase方法

转换为大小写

System.out.println("ABHSFKHdkjDGSH".toLowerCase()); // abhsfkhdkjdgsh
System.out.println("ABHSFKHdkjDGSH".toUpperCase()); // ABHSFKHDKJDGSH

2.16 trim方法

去除字符串前后空白

System.out.println("      hello    world!     ".trim()); // hello    world!

2.17 valueOf方法

String类中只有valueOf方法是静态方法,将非字符串转换为字符串

String str = String.valueOf(true);
System.out.println(str); // true
// 参数是一个对象的时候,自动调用该对象的toString()方法
// Customer类没有重写toString方法,所以输出的是内存地址
System.out.println(String.valueOf(new Customer())); // com.yupeng.string.Customer@1b6d3586
System.out.println(new Customer()); // com.yupeng.string.Customer@4554617c

class Customer{
}

System.out.println()方法调用了valueOf方法,而valueOf方法又调用了toString方法,所以打印输出到控制台的都是字符串。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值