欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別

 更新時(shí)間:2023年08月18日 09:48:12   作者:依嘫_吃代碼  
這篇文章主要介紹了Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別,在使用list?結(jié)合的時(shí)候習(xí)慣了?list=null?;在創(chuàng)建這樣的方式,但是發(fā)現(xiàn)使用list的clear?方法很不錯(cuò),尤其是有大量循環(huán)的時(shí)候<BR>list.clear()與list?=?null?區(qū)別,需要的朋友可以參考下

1、list集合的clear方法

在使用list 結(jié)合的時(shí)候習(xí)慣了 list=null ;

在創(chuàng)建這樣的方式,但是發(fā)現(xiàn)使用list的clear 方法很不錯(cuò),尤其是有大量循環(huán)的時(shí)候 list.clear()與list = null 區(qū)別 java中l(wèi)ist集合通過(guò)clear()方法清空,只會(huì)將list中的對(duì)象變成垃圾回收清空,但是list對(duì)象還是存在

但是通過(guò)list=null后,不僅列表中的對(duì)象變成了垃圾,為列表分配的空間也會(huì)回收,什么都不做與賦值NULL一樣, 說(shuō)明直到程序結(jié)束也用不上列表list了,它自然就成為垃圾了.clear()只是清除了對(duì)象的引用,使那些對(duì)象成為垃圾

ArrayList.clear、=null、new Arraylist之間的對(duì)比區(qū)別

1.使用ArrayList的對(duì)象方法clear()

 List list = new ArrayList();
 List list1 = list;
 list.add(1);
 list.add(2);
 list.add(3);
 list.clear();

ArrayList對(duì)象內(nèi)部維護(hù)一個(gè)對(duì)象數(shù)組elementData, 當(dāng)執(zhí)行clear()方法時(shí), 會(huì)執(zhí)行循環(huán)將elementData中每一個(gè)坐標(biāo)都設(shè)置為為null, 并設(shè)置數(shù)組的size為0;我們還可以使用該list進(jìn)行操作

clear源碼如下

public void clear() {
        modCount++;
        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
}

2.使用=null

ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list = null;

直接將變量list指向null,通常當(dāng)我們不需要再使用ArrayList對(duì)象時(shí),可以將變量值設(shè)為null,以便GC可以運(yùn)作并回收這部分內(nèi)存空間。

需要注意的是當(dāng)仍有其他變量指向該對(duì)象時(shí),即使講變量list置為null垃圾回收器也無(wú)法回收該內(nèi)存空間。如下:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> arraylist = list;
list.add("0");
list.add("1");
list.add("2");
list = null; // 此時(shí)list變量指向null,而arraylist變量仍然指向原內(nèi)存空間,原內(nèi)存空間得不到釋放

使用= new ArrayList() 方法3有點(diǎn)類似于方法1,都是得到一個(gè)空的ArrayList對(duì)象。

不過(guò)new ArrayList()會(huì)得到一個(gè)初始化內(nèi)部數(shù)組elementData容量為10的ArrayList對(duì)象,而方法1得到的對(duì)象的容量與原對(duì)象一致。值得注意的是使用方法3需要進(jìn)行如在內(nèi)存中重新開(kāi)辟內(nèi)存空間等操作,開(kāi)銷較大,如果只是單純的想要使用空的ArrayList對(duì)象,建議使用方法1,相對(duì)來(lái)說(shuō)可盡量避免堆內(nèi)存溢出問(wèn)題。

2、null、與""的區(qū)別

問(wèn)題一

null、與""的區(qū)別

null是沒(méi)有地址 ““是有地址但是里面的內(nèi)容是空的 null和”“的區(qū)別 String s=null; string.trim()就會(huì)拋出為空的exception String s=””; string.trim()就不會(huì)拋,為什么? 答: NULL代表聲明了一個(gè)空對(duì)象,根本就不是一個(gè)字符串。 ""代表聲明了一個(gè)對(duì)象實(shí)例,這個(gè)對(duì)象實(shí)例的值是一個(gè)長(zhǎng)度為0的空字符串。

