`

String池(The String Pool)

阅读更多
Sun用一个叫String池的东东来优化对String的处理。这个String池使很多Java新人感到迷惑。String池是一个用来缓存创建过的String对象的区域。一个需要注意的地方是String池只有对那些用‘literals’创建的String起作用。也就是说用构造器创建的String对象不会存到String池中。请看下面一个例子:

public class Main {
 
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
	         
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        System.out.println("s1 == s2? " + (s1 == s2));
        System.out.println("s1.equals(s2)? " + (s1.equals(s2)));    
    }	     
}


运行结果如下
引用

s1 = abc
s2 = abc
s1 == s2? true
s1.equals(s2)? true


如果你想创建一个在内存中全新的String对象,可以用构造器创建一个String对象,因为他们不会被放到String池中。


public class Main {
	
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
		
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        System.out.println("s1 == s2? " + (s1 == s2));
        System.out.println("s1.equals(s2)? " + (s1.equal(s2)));
		
    }
	
}


运行结果如下

引用

s1 = abc
s2 = abc
s1 == s2? false
s1.equals(s2)? true


String有一个方法我们需要在这里介绍一下:intern(),这个方法会返回一个String对象,如果被调用的String对象能在String池中找到一个和它一样的(字面上相同)对象,就返回这个String池中的对象。如果找不到的话,就返回一个新的String对象,并把这个String对象放到String池中。
分享到:
评论

相关推荐

    小心String的陷阱——深入剖析Java中String的处理机制

    `String Pool`是存储`String`字面量的缓存池,当通过字面量的方式创建`String`对象时,Java虚拟机首先检查`String Pool`中是否已经存在相同的字符串,如果存在,则返回该字符串的引用,而不是创建一个新的对象。...

    ConnectionPool数据库连接池例子.doc

    * ConnectionPool(String jdbcDriver, String dbUrl, String dbUsername, String dbPassword) 该构造函数用于初始化ConnectionPool对象,设置数据库驱动类串、数据库URL、连接数据库用户名和连接数据库用户密码。 ...

    通过Apache common pool开源包实现对象池

    下面通过一个简单的样例来说明如何利用apache common pool来应用对象池。...也许本样例并不是很恰当,但是如何StringFormat换成是数据库连接就非常适合池技术了,此样例仅用于说明如何使用apache common pool池而已。

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

    String类创建对象问题

    **常量池(Constant Pool)**:在 Java 编译阶段确定的数据集合,存储在 `.class` 文件中。它包含了类、方法和接口的常量数据,也包括字符串常量。 **字符串池**:这是 JVM 内部的一个特殊结构,用于存储字符串字面...

    C# 数据库连接池 database pool

    Console.WriteLine("Connection will be returned to the pool."); } } } ``` 在这个例子中,`Pooling=true`参数表示启用连接池,`Max Pool Size=100;`设置了连接池的最大大小为100。`using`语句确保在操作完成...

    Java String对象的经典问题

    - **直接赋值**:这种方式会在**字符串常量池**(String Pool)中查找或创建一个对应的`String`对象,并将变量指向该对象。字符串常量池是Java堆的一部分,专门用来存储字符串字面量。如果字符串常量池中已经存在...

    String容量大小区分

    `,该字符串会被存储在一个特殊的区域——字符串常量池(String Constant Pool)中。如果尝试再次创建一个相同内容的字符串,如`String s2 = "Hello";`,实际上s2指向的是字符串池中已存在的"Hello"。这种方式可以...

    string中的常见问题

    首先,我们需要理解字符串常量池(String Constant Pool)的概念。当程序中通过直接赋值的方式定义一个字符串时,例如 `String a = "ab";` 这样的字符串会存储在字符串常量池中。如果在程序中再次尝试创建一个相同的...

    创建string对象过程的内存分配:

    1. **常量池** (Constant Pool): 每个类或接口都有自己的常量池,它包含了编译期间确定的所有字面量和符号引用。 2. **堆** (Heap): 动态分配的内存区域,用于存放对象实例。 3. **栈** (Stack): 存放局部变量、操作...

    springboot集成ftp连接池工具

    在Spring Boot项目中,可以使用Apache Commons Net库来实现FTP功能,并使用Apache Commons Pool2库来实现FTP连接池。在`pom.xml`文件中添加如下依赖: ```xml <groupId>org.springframework.boot <artifactId>...

    解析Java中的String对象的数据类型 字符串

    常量池(constant pool)是Java中的一个概念,它指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。常量池包括了关于类、方法、接口等中的常量,也包括字符串常量。例如String s0="kvill";,String ...

    String详解

    使用这种方式创建的字符串会被存储在一个特殊的内存区域——字符串常量池(String Literal Pool)中。如果再次尝试创建相同的字符串字面量,Java会直接引用已存在的字符串对象,而不是创建新的实例。 2. **new...

    深入探讨Java中的String类.pdf

    当创建一个新的 String 对象时,Java 会首先在 String.Pool 中查找是否已经存在该字符串,如果存在则返回该字符串的引用,否则创建一个新的字符串对象。 五、String 对象的应用 String 对象是 Java 中最基本的数据...

    commons-pool-1.5.5.jar.zip

    使用Apache Commons Pool的基本步骤包括创建工厂、创建池和从池中获取/返回对象: ```java PooledObjectFactory<String> factory = new DefaultPooledObjectFactory<String>() { @Override public String ...

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    在 JAVA 中,存在一个字符串池(String Pool),用于保存和共享 String 对象。String 对象池可以提高效率,因为它可以避免创建重复的 String 对象。 String 对象池是由 String 类维护的,可以通过 intern() 方法来...

    String对象的内存分析

    3. 常量池(Constant Pool):是堆内存中的一部分,用来存储字符串常量和基本类型常量,以及`public static final`修饰的变量。常量池中的数据可以被多个对象共享。 4. 静态存储:用于存储`static`定义的成员,这些...

Global site tag (gtag.js) - Google Analytics