String Pool

String和String Pool的异同 为什么 String 是不可变的? 什么是String Pool? 当你写这段代码时,创建了多少个对象 String s1 = new String("优快云"); ? 拥有字符串池有什么好处? String.intern() 方法有什么作用? 阅读详情

其实只要理解以下知识:

    String 是存放在java栈中,当创建一个String对象时(其他存放在栈中的基本类型变量类似),会去栈中查找是否有相同值的String,如果有则将变量地址赋给变量引用,没有则创建一个变量,同时将地址赋给引用。以上不适用于new 申明的变量;

因为new 关键字创建的变量都是存储与堆中的。


以下是转载文章:


在jvm中存在着String Pool
  String对象是不变对象,在程序运行过程中可能用到多个具有相同值得String对象,jvm中使用String pool来优化这种情况。当有新的String对象要建立的时候,jvm先检查Pool中时候已经有具有相同值的String对象,如果有就把这个对象的引用传递给新建立的对象,如果没有,就新建立一个对象,并将它放到Pool中。
  String对象的建立有两种方式:
  String s = "abc";
  or
  String s = new String("abc");
  在String Pool中这两种方式建立的对象有所不同,实际上String Pool只是对无名称String对象有效,即:通过方式一建立的具有相同值的对象也具有相同的内存地址。而对于通过new来建立的对象并不起作用,即用这样方式建立的对象具有自己的内存空间。
class hello{
  public static void main(String args[]){
  String s1 = "abc";
  String s2 = "abc";
  System.out.println("s1==s2? "+(s1==s2));
  System.out.println("s1.equal(s2)? "+s1.equals(s2));
  String s3 = new String("abc");
  String s4 = new String("abc");
  System.out.println("s3==s4? "+(s3==s4));
  System.out.println("s3.equal(s4)? "+s3.equals(s4));
  System.out.println("s1==s3? "+(s1==s3));
  System.out.println("s1.equal(s3)? "+s1.equals(s3));
  }
  }

结果:
  s1==s2? true //-- ps: s1和s2具有相同的内存地址。
  s1.equal(s2)? true
  s3==s4? false //-- ps: s3和s4具有不同内存地址。
  s3.equal(s4)? true
  s1==s3? false
  s1.equal(s3)? true
  下面的代码会输出什么呢? :)
  class hello{
  public static void main(String args[]){
  String s5 = new String("abc");
  String s6 = "abc";
  System.out.println("s5==s6? "+(s5==s6));
  System.out.println("s5.equal(s6)? "+s5.equals(s6));
  }
  }
  结果:
  s5==s6? false
  s5.equal(s6)? true
  预料之中!

以上这句说话并没有错.那是在说String 放在String pool时的特例.
  for example:
  String a = "abc"; // 检查String pool有没有这组字串,发现没有就create一个
  String b = "abc"; // 检查String pool有没有这组字串,发现有,就直接引用它的reference
  if(a==b) 是true;
  但当用到new时就会有如下的情形.
  String a = new String("abc");
  // 检查String pool有没有这组字串,发现没有就create一个,
  // 因为用new,所以同时亦建立一个新的instance给它.
  String b = new String("abc");
  // 检查String pool有没有这组字串,发现有,就直接引用它的reference
  // 因为用new,所以同时亦建立另一个新的instance给它.
  知道为甚麽new String("abc")亦要检查String pool吗.
  那是因为String()的constructor是原因.
  这是其中一个String的constructor : String(String original).
  留意当new String("abc")时.
  其实已经先做了一个动作,String original = "abc".


        static String str ="HelloWorld";

public static void main(String[] args) {
String A = "Hello";
String B = "World";
String C = "Hello"+"World";


System.out.println((A+B)==str);
System.out.println(C==str);
}
结果是:false,true

Java 语言提供对字符串串联符号("+")。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。

String+是StringBuffer的append()方法来实现的,如:
String   str   =   new   String( "abc ");
编译时等效于
String   str   =   new   StringBuffer().append( "a ").append( "b ").append( "c ").toString();

A+B //  会产生一个新的引用,System.out.println((A+B)==str);返回false

补充2011.06.24:

字符串对象的创建:由于字符串对象的大量使用[它是一个对象,一般而言对象总是在heap分配内存],Java中为了节省内存空间和运行时间[如比较字符串时,==比equals()快],在编译阶段就把所有的字符串文字放到一个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。我们知道,对两个引用变量,使用==判断它们的值[引用]是否相等,即指向同一个对象:

