国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

String詳解

2019-11-11 05:12:58
字體:
供稿:網(wǎng)友

String作為java常用的類,這里深入解析一下這個(gè)類的一下操作情況。

這里做的比較都是內(nèi)存里的地址,因此我們認(rèn)識(shí)幾個(gè)感念。

(stack)存放基本數(shù)據(jù)類型的值與引用數(shù)據(jù)數(shù)據(jù)類型的引用地址。

(heap)存放引用數(shù)據(jù)類型的對(duì)象,即new的對(duì)象都放在這里。

方法區(qū)(Method Area)我們這里講的stringpool(常量池)放在這里

equals方法和==的區(qū)別:

==用來比較基本數(shù)據(jù)類型的值是否相等,若是引用類型則判斷引用的堆(heap)存儲(chǔ)的地址是否相同。

equals通常用來比較基本數(shù)據(jù)類型的值或者引用類型的內(nèi)容是否相同,比較還是基于他們?cè)趦?nèi)存中的存放位置的地址值。

先來說說equals方法:

超類Object中有這個(gè)equals()方法,該方法主要用于比較兩個(gè)對(duì)象是否相等。

public boolean equals(Object paramObject) { return this == paramObject; }

由此可見Object比較的還是內(nèi)存引用地址是否相同。

String類與其他類對(duì)equals進(jìn)行了覆寫

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

如果引用地址相同返回true,否則判斷字符串是否相同。

下面主要說說==方法

這里就要用到上面說的內(nèi)存里面的地址了,先看幾個(gè)例子

String a = new String("張三");//堆內(nèi)存中會(huì)產(chǎn)生一個(gè)“張三”的對(duì)象,棧中是a的引用對(duì)象 String b = new String("張三"); String n = "張三";//先判斷常量池中是否有“張三”這對(duì)象,沒有就new一個(gè),棧中放的是n的對(duì)象 String m = "張三"; System.out.PRintln(a==b);//false System.out.println(n==m);//true System.out.println(a==n);//false

這里寫圖片描述

String的+操作

當(dāng)+的兩邊都是字面值常量(引用常量池的對(duì)象不算)時(shí),+完后會(huì)先判斷常量池中是否有這個(gè)字符串,沒有再new。

如果+兩邊有一個(gè)不是字符串,則直接是在堆內(nèi)存中new一個(gè)對(duì)象。

String s = "hello world"; String x = "hello "+"world"; String world ="world"; String y = "hello "+world; System.out.println(s==x);//true 在常量池中找 System.out.println(s==y);//false 直接在堆中new

String的concat方法拼接字符串

public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); }

這里是將拼接的字符串在堆中new了一個(gè)出來。

String對(duì)象的intern()方法返回的是常量池的引用地址,沒有則創(chuàng)建一個(gè)返回

String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); System.out.println(s == s.intern());//false s.intern()在常量池中創(chuàng)建一個(gè)abc并返回 System.out.println(s1 == s1.intern());//true s1引用的本身就是常量地址 System.out.println(s.intern() == s2.intern());//true s與s2引用的常量地址相同 System.out.println(s2 == s2.intern());//false s2.intern()在常量池中創(chuàng)建一個(gè)abc并返回
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盘山县| 珲春市| 达拉特旗| 息烽县| 若尔盖县| 深圳市| 沭阳县| 定结县| 崇仁县| 镇原县| 寿宁县| 凤冈县| 普兰县| 普定县| 蓝山县| 海阳市| 广东省| 湾仔区| 来凤县| 无锡市| 霸州市| 开远市| 漯河市| 微博| 乐陵市| 郁南县| 锡林郭勒盟| 治县。| 博白县| 从江县| 定安县| 安丘市| 林西县| 张北县| 呼伦贝尔市| 安徽省| 大姚县| 吴桥县| 松原市| 辛集市| 宣恩县|