1. 程式人生 > >String類在記憶體中實現原理詳解

String類在記憶體中實現原理詳解

(1)

==  比較引用型別比較的是地址值是否相同

equals:比較引用型別預設也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內容是否相同。

(2)

區分下面兩種語句在記憶體中的實現:

<span style="font-size:14px;">String s=new String("abcde");
String s2="abcde";
System.out.println(s==s2);          //false
System.out.println(s.equals(s2));      //true</span>
① String s=new String("abcde"),首先在堆中new(新建)一個物件xx,在常量池中尋找是否已經含有“abcde”字串,如果有,xx直接指向該字串(實際是xx儲存了該字串在常量池中的地址);否則,新建立“abcde”字串,然後xx指向。   在棧中新建String類引用變數s,s指向堆中物件xx(即儲存xx的地址值)。

②String s2=“abcde”;  首先去常量池中尋找“abcde”的字串,找到,則棧中引用變數s2直接指向它;否則,新建“abcde”字串,s2指向其。

綜上,s指向的是堆記憶體中物件,s2指向的是常量池中的字串“abcde”,故兩者儲存的地址不同

(3)

<span style="font-size:14px;">String s3=new String("abcdef"); 
String s4=new String("abcdef");
System.out.println(s3==s4);            //false
System.out.println(s3.equals(s4));     //true</span>
分析可知:s3、s4分別指向堆記憶體中不同的(通過new 建立的)物件x1,x2,即使x1、x2指向常量池中同一個字串“abcdef ”,故s3、s4儲存的地址不同


(4)

含有變數的字串拼接,通過反編譯可以知道,實際上是new了一個新物件,然後再拼接,在常量池中尋找、指向

通過new建立的物件,可以通過呼叫 intern()方法,返回物件指向常量池中的引用(地址)

<span style="font-size:14px;">String s="hello ";
String s1="world";
String s3="hello world";
		
String s4=s+s1;               
//s,s1是變數,變數相加在編譯時,在堆中先new了一個空間,拼接s、s1,然後在常量池中尋找s+s1字串,有則將
//new 的物件指向它,沒有則建立字串,再指向
//相當於 String s4=new String("hello world");


System.out.println(s3==s4);         //false
System.out.println(s4.intern()==s3); //true 

String s10=new String(s+s1);
System.out.println(s10.intern()==s3);//true
System.out.println(s10.intern()==s4.intern()); //true


String s5="hello "+"world"; //字串常量相加,先拼接,再在常量池中尋找,如果有,就直接指向該字串,否則,就建立
System.out.println(s5==s3); //true
String s6=s+"world"; 
System.out.println(s6==s3); //false
System.out.println(s6==s4); //false
System.out.println("------------------");


String s7="abcd";
String s8=new String("abcd").intern(); 
//intern 方法可以返回該字串在常量池中的物件的引用,即返回"abcd"在常量池中的引用

String s9=new String("abcd");
System.out.println(s7==s8); //true
System.out.println(s7==s9); //false</span>




相關推薦

String記憶體實現原理

(1) ==  比較引用型別比較的是地址值是否相同 equals:比較引用型別預設也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內容是否相同。 (2) 區分下面兩種語句在記憶體中的實現: <span style="font-size:14

Python Web開發,WSGI協議的作用和實現原理

首先理解下面三個概念: WSGI:全稱是Web Server Gateway Interface,WSGI不是伺服器,python模組,框架,API或者任何軟體,只是一種規範,描述web server如何與web application通訊的規範。 uwsgi:與WSGI一樣是一種協議,是uWSGI伺服器

ScalaHashSet的實現原理

HashSet是平時常用到的資料結構之一,其保證元素是不重複的。 本文將用一個簡單的例子來解釋下scala語言中HashSet內部的工作原理,看下add和remove到底是怎樣工作的。 用法示例 val s = mutable.HashSet

androidwifi原理(轉)

