电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java String的intern方法使用場景示例

瀏覽:48日期:2022-08-20 17:08:00

在講intern方法前,我們先簡單回顧下Java中常量池的分類。

常量池的分類

Java中常量池可以分為Class常量池、運行時常量池和字符串常量池。

1. Class文件常量池

在Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用。

所謂字面量類似與我們平常說的常量,主要包括以下兩種

文本字符串,例如String a = 'aa'。其中'aa'就是字面量。 被final修飾的變量。

符號引用包括以下形式:

類和接口和全限定名:例如對于String這個類,它的全限定名就是java/lang/String。 字段的名稱和描述符:所謂字段就是類或者接口中聲明的變量,包括類級別變量和實例級的變量。 方法的名稱和描述符:所謂描述符就相當于方法的參數類型+返回值類型。

2. 運行時常量池

我們知道類加載器會加載對應的Class文件,上面介紹的Class文件常量池中的數據,會在類加載后進入方法區中的運行時常量池。運行時常量池是全局共享的,多個類共用一個運行時常量池。運行時常量池存在于方法區中。

3. 字符串常量池

看名字我們就可以知道字符串常量池是用來存放字符串的,也就是說Class文件常量池中的文本字符串會在類加載時進入字符串常量池。

那字符串常量池和運行時常量池是什么關系呢?上面我們說Class文件常量池中的字面量會在類加載后進入運行時常量池,其中字面量中也包括文本字符串,從這段文字我們可以知道字符串常量池存在于運行時常量池中,也就存在于方法區中。

但是到了JDK1.7時,字符串常量池被移出了方法區,轉移到了堆里了。另外需要我們重點注意的是:字符串常量池中存放的并不是字符串本身,而是字符串對象的引用。

程序運行時,除非手動向常量池中添加常量(比如調用intern方法),否則jvm不會自動添加常量到常量池。

String 的 intern 方法

String 方法的作用是:判斷字符串常量池中是否存在一個引用,這個引用指向的字符串對象和當前對象相等(使用 equals 方法判斷相等),如果存在直接返回這個引用,如果不存在則創建一個字符串對象并將其引用存入字符串常量池。

下面舉個列子幫助加深理解。

//代碼基于JDK 8//s1指向字符串常量池中的'自由之路'String s1 = '自由之路';//s2也指向字符串常量池中的'自由之路'String s2 = '自由之路';//s3指向堆中的某個對象String s3 = new String('自由之路');//因為字符串常量池中已經存在'自由之路'的引用,直接返回這個引用String s4 = s3.intern();//創建一個字符串對象String s5 = new String('ddd');//常量池中不存在指向'ddd'的引用,創建一個'ddd'對象,并將其引用存入常量池String s6 = s5.intern();//創建一個字符串對象String s7 = new String('ddd');//常量池中存在指向'ddd'的引用,直接返回String s8 = s7.intern();System.out.println('s1==s2:'+(s1==s2));System.out.println('s1==s3:'+(s1==s3));System.out.println('s1==s4:'+(s1==s4));System.out.println('s5==s6:'+(s5==s6));System.out.println('s6==s8:'+(s6==s8));System.out.println('s7==s8:'+(s7==s8));

返回的結果如下:

s1==s2:trues1==s2:falses1==s2:trues5==s6:falses6==s8:trues7==s8:false

intern 方法使用場景

我們來看下面這個方法。

public class Person{ String name; public void setName(String name) { this.name = name }}

假如現在的Person對象都叫小明,那么這些Person對象都會引用一個不同的字符串對象。

Java String的intern方法使用場景示例

如果我們改進下這個方法:

public class Person{ String name; public void setName(String name) { this.name = name.intern(); }}

那么對象的引用結構如下圖所示

Java String的intern方法使用場景示例

這樣明顯可以節省多個字符串對象的空間。我寫了一個測試程序:

public class JavaTest { public static void main(String[] args) throws Exception { //一個很大的字符串 String s = 'c...c'; List<Person> personList = new ArrayList<>(); int count = 100000; for (int i = 0; i < count; i++) { Person p = new Person(); p.setName(new String(s)); //防止垃圾回收 personList.add(p); System.out.println(i); } System.out.println('success...'); } public static class Person{ private String name; public void setName(String name) { this.name = name; } }}

為了讓程序快速將內存耗盡,我這邊將內存設置成5M。

-Xms5m -Xmx5m

結果如下:

...9388993890Exception in thread 'main' java.lang.OutOfMemoryError: GC overhead limit exceededat com.csx.demo.spring.boot.util.JavaTest.main(JavaTest.java:15)

創建9w多個對象時已經報OutOfMemoryError錯誤了。

下面調整下 Person 的 set 方法,再執行下。

public static class Person{ private String name; public void setName(String name) { this.name = name.intern(); }}

999979999899999success...

順利執行完成。

以上就是Java String的intern方法使用場景示例的詳細內容,更多關于Java String的intern方法的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | RFID电子标签厂家-上海尼太普电子有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 517瓜水果特产网|一个专注特产好物的网站| 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 兰州UPS电源,兰州山特UPS-兰州万胜商贸| 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 聚合氯化铝厂家-聚合氯化铝铁价格-河南洁康环保科技 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 游戏版号转让_游戏资质出售_游戏公司转让-【八九买卖网】 |