String s1 = new String("abc") ;String s2 = new String("abc") ;if( s1 == s2 ){ //不会执行的语句}

    这时用==判断就可知,虽然两个对象的"内容"相同[equals()判断],但两个引用变量所持有的引用不同,

    BTW:上面的代码创建了几个String Object? [三个,pool中一个,heap中2个。]

java 连接池 pool 实例 java 连接池 如何 创建 连接池 以及连接池的设置 立即下载

相关推荐

支付逻辑漏洞的八大姿势(上篇)

学习支付漏洞,看这篇文章!!!文章来源:SecHub网络安全社区(本资料仅供学习参考,严禁使用者进行未授权渗透测试!严禁任何形式的转载!

qq_39493066的博客 1358

StringPool详解

文章目录1. String的不可变性2. StringPool结构3. 字符串拼接操作4. 拼接操作与append操作效率对比5. intern详解5.1 intern基本知识5.2 new String创建了几个对象5.3 案例 1. String的不可变性 在JDK7之后,String的内容是存放在堆中的字符串常量池(StringPool,也可叫StringTable)中的,字符串常量池中相同的字符串只会创建一份,所以定义相同的字符串变量时,多个字符串变量都是指向了同一份地址中的字符串。 示例一 pub

u010502101的博客 3096

离线路径规划服务Graphhopper

离线路径规划服务Graphhopper 本文主要探索使用Graphhopper搭建离线路径规划服务,需要掌握一定的JAVA基础环境配置的知识 文章目录离线路径规划服务Graphhopper前言一、Graphhopper是什么?二、使用步骤1.下载Graphhopper2.从OpenStreetMap下载路图数据3.安装Graphhopper所需环境4.修改配置5.启动Graphhopper总结 前言 在外网环境中可以使用百度、高德等第三方的sdk用以实现路径规划的功能,由于项目的需要,在离线环境中需要使

Sysdark的博客 7561

Java字符串常量池

该篇文章转载至Java字符串池(String Pool)深度解析 在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool)。字符串池由String类私有的维护。我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值 2)采用

我就是我的博客 677

PP生产订单的BADI增强 WORKORDER_UPDATE

我们的项目需求是: 1、 保存时检查工单BOM是否存在物料号相同的行项目,如果有则提示“物料& 重复,请检查工单BOM” 系统增强出口:PPCO0001,检查组件行项目是否有重复物料项 开始以为的增强增强看一下是用PPCO0001还是PPCO0007 后来找到了badi WORKORDER_UPDATE IF_EX_WORKORDER_UPDATE~BEFORE_UPDATE

ERP运维咨询(目标和成功) 4636

高德地图 搜索和点击定位

高德地图vue

weixin_45474673的博客 1943

Java之String Pool

大家好,朽木君又回来了!今天为大家介绍一下String Pool。 什么是String Pool? JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,字符串池(String Pool)。 String str1 = "aaa"; String str2 = "aaa"; System.out.println(str1==str2);//true 大家看一下,这里str与str2指向同一个对象,因为String Pool中已经存在了“aaa” ...

needNotTO的博客 272

Sipeed麦克风阵列板练习

麦克风阵列板 Maix Dock Sipeed

sunshinebigbig的博客 3835

【JavaSE】字符串常量池、String详解

1.String Pool 1.1字符串常量池产生时间 1.2字符串常量池的位置 1.3字符串常量池的优点 2.String 2.1不可变性 2.2定义方式 2.2.1 字面量的方式 2.2.2 new的方式 2.2.3 intern()的方式

远赴山河万里的博客 2664

FFmpeg 开发(01):FFmpeg 编译和集成

尽管 FFmpeg 功能强大,但是由于其采用的是带有传染性的 LGPL/GPL 开源协议,所以一些大厂基本上都是自己独立开发类似的音视频处理库,甚至在接口和组织模块上模仿 FFmpeg 。

字节流动 1万+

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2731

关注StringPool.DOT_XML

关注 C:\*\com\baomidou\mybatis-plus-core\3.1.2\mybatis-plus-core-3.1.2.jar!\com\baomidou\mybatisplus\core\toolkit\StringPool.class

ppwwp的专栏 2268

“守望先锋”网络同步分析