二:Wifi模組的初始化:: 在 SystemServer 啟動的時候,會生成一個ConnectivityService的例項, try { Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Con

反射和多型實現原理

Table of Contents 反射和多型 多型 多型的定義和用法 多型的實現原理 反射 反射的實現原理 反射的應用 反射的弊端 反射和多型 這兩種技術並無直接聯絡,之所以把它們放在一起說,是因為Java提供讓我們在執行時識別物件和類的資訊,主要有

Java LinkedList的實現原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java HashSet的實現原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

HashMap底層實現原理(轉載)

本文轉自:https://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap詳解 HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是

SynchronousQueueTransferQueue原理

SynchronousQueue中分為TransferQueue(公平模式)和TransferStack(非公平模式) 下面我們先分析一下TransferQueue 當新建一個TransferQueue時 1 TransferQueue() { 2 QNode h = ne

androidwifi原理

                二:Wifi模組的初始化::在 SystemServer 啟動的時候,會生成一個ConnectivityService的例項,try {Log.i(TAG, "Starting Connectivity Service.");ServiceManager.addService(

golang net/http包部分實現原理

net/http包在編寫golang web應用中有很重要的作用,它主要提供了基於HTTP協議進行工作的client實現和server實現,可用於編寫HTTP服務端和客戶端。 其使用方法也跟其他面嚮物件語言很相似,我們可以先從它的一些基礎用法來感受一下: 以下是

幾種壓縮演算法實現原理

gzip 、zlib以及圖形格式png,使用的壓縮演算法都是deflate演算法。從gzip的原始碼中,我們瞭解到了defalte演算法的原理和實現。我閱讀的gzip版本為 gzip-1.2.4。下面我們將要對deflate演算法做一個分析和說明。首先簡單介紹一下基本原理,

Spring Aop之Cglib實現原理

Spring Aop實現對目標物件的代理,AOP的兩種實現方式:Jdk代理和Cglib代理。這兩種代理的區別在於,Jdk代理與目標類都會實現同一個介面,並且在代理類中會呼叫目標類中被代理的方法,呼叫者實際呼叫的則是代理類的方法,通過這種方式我們就可以在代理類中織入切面邏輯;Jdk代理存在的問題在於目標類被代

幾種主流貼圖壓縮演算法的實現原理

ETC壓縮演算法採用將影象中的chromatic和luminance分開儲存的方式,而在解碼時使用luminance對chromatic進行調製進而重現原始影象資訊。   ETC也主要有兩種方法:ETC1和改進後的ETC2。 ETC1: 採用4x2的block進行分割(原始為4*2*24=192,壓

java資料在記憶體的儲存

  1. 有這樣一種說法,如今爭鋒於IT戰場的兩大勢力,MS一族偏重於底層實現,Java一族偏重於系統架構。說法根據無從考證,但從兩大勢力各自的社群力量和圖書市場已有佳作不難看出,此說法不虛,但掌握Java的底層實現對Java程式設計師來說是至關重要的,本文介紹了Java中的資料在記憶體中的儲存。   

MVC之前的那點事兒系列(7):WebActivator的實現原理

文章內容 上篇文章,我們分析如何動態註冊HttpModule的實現,本篇我們來分析一下通過上篇程式碼原理實現的WebActivator類庫,WebActivator提供了3種功能,允許我們分別在HttpApplication初始化之前,之後以及ShutDown的時候分別執行指定的程式碼,示例如下: [

併發容器之ArrayBlockingQueue和LinkedBlockingQueue實現原理

1. ArrayBlockingQueue簡介 在多執行緒程式設計過程中,為了業務解耦和架構設計,經常會使用併發容器用於儲存多執行緒間的共享資料,這樣不僅可以保證執行緒安全,還可以簡化各個執行緒操作。例如在“生產者-消費者”問題中,會使用阻塞佇列(Blocki

XFS實現原理

0 檔案系統      引用維基百科對檔案系統的定義:“計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟

HashMap實現原理

HashMap定義 HashMap實現了Map介面,一種將鍵對映到值得物件。 一個對映不能包含重複的鍵;每個鍵只能對映到一個值上。 HashMap的元素是無序的。要實現有序排列必須實現hashc

Java ArrayList的實現原理

ArrayList是Java List型別的集合類中最常使用的,本文基於Java1.8,對於ArrayList的實現原理做一下詳細講解。 一、ArrayList實現原理總結 ArrayList的實現原理總結如下: ①資料儲存是基於陣列實現的,預設初始容量為10; ②