`

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池中。
分享到:
评论

相关推荐

    Java字符串池(String Pool)深度解析.docx

    Java字符串池(String Pool)深度解析.docx

    通过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...

    字符数组的存储方式 字符串常量池.docx

    在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;...

    对String的深入理解

    文字池[pool of literal strings]和堆[heap]中的字符串对象。 一、引用变量与对象:除了一些早期的Java书籍和现在的垃圾书籍,人们都可以从中比较清楚地学习到两者的区别。A aa;语句声明一个类A的引用变量aa[我常常...

    java jdbc帮助类 v1.0 自带连接池

    java jdbc帮助类 v1.0 自带连接池 boolean delete(java.lang.String sql) 删除单条记录的方法,适用于简单的sql语句 boolean delete(java.lang.String sql, java.util.Map,java.lang.Object> elements) 根据...

    高速对象池(内存池)类模板代码(C++)

    FastPool<std::string> pool; 2.往池添加对象,例如: pool.Add("abc");//要注意这里传入的是构造对象的参数 3.取出一个对象以使用,例如: std::string* p = pool.Pop(); 这一步可以跟上一步结合起来: std::...

    深入java虚拟机(inside the java virtual machine)

    The Constant Pool Field Information Method Information Class Variables A Reference to Class ClassLoader A Reference to Class Class Method Tables An Example of Method Area Use The Heap Garbage ...

    jdbc 帮助类 java 自带连接池 v1.01

    void setPoolName(java.lang.String poolName) boolean update(java.lang.String sql, java.util.Map,java.lang.Object> elements) 根据输入的参数执行更新操作 boolean update(java.lang.String sql, java...

    node-odbc-pool:节点的ODBC模块的连接池

    节点-odbc池 基于通用池的node-odbc连接池。 描述 这是一个连接池模块,为遇到的每个连接字符串创建通用池的实例。 使用此池模块可以获得使用通用池模块的所有好处,包括最小和最大... ODBC_CONNECTION_STRING , functi

    memory-pool:全局、线程安全的内存池

    全局、线程安全的内存池一个 Rust 库,提供全局、线程安全的内存池,非常适合需要临时暂存缓冲区但又不想不断分配内存的情况。 memory_pool :: borrow ( | aux: & mut String | { aux. push_str ( "Do you like ...

    数据连接池

    String maxconn = props.getProperty(poolName + ".maxconn", "0"); int max; try { max = Integer.valueOf(maxconn).intValue(); } catch (NumberFormatException e) { log("错误的最大连接数限制: " + ...

    connection-pool:通用,高效,线程安全的C ++连接池

    连接池 通用,高效,线程安全的C ++连接池 介绍 我们需要一种安全,有效的方式...// Create a pool of 5 MySQL connections shared_ptr<MySQLConnectionFactory> mysql_connection_factory ( new MySQLConnectionFacto

    String字符串比较1

    第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝 第二个+号两边有一个是变量,此时,java会在堆里

    scratch:[]int 和 []string 的池

    []int、[]string 和 []interface{} 的池 您可以将它们用于任何事情,但我往往最需要这些用于临时工作(短期工作)。 用法 除了它们处理的类型之外, StringsPool 、 IntsPool和AnytingPool具有相同的接口。 首先,...

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    五、Object的方法介绍和String解析 有的同学要问了,Object和String是我们这一块儿日常一直在使用的东西,为什么要单独拎出来讲呢?其实,他们使用起来虽然简单,但比如Object类是位于java.lang包中的,java.lang是...

    用java写的一个数据库连接池

    2.在工程目录任意位置放入连接池配置文件,如pool.xml,其内容如下: <pool name="default"> oracle.jdbc.driver.OracleDriver <url>jdbc:oracle:thin:@192.168.1.7:1521:TESTDB <username>appuser ...

    Mastering the C++17 .pdf

    what it means for std::string or std::any to be termed a "vocabulary type"(Chapter 5 , Vocabulary Types ); and what we might expect fromfuture C++ standards in 2020 and beyond. I assume that you are ...

    dynamic-pool:无锁,线程安全,动态大小的对象池

    dynamic-pool 无锁,线程安全,动态大小的对象池。 该池以初始容量开始,如果没有可用空间,它将根据请求继续创建新对象。... name: String , age: u16 , } impl DynamicReset for Person { fn

    Android代码-android-manifest-parser

    AndroidManifest解析器 一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。 AndroidManifest.xml文件格式 ... String Pool Offset 4bytes // 字符串常量池相对于Chunk偏移值 Sty

Global site tag (gtag.js) - Google Analytics