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