NULL代表聲明了一個(gè)空對(duì)象,對(duì)空對(duì)象做任何操作都不行的,除了=和== ""是一個(gè)字符串了,只是這個(gè)字符串里面沒(méi)有內(nèi)容了

String s=null;只是定義了一個(gè)句柄,也就是說(shuō)你有了個(gè)引用,但是這個(gè)引用未指向任何內(nèi)存空間 String s=“”;這個(gè)引用已經(jīng)指向了一塊是空字符串的內(nèi)存空間,是一個(gè)實(shí)際的東東了,所以你可以對(duì)它操作,而不用擔(dān)心什么了

你說(shuō)數(shù)字0和沒(méi)有是不是一種概念?。??道理一樣的

而且,null可以賦值給任何對(duì)象.""就不行了.

這里""和NULL絕對(duì)是兩個(gè)概念 ""代表一個(gè)字符串存在,它的值就是“” NULL代表字符串根本沒(méi)有實(shí)際的值,你并不知道它是什么。。。

哦,我明白了,意思就是String string = null 跟String string;是一回事兒

null是空對(duì)象 ““是空字符串 String s=null;//null是未分配堆內(nèi)存空間 String a;//分配了一個(gè)內(nèi)存空間,沒(méi)存入任何對(duì)象 String a=””;//分配了一個(gè)內(nèi)存空間,存了一個(gè)字符串對(duì)象

問(wèn)題二

String s;和String s=null;和String s=“a”;有什么區(qū)別?

針對(duì)這三種情況,使用out.println(s);的時(shí)候,第一個(gè)會(huì)出現(xiàn)異常,第二個(gè)會(huì)輸出null.第三個(gè)則會(huì)輸出a. 這是為什么呢?這三句聲明語(yǔ)句,各自作了什么呢?

答: 第一個(gè)只是定義了一個(gè)String類型變量s,并沒(méi)有給它賦初值,在Java中,默認(rèn)在使用一個(gè)變量的時(shí)候必須賦予它初值(降低風(fēng)險(xiǎn))。

第二個(gè)和第三個(gè)都定義了String類型變量s,并賦予它初值,只不過(guò)第二個(gè)賦予的值為null(空)罷了

主要要理解的是String s; s為一個(gè)引用~~它不是對(duì)象 第一個(gè)是沒(méi)有初始化的引用; 第二個(gè)為空引用; 第三個(gè)是在字符串池里寫入一個(gè)字符’a’,然后用s指向它。 另外, String s="a"和String s=new String(“a”);是有本質(zhì)上的區(qū)別的 前者是在字符串池里寫入一個(gè)字符’a’,然后用s指向它; 后者是在堆上創(chuàng)建一個(gè)內(nèi)容為"a"的字符串對(duì)象。 String str=“aaa”; //于棧上分配內(nèi)存 String str=new String(“aaa”); //于堆上分配內(nèi)存

String s; 系統(tǒng)會(huì)自動(dòng)賦值null

String s;只是給s分配一個(gè)內(nèi)存空間 String s=null;是分配的空間中存儲(chǔ)的值為空值 String s=“a”;這句就不用我多說(shuō)了分配的空間的值為字符a

問(wèn)題三

聲明了一個(gè)string a;變量 在以后的判斷中,a==""和a==null有何不同?

答: 如果沒(méi)有給a賦過(guò)值,a==““會(huì)導(dǎo)致異常。 在實(shí)際處理時(shí),往往認(rèn)為”“和null代表相同的含義,即都代表無(wú)值。

此時(shí)建議用如下語(yǔ)法: if(anull || a””) { } 如果a為null,就不會(huì)執(zhí)行后面的判斷,直接返回true。

