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

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

String詳解

2019-11-11 04:35:21
字體:
供稿:網(wǎng)友

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

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

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

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

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

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

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

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

先來說說equals方法:

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

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

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

String類與其他類對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)存里面的地址了,先看幾個例子

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

這里寫圖片描述

String的+操作

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

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

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了一個出來。

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

String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); System.out.println(s == s.intern());//false s.intern()在常量池中創(chuàng)建一個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)建一個abc并返回
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绩溪县| 闻喜县| 宁河县| 江门市| 杭锦旗| 兴安盟| 门头沟区| 靖江市| 镇坪县| 龙州县| 九龙坡区| 南京市| 德昌县| 泾源县| 宝坻区| 罗甸县| 沙河市| 麻江县| 定陶县| 安化县| 馆陶县| 彭阳县| 新化县| 台前县| 黑河市| 工布江达县| 开平市| 卓尼县| 高碑店市| 四平市| 水城县| 迁安市| 汾阳市| 宁都县| 汉中市| 老河口市| 海口市| 商城县| 松潘县| 石楼县| 连城县|