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");
    }
}
相关文章
|
11天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
14 0
|
15天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
26天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
23天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
62 0
|
25天前
|
Java
软件工程设计原理里氏替换原则 ,具体实现及JAVA代码举例
里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov提出。这个原则指出,如果类 S 是类 T 的子类型,则程序中使用 T 的对象的地方都可以不经修改地使用 S 的对象。换句话说,子类的对象应该能够替换掉它们的父类对象,而不影响程序的正确性。这个原则强调了继承关系中的行为兼容性,保证了基类和派生类之间的正确抽象和继承关系。
24 3
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
10天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`'1.2,2,3,4,5'`)转换为对象数组。通过使用`split(',')`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
10天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
14天前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
23 2
|
19天前
|
Java 开发者
软件工程设计原理接口隔离原则 ,具体实现及JAVA代码举例
【4月更文挑战第7天】接口隔离原则(Interface Segregation Principle, ISP)是面向对象设计原则之一,旨在减少不必要的依赖关系,通过拆分庞大且臃肿的接口为更小、更具体的接口来实现。这个原则强调“客户端不应该被迫依赖于它不使用的接口”,意味着一个类不应该被迫实现它不使用的方法。
16 1