null是用來(lái)判斷引用類型是否分配了存儲(chǔ)空間 ““是針對(duì)字符串的; string類型實(shí)際上是字符串指針,也即是一個(gè)引用類型 所以如果沒(méi)有給a賦過(guò)值,a==”“會(huì)導(dǎo)致異常 所以if(anull || a””){}這種寫法也是正確的

問(wèn)題四

String abc=null;String abc=“”;String abc;三種寫法有什么區(qū)別?

答:

1:創(chuàng)建一個(gè)空字符串對(duì)象

2:創(chuàng)建一個(gè)字符串為空的字符串對(duì)象。

3:聲明一個(gè)字符串對(duì)象,但并沒(méi)有分配內(nèi)存,而1,2已經(jīng)分配了內(nèi)存 對(duì)于最后一種表示,你不能if(abc==null),或者int length = abc.length();編譯的時(shí)候會(huì)提示可能沒(méi)有初始化.

String abc=null; String abc=“”; 一般推薦使用第二種 第一種abc指向null,很多時(shí)候要判斷字符串是否為空時(shí),容易漏掉這種情況,在調(diào)用String的相關(guān)方法的時(shí)候就會(huì)出錯(cuò) 第二種則相對(duì)簡(jiǎn)單,String的方法都可以用,判斷的時(shí)候也不會(huì)出錯(cuò)

 String   abc=null;   
 String   abc;    
 String   a="";   
 String   b="";   
 String   c=new String("");   
 String   d=new String(""); 
//1)等于2),和C語(yǔ)言不同,JAVA為安全原因不允許一個(gè)懸掛引用,沒(méi)有賦值的引用地址一律自動(dòng)賦值為NULL,以防止訪問(wèn)到任意內(nèi)存   
//3)和4)中,變量a和b將會(huì)指向同一內(nèi)存地址(""的地址)   
//5)和6)中,變量c和d不會(huì)指向同一地址,而是兩個(gè)""內(nèi)容的地址,并且和a,b不同,實(shí)際上,3)和4)相當(dāng)于new String("").intern().   
//String類維護(hù)著一個(gè)字符串池,對(duì)于像3)和4)這樣的賦值方法,String會(huì)在這個(gè)池中查找字符串是否已經(jīng)在池中,如果在,就直接指向該地址,

如果不在,生成一個(gè)實(shí)例放入池中再指向那個(gè)地址,可見(jiàn)對(duì)于同樣內(nèi)容的字符串多次引用時(shí)3)4)的方法要比5)6)的方法剩內(nèi)存,之所以這樣做,是

因?yàn)镾tring是一個(gè)內(nèi)容不可變的量,運(yùn)用的是設(shè)計(jì)模式GOF.FlyWeight

但有個(gè)關(guān)鍵的一點(diǎn),沒(méi)有人說(shuō)到,這就是: String s;在什么情況下可以等同于String s=null;而在什么情況下又不等同?! 考慮下面的代碼:

public   class   StringTest   {      
    static   String   s;     //*   
    public   static   void   main(String[]   args)   {   
        //String   s;         //**   
        System.out.println(s);   
    }   
}     

編譯并運(yùn)行上面的代碼,將打印null。 可見(jiàn)標(biāo)有*號(hào)的行是自動(dòng)初始化了的(s被自動(dòng)初始化為null)。

而如果把標(biāo)有**號(hào)的行取消注釋,代碼將不能通過(guò)編譯,這是因?yàn)檫@行定義的是本地變量,而本地變量是不會(huì)自動(dòng)初始化的。

由此得出結(jié)論: 在成員變量的定義中,String s;等同于String s=null; 而在本地變量(方法變量)的定義中,String s;不等同于String s=null;,這時(shí)要使用s必須顯式地賦值。

這些雖然是小知識(shí)點(diǎn),但在實(shí)際應(yīng)用中很重要,也很容易被一些人忽視,特此提出。

