摘要:類是類它內(nèi)部的方法也默認(rèn)被修飾不能重寫字符串常量池當(dāng)這樣聲明一個(gè)字符串會(huì)檢測(cè)字符串常量池中是否存在這個(gè)值的字符串如果存在就直接賦值給否則創(chuàng)建一個(gè)新的再賦值給當(dāng)連續(xù)用同樣的方式聲明兩個(gè)字符串并作比較結(jié)果為這個(gè)操作符比較的是什么對(duì)于基本變量比較
String類是final類,它內(nèi)部的方法也默認(rèn)被final修飾,不能重寫.
字符串常量池當(dāng)這樣聲明一個(gè)字符串
String str = "hello java";
JVM會(huì)檢測(cè)字符串常量池中是否存在這個(gè)值的字符串,如果存在,就直接賦值給str,否則創(chuàng)建一個(gè)新的,再賦值給str.
當(dāng)連續(xù)用同樣的方式聲明兩個(gè)字符串并作比較
String str1 = "hellojava"; String str2 = "hellojava"; boolean flag = str1==str2;//true
結(jié)果為true.
"=="這個(gè)操作符比較的是什么?對(duì)于基本變量,比較的就是變量的值;對(duì)于引用變量,比較的是它們指向的內(nèi)容.
當(dāng)我們這樣聲明
String str1 = "hello"; String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//false
結(jié)果為false.這是因?yàn)閟tr4是有兩個(gè)引用類型結(jié)合而成,它的值在編譯期無(wú)法確定.
如果將str1和str2聲明為final類型
final String str1 = "hello"; final String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//true
str1和str2都是被final修飾的字符串常量,那么str4在編譯期就可以被確定.因此結(jié)果是true.
通過new創(chuàng)建字符串
String str3 = "hellojava"; String str4 = new String("hellojava"); boolean flag = str3==str4;//false
這是因?yàn)閚ew會(huì)在堆中創(chuàng)建一個(gè)hellojava的實(shí)例對(duì)象,并用棧中的str4指向它.而str3指向的是方法區(qū)中字符串常量池中的hellojava.當(dāng)然堆中的hellojava指向的也是字符串常量池中的hellojava(如果存在的話).
要了解一下str3和str4的聲明做了什么?
先聲明str3.會(huì)在方法區(qū)的字符串常量池中直接創(chuàng)建一個(gè)字符串"hellojava",使str3指向它.緊接著用new創(chuàng)建str4時(shí),會(huì)先查找字符串常量池中是否包含字符串"hellojava".如果有直接返回,沒有就在常量池中創(chuàng)建.然后在堆中創(chuàng)建實(shí)例對(duì)象,并將這個(gè)實(shí)例對(duì)象指向常量池中的字符串"hellojava",然后將實(shí)例對(duì)象賦給棧中的str4.intern()方法
//"java"字符串在常量池中 String str1 = "java"; //直接從常量池中獲取"java"字符串 String str2 = str1.intern(); boolean equal = str1==str2;//true //在堆內(nèi)存中聲明一個(gè)"java"字符串 String str3 = new String("java"); //常量池沒有"java"字符串,將str3的字符串加入到常量池,再返回這個(gè)常量池中的"java"字符串給str4 String str4 = str3.intern(); boolean equal = str3==str4;
intern()方法會(huì)先在字符串常量池中查找是否有"java"這個(gè)字符串,如果有就直接返回這個(gè)字符串的引用,如果沒有,就把str1指向的"java"字符串加入到常量池,再返回常量池中"java"字符串的引用.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73542.html
摘要:證明返回常量池中已存在的對(duì)象,不等于新建的對(duì)象。為什么要設(shè)計(jì)成一下內(nèi)容來(lái)自發(fā)現(xiàn)百度的中文版本基本也是此文的翻譯版??傊?,安全性和字符串常量池緩存是被設(shè)計(jì)成不可變的主要原因。 String是Java中最常用的類,是不可變的(Immutable), 那么String是如何實(shí)現(xiàn)Immutable呢,String為什么要設(shè)計(jì)成不可變呢? 前言 關(guān)于String,收集一波基礎(chǔ),來(lái)源標(biāo)明最后,不確...
摘要:編譯器發(fā)生了什么通過查看文件可以知道在編譯的過程中間就將加直接處理成了但是如果是這樣查看文件可以看出是而且可以看到表示在棧內(nèi)存生成了一個(gè)引用變量指向堆內(nèi)存的。 package com.spring; public class Day01 { public static void main(String[] args) { ...
摘要:所以我決定先從類入手,深入的研究一番來(lái)開個(gè)好頭。之所以會(huì)有以上的效果,是因?yàn)橛凶址A砍氐拇嬖?。同時(shí)運(yùn)行時(shí)實(shí)例創(chuàng)建的全局字符串常量池中有一個(gè)表,總是為池中的每個(gè)字符串對(duì)象維護(hù)一個(gè)引用,所以這些對(duì)象不會(huì)被。 開始寫 Java 一年來(lái),一直都是遇到什么問題再去解決,還沒有主動(dòng)的深入的去學(xué)習(xí)過 Java 語(yǔ)言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...
摘要:而字節(jié)碼運(yùn)行在之上,所以不用關(guān)心字節(jié)碼是在哪個(gè)操作系統(tǒng)編譯的,只要符合規(guī)范,那么,這個(gè)字節(jié)碼文件就是可運(yùn)行的。好處防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼安全性角度特別說(shuō)明類加載器在成功加載某個(gè)類之后,會(huì)把得到的類的實(shí)例緩存起來(lái)。 前言 只有光頭才能變強(qiáng) JVM在準(zhǔn)備面試的時(shí)候就有看了,一直沒時(shí)間寫筆記。現(xiàn)在到了一家公司實(shí)習(xí),閑的時(shí)候就寫寫,刷刷JVM博客,刷刷電子書。 學(xué)習(xí)JVM的目的也很簡(jiǎn)單...
閱讀 3329·2021-11-12 10:36
閱讀 2488·2021-11-02 14:43
閱讀 2162·2019-08-30 14:23
閱讀 3475·2019-08-30 13:08
閱讀 933·2019-08-28 18:09
閱讀 3149·2019-08-26 12:22
閱讀 3159·2019-08-23 18:24
閱讀 2028·2019-08-23 18:17