正文

hashtable-hashtable為什么不能為null

xinfeng335
文章最后更新時(shí)間2025年03月15日,若文章內(nèi)容或圖片失效,請(qǐng)留言反饋!

  1,將數(shù)組轉(zhuǎn)換為ArrayList

hashtable-hashtable為什么不能為null
(圖片來(lái)源網(wǎng)絡(luò),侵刪)

  要將數(shù)組轉(zhuǎn)換為ArrayList ,開(kāi)發(fā)人員通常會(huì)這樣做hashtable

  Listlist = Arrays.asList(arr);

  Arrays.asList將返回一個(gè)ArrayList ,它是Arrays中的一個(gè)私有靜態(tài)類,它不是java.util.ArrayList類。java.util.Arrays.ArrayList類具有set , get , contains方法,但沒(méi)有添加元素的任何方法,因此其大小是固定的。要?jiǎng)?chuàng)建一個(gè)真正的ArrayList ,你應(yīng)該做:

  ArrayListarrayList = new ArrayList(Arrays.asList(arr));

  ArrayList的構(gòu)造函數(shù)可以接受一個(gè)Collection類型,它也是java.util.Arrays.ArrayList的超類

  2,檢查數(shù)組是否包含某個(gè)值

  開(kāi)發(fā)人員經(jīng)常做:

  Setset = new HashSet(Arrays.asList(arr));

  return set.contains(targetValue);

  這個(gè)代碼可用,但是其實(shí)不需要將列表轉(zhuǎn)換為Set。將列表轉(zhuǎn)換為集合需要額外的時(shí)間。它可以簡(jiǎn)單的:

  Arrays.asList(arr).contains(targetValue);

  或

  for(String s: arr){

  if(s.equals(targetValue))

  return true;

  }

  return false;

  第一個(gè)比第二個(gè)更可讀。

  3從循環(huán)中的列表中刪除元素

  考慮以下代碼,它會(huì)在迭代過(guò)程中刪除元素:

  ArrayListlist = new ArrayList(Arrays.asList("a", "b", "c", "d"));

  for (int i = 0; i < list.size; i++) {

  list.remove(i);

  }

  System.out.println(list);

  輸出為:

  [b, d]

  這種方法有一個(gè)嚴(yán)重的問(wèn)題。刪除元素時(shí),列表的大小縮小了,索引也更改了。所以如果你想通過(guò)使用索引刪除循環(huán)中的多個(gè)元素,將無(wú)法正常工作。

  你可能知道使用迭代器是循環(huán)中刪除元素的正確方法,并且知道Java中的foreach循環(huán)類似于迭代器,但實(shí)際上并不是這樣。請(qǐng)考慮以下代碼:

  for (String s : list) {

  if (s.equals("a"))

  list.remove(s);

  }

  它會(huì)拋出ConcurrentModificationException 。

  相反,以下是可以的:

  Iteratoriter = list.iterator;

  while (iter.hasNext) {

  String s = iter.next;

  if (s.equals("a")) {

  iter.remove;

  }

  }

  .next必須在.remove之前調(diào)用。在foreach循環(huán)中,編譯器將在刪除元素的操作后調(diào)用.next .next ,這導(dǎo)致ConcurrentModificationException 。

  4 Hashtable與HashMap

  Hashtable是算法中數(shù)據(jù)結(jié)構(gòu)的名稱。但是在Java中,數(shù)據(jù)結(jié)構(gòu)的名稱是HashMap 。Hashtable和HashMap之間的關(guān)鍵區(qū)別之一是Hashtable是同步的。所以很多時(shí)候你不需要Hashtable ,而應(yīng)該使用HashMap 。

  5 使用Collection的原始類型

  在Java中,原始類型和無(wú)限制的通配符類型很容易混合在一起。以Set為例, Set為raw類型,而Set是無(wú)限制的通配符類型。

  考慮使用原始類型List作為參數(shù)的以下代碼:

  public static void add(List list, Object o){

  list.add(o);

  }

  public static void main(String[] args){

  Listlist = new ArrayList;

  add(list, 10);

  String s = list.get(0);

  }

  這段代碼會(huì)拋出一個(gè)異常:

  Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

  at ...

  使用原始類型集合是危險(xiǎn)的,因?yàn)樵碱愋图咸^(guò)泛型類型檢查并且不安全。Set , Set和Set

  6. 訪問(wèn)級(jí)別

  開(kāi)發(fā)人員常常使用public來(lái)進(jìn)行類字段。通過(guò)直接引用來(lái)獲取字段值很容易,但這是一個(gè)非常糟糕的設(shè)計(jì)。經(jīng)驗(yàn)法則是為成員提供盡可能低的訪問(wèn)級(jí)別。

  public, default, protected, and private

  7 ArrayList與LinkedList

  當(dāng)開(kāi)發(fā)人員不知道ArrayList和LinkedList之間的區(qū)別時(shí),hashtable他們經(jīng)常使用ArrayList 。但是,他們之間的性能差異很大。簡(jiǎn)單地說(shuō),如果存在大量的添加/刪除操作,并且沒(méi)有大量的隨機(jī)訪問(wèn)操作,應(yīng)該首選LinkedList。

  8 可變的與不變的

  不可變對(duì)象具有許多優(yōu)點(diǎn),例如簡(jiǎn)單性,安全性等。但是它需要為每個(gè)不同值分配一個(gè)對(duì)象,并且太多對(duì)象可能會(huì)導(dǎo)致高昂的垃圾回收成本。在可變和不可變之間進(jìn)行選擇時(shí)應(yīng)該有平衡。

  通常,可變對(duì)象被用于避免產(chǎn)生太多的中間對(duì)象。一個(gè)典型的例子是連接大量的字符串。如果使用不可變字符串,則會(huì)產(chǎn)生很多可以立即進(jìn)行垃圾收集的對(duì)象。這浪費(fèi)了CPU上的時(shí)間和精力,使用可變對(duì)象的正確解決方案(例如StringBuilder )。

  String result="";

  result = result + s;

  }

  還有其他情況下,可變對(duì)象是可取的。例如,將可變對(duì)象傳遞到方法中可以收集多個(gè)結(jié)果,而不會(huì)跳過(guò)太多的句法環(huán)。另一個(gè)例子是排序和過(guò)濾:當(dāng)然,可以創(chuàng)建一個(gè)采用原始集合的方法,并返回一個(gè)排序的方法,但對(duì)于較大的集合來(lái)說(shuō),這將變得非常浪費(fèi)。

  9 父類和子類的構(gòu)造函數(shù)

  發(fā)生此編譯錯(cuò)誤是因?yàn)槟J(rèn)的父類構(gòu)造函數(shù)未定義。在Java中,如果一個(gè)類沒(méi)有定義一個(gè)構(gòu)造函數(shù),編譯器將默認(rèn)為該類插入一個(gè)默認(rèn)的無(wú)參數(shù)構(gòu)造函數(shù)。如果在Super類中定義了一個(gè)構(gòu)造函數(shù),在這種情況下,Super(String s),編譯器將不會(huì)插入默認(rèn)的無(wú)參數(shù)構(gòu)造函數(shù)。

  Sub類的構(gòu)造函數(shù),無(wú)論是參數(shù)還是無(wú)參數(shù),都將調(diào)用無(wú)參數(shù)的父類構(gòu)造函數(shù)。由于編譯器嘗試在Sub類中的2個(gè)構(gòu)造函數(shù)中插入super,而是未定義Super的默認(rèn)構(gòu)造函數(shù),編譯器會(huì)報(bào)告錯(cuò)誤消息。

  要解決這個(gè)問(wèn)題,只需1)添加一個(gè)Super構(gòu)造函數(shù)到超類

  public Super{

  System.out.println("Super");

  }

  ,或2)刪除自定義的父類構(gòu)造函數(shù),或3)添加super(value)到子類構(gòu)造函數(shù)。

  10 “”或構(gòu)造函數(shù)hashtable?

  可以通過(guò)兩種方式創(chuàng)建字符串:

  //1. use double quotes

  String x = "abc";

  //2. use constructor

  String y = new String("abc");

  - 區(qū)別在哪hashtable

  以下示例可以提供一個(gè)快速的答案:

  String a = "abcd";

  String b = "abcd";

  System.out.println(a == b); // True

  System.out.println(a.equals(b)); // True

  String c = new String("abcd");

  String d = new String("abcd");

  System.out.println(c == d); // False

  System.out.println(c.equals(d)); // True

  來(lái)源:黑客日

-- 展開(kāi)閱讀全文 --