還有一點(diǎn)要說(shuō)明的是: 只要是在方法在中定義變量都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動(dòng)賦初值。

到此這篇關(guān)于Java中l(wèi)ist集合的clear方法及空字符串的區(qū)別的文章就介紹到這了,更多相關(guān)list集合的clear方法及空字符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot小程序推送信息的項(xiàng)目實(shí)踐

    SpringBoot小程序推送信息的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot小程序推送信息的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中String類的常用方法總結(jié)

    Java中String類的常用方法總結(jié)

    java.lang.String?類代表字符串。Java程序中所有的字符串文字(例如"abc"?)都可以被看作是實(shí)現(xiàn)此類的實(shí)例。本文主要為大家介紹了String類的常用方法,需要的可以參考一下
    2022-11-11
  • 淺談讓@Value更方便的Spring自定義轉(zhuǎn)換類

    淺談讓@Value更方便的Spring自定義轉(zhuǎn)換類

    Spring為大家內(nèi)置了不少開(kāi)箱即用的轉(zhuǎn)換類,如字符串轉(zhuǎn)數(shù)字、字符串轉(zhuǎn)時(shí)間等,但有時(shí)候需要使用自定義的屬性,則需要自定義轉(zhuǎn)換類了
    2021-06-06
  • java線程之Happens before規(guī)則案例詳解

    java線程之Happens before規(guī)則案例詳解

    這篇文章主要為大家介紹了java線程之Happens-before規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-08-08
  • Security中的WebSecurityConfigurerAdapter詳解

    Security中的WebSecurityConfigurerAdapter詳解

    這篇文章主要介紹了Security中的WebSecurityConfigurerAdapter詳解,今天我們要進(jìn)一步的的學(xué)習(xí)如何自定義配置Spring?Security,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java開(kāi)發(fā)神器Lombok使用詳解

    Java開(kāi)發(fā)神器Lombok使用詳解

    這篇文章主要介紹了Java開(kāi)發(fā)神器Lombok使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java詳細(xì)分析講解泛型

    Java詳細(xì)分析講解泛型

    在正式進(jìn)入內(nèi)容之前說(shuō)明一下:泛型的內(nèi)容太多,也太復(fù)雜。這里因?yàn)镴ava中寫數(shù)據(jù)結(jié)構(gòu)的時(shí)候會(huì)使用到,所以加上。關(guān)于泛型我找了挺多文章,再結(jié)合自己的理解,盡可能將其講清楚。不求會(huì)使用泛型,只要求后面數(shù)據(jù)結(jié)構(gòu)出現(xiàn)泛型的時(shí)候能夠知道是在干什么即可
    2022-05-05
  • JavaEE Cookie的基本使用細(xì)節(jié)

    JavaEE Cookie的基本使用細(xì)節(jié)

    本章我們將學(xué)習(xí)會(huì)話跟蹤技術(shù)中的Cookie與Session,它在我們整個(gè)JavaEE的知識(shí)體系中是非常重要的,本節(jié)我們先介紹Cookie,廢話不多說(shuō),直接上正文
    2022-12-12
  • SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    SpringTask實(shí)現(xiàn)定時(shí)任務(wù)方法講解

    通過(guò)重寫Schedu lingConfigurer方法實(shí)現(xiàn)對(duì)定時(shí)任務(wù)的操作,單次執(zhí)行、停止、啟動(dòng)三個(gè)主要的基本功能,動(dòng)態(tài)的從數(shù)據(jù)庫(kù)中獲取配置的定時(shí)任務(wù)cron信息,通過(guò)反射的方式靈活定位到具體的類與方法中
    2023-02-02
  • 解讀JDK1.8?默認(rèn)使用什么垃圾收集器

    解讀JDK1.8?默認(rèn)使用什么垃圾收集器

    這篇文章主要介紹了解讀JDK1.8?默認(rèn)使用什么垃圾收集器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評(píng)論