守望先锋”(Overwatch)是一款由暴雪娱乐开发的团队基础第一人称射击游戏(FPS),于2016年正式发布。游戏以其独特的角色设计、丰富的游戏模式和高度的团队合作性而受到广泛欢迎。类型:第一人称射击(FPS)/多人在线战斗竞技场(MOBA元素)平台玩家人数:每场比赛由两个六人队伍组成,共12名玩家。客户端/服务器模型:在这种模型中,客户端负责处理用户输入和表现逻辑,而服务器则负责游戏的核心逻辑和状态管理。客户端与服务器之间通过网络进行通信,确保游戏状态的一致性。强同步机制。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 429

java7,8中的String pool

参考文献: http://blog.youkuaiyun.com/chen1280436393/article/details/51768609 http://java-performance.info/string-intern-in-java-6-7-8/ http://blog.youkuaiyun.com/heiyouhei123/article/details/51560166关于String poolwh

随心的专栏 2036

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Java】Java创建String时,什么情况放进String Pool?

对Java创建String是否放入String pool作代码性的试验。 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String original) API public String intern() API 版本说明 JDK 1.7.0_71 new String() 与 intern...

dongjizheng9270的博客 111

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java string 创建_【Java】Java创建String时,什么情况放进String Pool?

对Java创建String是否放入String pool作代码性的试验。参考的优秀文章版本说明JDK 1.7.0_71new String() 与 intern()package com.nicchagil.commonstudy.No01String的池;public class Call {public static void main(String[] args) {String a = "...

weixin_36259655的博客 88

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

String pool的测试和方法中String对象的测试

package StringTest.equalTest; /**  *  * Description:测试 string pool  * Company: sinosoft  * @author 黄大洋  * @date 2014-8-26  *  */ public class equalTest {  public static void main(String[]

pairsfish的专栏(你知道东方在哪一边) 847

Java string和 String,理解Java String和String Pool

本文转载自:http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把Stri...

weixin_34475212的博客 331

关于String字符串对象的创建与管理(String pool测试)

           String s=new String("abc");//JVM现在String pool中找有没有“abc”的字符串,没有就创建一个该字符串对象“abc”,该对象在String pool中并不是在堆中,这就是很多教程上所说的垃圾对象,然后JVM会通过String pool中对象在堆里也创建一个“abc”String对象,句柄s指向的是堆中的对象;        Syste

sofful的专栏 617

java里的String Pool

其实只要理解以下知识:     String 是存放在java栈中,当创建一个String对象时(其他存放在栈中的基本类型变量类似),会去栈中查找是否有相同值的String,如果有则将变量地址赋给变量引用,没有则创建一个变量,同时将地址赋给引用。以上不适用于new 申明的变量; 因为new 关键字创建的变量都是存储与堆中的。 以下是转载文章:

baoendemao的专栏 436

Java 中的 String Pool 简介

在 Java 中String对象是我们最常用的对象。在本文章中,我们主要对 String 对象使用的 String Pool 进行一些简单的介绍。Java 定义 String 后,String 是存储在 String Pool 中的,以便于加快字符串的访问和处理。正是有这个方面的访问需求,JVM 为 String 对象在内存中特地开辟了一个存储区域来加快对 String 对象的访问,这个特定的内存区域就是我们说的了。

Maisu的博客 211

Java String Pool深度解析:内存模型、intern陷阱与JVM调优

String Pool是Java中实现字符串复用的核心机制,其本质是元空间内由哈希表(StringTable)维护的引用集合,而非独立内存池。它通过存储堆中String对象的oop指针,实现字面量和intern()调用的快速查重,但过度使用会绑架GC——导致元空间膨胀、STW扩容停顿及老年代对象无法回收。技术价值在于减少重复字符串内存开销,但代价是将内存生命周期控制权让渡给JVM内部结构。典型应用场景包括HTTP状态码缓存、固定枚举去重等低变异性短字符串管理;而用户输入、动态拼接、UUID等高熵字符串一旦i

weixin_30952535的博客 411

java constantpool_Constant Pool和String Constant Pool详解

Constant Pool常量池的概念:在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Poo...

weixin_36129381的博客 462

String和String Pool

String类型的随笔 String被声明为final,因此不可以被继承 在Java8中,Striing内部使用char数组存储数据 在Java9之后,String类的实现使用byte数组存储字符串,同时使用coder来标识使用哪种编码

qq_45325217的博客 382

Constant Pool和String Constant Pool详解

Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容. String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为 String Constant Pool.好像没有正式的命名?? 在java编译好的cla

Michael_fchou的博客 576
上一篇: String 定义对象的区别(堆与栈的不同之处)
下一篇: java中stringBuilder的用法
zi_jun
博客等级 码龄18年 109粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值