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