Java基础String字符串存储原理

简介: Java基础String字符串存储原理

关于java jdk中内置的一个类:java.lang.String


1、String表示字符串对象,属于引用数据类型,不属于基本数据类型

2、在java中随便使用双引号括起来的都是String对象。例如:“abc”、“def”、“HElloWorld”这3个String对象

3、java规定,双引号括起来的字符串,是不可变的,也就是说“abc”自出生至死,不可变,不能变成“abcd”,也不可能变成“ab”

4、在jdk中双引号括起来的字符串,例如“abc”、“def”都是直接存储在“方法区”的“字符串常量池”当中的

为什么SUN公司把字符串存储在一个“字符串常量池”当中呢。因为字符串在实际的开发中使用太频繁。为了

执行效率,所以把字符串放到了方法区的字符串常量池当中。


示例代码01:


public class StringTest01 {
    public static void main(String[] args) {
        //这两行代表示底层创建了3个字符串对象,都在字符串常量池当中
        String a = "abcdef";
        String b = "abcdef" + "xy";
        //分析:这是使用new的方式创建的字符串对象。这个代码中的“xy”是从哪来的?
        //凡是双引号括起来的都在字符串常量池中有一份
        //new对象的时候一定在堆内存当中开辟空间
        String c = new String("xy");
    }
}


内存分析图01:


0a2653c851af460fa595bd959398a8f1.png


示例代码02:


public class StringTest02 {
    public static void main(String[] args) {
        //"hello"是存储在方法区的字符串常量池中
        //所以这个“hello”不会创建。(因为这个对象已经存在了!)
        String s = "hello";
        String s1 = "hello";
        //分析结果是true还是false
        //双等号比较的是不是变量中保存的内存地址?是的
        System.out.println(s == s1);//true
        String s2 = new String("xy");
        String s3 = new String("xy");
        System.out.println(s2 == s3);//false
        //String类重写了equals方法,所以使用equals方法比较保险
        //通过此案例,我们知道,字符串对象之间的比较不能使用“==”
        System.out.println(s2.equals(s3));//true
        String s5 = new String("testString");
        System.out.println(s3.equals("testString"));//false存在空指针异常,不建议这样写
        //String k = null;
        //"testString"这个字符串可以后面加“.”呢?
        //因为“testString”是一个String字符串对象。只要是对象都能调用方法。
        System.out.println("testString".equals(s3));//false建议使用此方式,因为此方式可以避免空指针异常
    }
}


内存分析图02:


2d65d23f6d4748949b924e4057485923.png


示例代码03:


class User {
    private int no;
    private String name;
    public User(){
    }
    public User(int no,String name){
        this.no = no;
        this.name = name;
    }
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class UserTest {
    public static void main(String[] args) {
        User u = new User(100,"张三");
    }
}


内存分析图03:


6de278e6d6694ce5bb08e7e842b7e74b.png


常见面试题:


public class StringTest03 {
    public static void main(String[] args) {
        //一共创建了3个对象
        //方法区的常量池中创建了一个对象“hello”
        //堆内存创建了两个对象
        String s1 = new String("hello");
        String s2 = new String("hello");
    }
}
相关文章
|
22天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
28天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
124 65
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
99 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
22天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
2月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
62 7
|
2月前
|
索引 Python
String(字符串)
String(字符串)。
33 3
|
3月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
63 1
|
3月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
50 4
|
3月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
61 2