String

2020-09-18  本文已影响0人  是归人不是过客

java.lang.String是字符串类型

1、字符安川一旦船舰不可再改变。“abc”字符串对象一旦创建,不可在改变称“abcd”

2、提升字符串的访问效率,在程序中使用”缓存“技术,所以java中所使用”双引号 “括

起来的字符串都会在”字符串常量池“中创建一份,字符串常量池中被存储

3、在程序执行过程中,如果程序用到某个字符串,例如”abc“,那么程序会在字符串

常量池中去搜索该字符串,如果没有找到则在字符串常量池中新建一个”abc“字符串,

如果找到则直接拿过来用(字符串常量是一个缓存区,为了提高访问字符串效率)

public class Test{
    public static void main(String[] args) {
        // 创建一个"abc"字符串对象,该对象得内存地址,让s1变量保存
        // s1是引用,s1指向"abc"对象
        String s1 = "abc";
        
        //可以让s1重新指向,s1是局部变量且没有final,所以s1可以从新指向
        s1 = "def";
        
        String s2 = "hello"; // 字符串常量池中新建一个hello字符串对象,该对象不变
        String s3 = "hello"; //内存地址中直接拿来
        
        System.out.println(s2 == s3); //true
        
        // 比较两个字符串是否相等,不能用”==“
        String s4 = new String("abc");
        String s5 = new String("abc");
        
        System.out.println(s4 == s5); //false
        
        System.out.println(s4.equals(s5)); // true
        
    }
}

分析一下程序创建对象的区别

1、String s1 = "abc"; 只会在字符串常量池中创建一个"abc"字符串对象

2、String s2 = new String("abc");会在字符串常量池中创建一个hello字符串对象,并且会在堆中再创建一个字符串对象

第二种方式比较浪费内存,常用的是第一种。

public class Fox{
    public static void main(String[] args) {
        
        String s1 = "abc";
        String s2 = new String("abc");
        
    }
}

面试题:

判断下面程序能创建几个对象

public class Test{
    public static void main(String[] args) {
        // 判断以下程序能创建几个对象
        String s1 = new String("hello");
        String s2 = new String("hello");
        // 答:三个对象
        //堆中两个,方法区字符串常量池中1个
    }
}

注意:

1、 使用String的时候我们应该注意的问题,尽量不要使用字符串频繁拼接的操作,因为

字符串一旦创建不可改变,频繁拼接,就会在字符串常量池总创建大量的字符串,对

象,给垃圾回收带来问题。

2、

public class Fox{
public static void main(String[] args) {

    String s1 = "abc";
    
    String s2 = new String("abc");
    
    byte[] bytes = {97,98,99,100};
    String s3 = new String(bytes);
    System.out.println(s3); // abcd String已经重写了Object中toString方法        
}

}

上一篇 下一篇

猜你喜欢

热点阅读