javasetmap
A. java中List、Set、Map介面之間的區別和聯系
List 用於遍歷一個數組時效率最高;比如在循環顯示所有信息時經常用到;
Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。 Map 就是鍵值對map(鍵,值),鍵是Sting 類型 值是Object (對象類型),所以在知道某條信息的一項時查詢其他項就用該方法,效率最高!(以上個人見解!)
詳細:數組和其它容器的區別主要有三方面:效率,類型,和保存基本類型的能力.在Java中,數組是一種效率很高的存儲和隨機訪問對象引用序列的方式.數組是一 個簡單的線性序列,因此訪問速度很快,但也損失了其它一些特性.創建一個數組對象後,大小就固定了,如果空間不夠,通常是再創建一個數組,然後把舊數組中 的所有引用移到新數組中.數組可可以保存基本類型,容器不行.
容器類不以具體的類型來處理對象,而是將所有的對象都以Object類型來處理,所以我們可以只創建一個容器,任意的Java對象都可以放進去.容器類可 以使用包裝類(Integer,Double等),以便把基本類型放入其中. List Set Map 都可以自動調整容量,數組不能.
Collection表示一組對象,這些對象也稱為collection的元素。一些 collection允許有重復的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK中不提供此介面的任何直接實 現,它提供更具體的子介面(如 Set 和 List)實現.
Map 將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多隻讓悶能映射一個值.Map 介面提供三種collection視圖,允許以鍵集、值集合或鍵值映射關系集的形式查看某個映射的內容。某些映射實現可明確保證其順序,如 TreeMap(有序) 類;某些映射實現則不保證順序,如 HashMap(無序) 類。Map可以像數組那樣擴展成多維數組,只要把每個值也做成一個Map就行了.
Collection和Map是Java容器中的兩種基本類型. 區別在於容器中每個位置保存的元素個數.Collection每個位置只能保存一個元素,包括List和Set.其中List以進入的順序保存一組元素; 而Set中的元素不能重復.ArrayList是一種List,HashSet是一種Set,將元素添加入任意Collection都可以使用add() 方法.Map保存的是健值對.使用put()為Map添加元素,它需要一個健和一個值作參數.
ArrayList和LinkedList都實現了List介面,ArrayList底層由數組支持LinkedList由雙向鏈表支持,因此,如果經常在表中插入或刪除元素LinkedList比較適合,如果經常查詢ArrayList比較適合.
Set的實現有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基於TreeMap,生成一個總是處於排序狀態的Set.
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方仔擾便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在念滑旦可能的情況下,我們要多運用Array。另外很重要的一點就是Vector「sychronized」的,這個也是Vector和ArrayList的唯一的區別。
ArrayList:同Vector一樣是一個基於Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。
LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。
List總結:
1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
HashSet:雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看HashSet的add(Object obj)方法的實現就可以一目瞭然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
這個也是為什麼在Set中不能像在List中一樣有重復的項的根本原因,因為HashMap的key是不能有重復的。
LinkedHashSet:HashSet的一個子類,一個鏈表。
TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。
Set總結:
1. Set實現的基礎是Map(HashMap);
2. Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;
http://user.qzone.qq.com/530536333/blog/1283866146
List介面對Collection進行了簡單的擴充,它的具體實現類常用的有ArrayList和LinkedList。你可以將任何東西放到一個List容器中,並在需要時從中取出。ArrayList從其命名中可以看出它是一種類似數組的形式進行存儲,因此它的隨機訪問速度極快,而LinkedList的內部實現是鏈表,它適合於在鏈表中間需要頻繁進行插入和刪除操作。在具體應用時可以根據需要自由選擇。前面說的Iterator只能對容器進行向前遍歷,而ListIterator則繼承了Iterator的思想,並提供了對List進行雙向遍歷的方法。
Set介面也是Collection的一種擴展,而與List不同的時,在Set中的對象元素不能重復,也就是說你不能把同樣的東西兩次放入同一個Set容器中。它的常用具體實現有HashSet和TreeSet類。HashSet能快速定位一個元素,但是你放到HashSet中的對象需要實現hashCode()方法,它使用了前面說過的哈希碼的演算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable介面。有時多個類具有相同的排序演算法,那就不需要在每分別重復定義相同的排序演算法,只要實現Comparator介面即可。集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復制、查找和填充等一些非常有用的方法,Arrays則是對一個數組進行類似的操作。
Map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對於鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的並不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最後一次修改的值對象與鍵對應。對於值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。Map有兩種比較常用的實現:HashMap和TreeMap。HashMap也用到了哈希碼的演算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個范圍以取得其子Map。鍵和值的關聯很簡單,用pub(Object key,Object value)方法即可將一個鍵與一個值對象相關聯。用get(Object key)可得到與此key對象所對應的值對象。
B. Java中用set 和map實現這段代碼,謝謝!
1、面向介面(DAO)編程,介面的實現。
構建User.java實體類,構建UserImpl.java類,實現UserDao介面,構建MapDal.java,模擬資料庫,Main.java模擬UI,UI只調用UserImpl,UserImpl調用MapDal。
main.java
package.;
importjava.util.*;
/**
*Main主方法
*@authorbufei
*
*/
publicclassMain{
publicstaticvoidmain(String[]args){
intuserNum=9;
//定義UserList
List<User>list=newArrayList<User>();
for(inti=0;i<userNum;i++){
Useruser=newUser();
user.setPassWord("passWord"+i);
user.setUserName("userName"+i);
list.add(user);
}
//實例化UserImpl
UserImpluserImpl=newUserImpl(list);
//用戶張三是否存在
StringuserName="張三";
StringpassWord="passWord";
Useruser=newUser();
user.setUserName(userName);
user.setPassWord(passWord);
System.out.println("---Demo---");
//1、isExist(user)
System.out.println("查找用戶"+userName+"...");
if(userImpl.isExist(user)){
System.out.println(userName+"存在!");
}else{
System.out.println(userName+"不存在!");
}
//2、addUser
System.out.println("添加用戶"+userName+",psw="+passWord+"...");
稿森userImpl.addUser(user);
//3、changePassword(userName)
System.out.println("修改密碼...");
passWord="zhangsanpasword";
if(userImpl.changePassword(userName,passWord)){
System.out.println("修改成功!");
}else{
System.out.println("用戶不存在!");
}
//4selectAll()
list=userImpl.selectAll();
System.out.println("獲取全部User:");
for(UseruserItem:list){
攔敬System.out.println(userItem.getUserName()+","+userItem.getPassWord());
}
}
}
UserImpl.java
package.;
importjava.util.*;
/**
*UserDao介面實現
*@authorbufei
*
*/
{
privateMapDalmapDal;
/**
*構造器,初始化Map資料庫
*/
publicUserImpl(List<User>list){
mapDal=newMapDal(list);
}
/**
*1.判斷某個user是否存在
*@paramuser用戶對象
*@return返回true/false用戶是否存鍵衡畝在
*/
publicbooleanisExist(Useruser){
booleanrs=false;
rs=mapDal.isExist(user);
returnrs;
}
/**
*2.添加User
*題目所給void返回類型不合理
*@paramuser
*
**/
publicvoidaddUser(Useruser){
if(mapDal.addUser(user)){
System.out.println("添加完成!");
}else{
System.out.println("添加失敗!");
}
}
/**
*3.根據username修改password
*@paramusername
*@parampassword
*@return成功與否
**/
publicbooleanchangePassword(StringuserName,Stringpassword){
booleanrs=false;
Useruser=newUser();
user.setUserName(userName);
user.setPassWord(password);
rs=mapDal.changePassword(user);
returnrs;
}
/**
*根據用戶對象修改密碼
*@paramuser
*@return
*/
publicbooleanchangePassword(Useruser){
returnmapDal.changePassword(user);
}
/**
*4.得到所有的User,用List封裝
*@return從資料庫查詢到所有的User
**/
publicList<User>selectAll(){
returnmapDal.selectAll();
}
}
MapDal.java
package.;
importjava.util.*;
/**
*MapDml用map模擬資料庫,初始化生成一些User
*單例模式,避免數據不同步
*@authorbufei
*
*/
publicclassMapDal{
/**list中存map,實在繞得很,直接存User也是可以*/
publicstaticList<Map<String,String>>userMapList=newArrayList<Map<String,String>>();
/**
*初始化,有參構造器
*構造Mapmap,存儲全部的userName,passWord,模擬資料庫
*
*/
publicMapDal(List<User>list){
for(Useruser:list){
MapuserMap=newHashMap<String,String>();
userMap.put(user.getUserName(),user.getPassWord());
userMapList.add(userMap);
}
}
/**
*無參構造器
**/
publicMapDal(){
}
/**
*
*@paramuser
*@return
*/
publicbooleanisExist(Useruser){
booleanrs=false;
//遍歷userMapList查找用戶是否存在
for(Map<String,String>map:userMapList){
//找到該map
if(map.get(user.getUserName())!=null){
rs=true;
}
}
returnrs;
}
/**
*addUser,userName已存在則無法加入
*@paramuser
*@returnboolean
*/
publicbooleanaddUser(Useruser){
booleanrs=false;
//遍歷userMapList查找用戶是否存在
for(Map<String,String>map:userMapList){
//找到該map,已經存在,無法添加
if(map.get(user.getUserName())!=null){
returnrs;
}
}
if(!rs){
Map<String,String>userMap=newHashMap<String,String>(8);
userMap.put(user.getUserName(),user.getPassWord());
userMapList.add(userMap);
rs=true;
}
returnrs;
}
/**
*deleteUser
*@return
*/
publicbooleandeleteUser(){
booleanrs=false;
returnrs;
}
/**
*changePassword
*@paramuser
*@return
*/
publicbooleanchangePassword(Useruser){
booleanrs=false;
//定義遍歷索引
inti=0;
//遍歷userMapList查找用戶是否存在
for(Map<String,String>map:userMapList){
//找到該map,remove,再次存入新的
if(map.get(user.getUserName())!=null){
userMapList.remove(i);
//hashmap初試默認值0.75-16
MapuserMap=newHashMap<String,String>(8);
userMap.put(user.getUserName(),user.getPassWord());
userMapList.add(userMap);
rs=true;
}
i++;
}
returnrs;
}
/**
*selectAll()
*
*@return返回全體user
*/
publicList<User>selectAll(){
List<User>list=newArrayList<User>();
//遍歷map
for(Map<String,String>userMap:userMapList){
Useruser=newUser();
//map訪問需要使用Map.Entry<>
//entry需要Set.iterator().next()
SetentriSet=userMap.entrySet();
Iterator<Map.Entry<String,String>>iterator=entriSet.iterator();
if(iterator.hasNext()){
//此時entry是Object
Map.Entry<String,String>entry=iterator.next();
user.setUserName(entry.getKey().toString());
user.setPassWord(entry.getValue().toString());
list.add(user);
}
}
returnlist;
}
}
2、運行效果
C. java中list,set和map 的區別
List按對象進入的順序保存對象,不做排序或編輯操作。Set對每個對象只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於Set,而不關心它的順序–否則應該使用List)。Map同樣對每個元素保存一份,但這是基於」鍵」的,Map也有內置的排序,因而不關心元素添加的順序。如果添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap. List的功能方法
實際上有兩種List: 一種是基本的ArrayList,其優點在於隨機訪問元素,另一種是更強大的LinkedList,它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。
List : 次序是List最重要的特點:它保證維護元素特定的順序。List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(這只推薦LinkedList使用。)一個List可以生成ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。
ArrayList : 由數組實現的List。允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速度很慢。ListIterator只應該用來由後向前遍歷ArrayList,而不是用來插入和移除元素。因為那比LinkedList開銷要大很多。
LinkedList : 對順序訪問進行了優化,向List中間插入與刪除的開銷並不大。隨機訪問則相對較慢。(使用ArrayList代替。)還具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 這些方法 (沒有在任何介面或基類中定義過)使得LinkedList可以當作堆棧、隊列和雙向隊列使用。
Set的功能方法
Set具有與Collection完全一樣的介面,因此沒有任何額外的功能,不像前面有兩個不同的List。實際上Set就是Collection,只是行為不同。(這是繼承與多態思想的典型應用:表現不同的行為。)Set不保存重復的元素(至於如何判斷元素相同則較為負責)
Set : 存入Set的每個元素都必須是唯一的,因為Set不保存重復元素。加入Set的元素必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的介面。Set介面不保證維護元素的次序。
HashSet : 為快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
TreeSet : 保存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
Map的功能方法
方法put(Object key, Object value)添加一個「值」(想要得東西)和與「值」相關聯的「鍵」(key)(使用它來查找)。方法get(Object key)返回與給定「鍵」相關聯的「值」。可以用containsKey()和containsValue()測試Map中是否包含某個「鍵」或「值」。標準的Java類庫中包含了幾種不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有同樣的基本介面Map,但是行為、效率、排序策略、保存對象的生命周期和判定「鍵」等價的策略等各不相同。
執行效率是Map的一個大問題。看看get()要做哪些事,就會明白為什麼在ArrayList中搜索「鍵」是相當慢的。而這正是HashMap提高速度的地方。HashMap使用了特殊的值,稱為「散列碼」(hash code),來取代對鍵的緩慢搜索。「散列碼」是「相對唯一」用以代表對象的int值,它是通過將該對象的某些信息進行轉換而生成的。所有Java對象都能產生散列碼,因為hashCode()是定義在基類Object中的方法。
HashMap就是使用對象的hashCode()進行快速查詢的。此方法能夠顯著提高性能。
Map : 維護「鍵值對」的關聯性,使你可以通過「鍵」查找「值」
HashMap : Map基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。可以通過構造器設置容量capacity和負載因子load factor,以調整容器的性能。
LinkedHashMap : 類似於HashMap,但是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用鏈表維護內部次序。
TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
WeakHashMao : 弱鍵(weak key)Map,Map中使用的對象也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個「鍵」,則此「鍵」可以被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()對「鍵」作比較的hash map。專為解決特殊問題而設計。
D. Java的數據結構你用過哪些Map與Set的本質區別是什麼
java中常見的數據結構有:
數組
集合類——Collection(list(ArrayList,LinkedList),set(HashSet))
List 是鏈表(介面),是可以允許出現重復值的。它的具體實現類:ArrayList和LinkedList
set 是集合(介面),不允許出現重復值。它的具體實現類HashMap
ArrayList 實現鏈表的內部結構是用數組(Array)。查找高效,修改低效
LinkedList 實現鏈表的內部結構是鏈表(Linked)。查找低效,修改高效
set是集合(介面),不允許出現重復值
Iterator迭代器
簡介:java提供的迭代器介面進行java collection的遍歷。Iterator模式是用於遍歷類的標准訪問方法
所有的繼承Coollection的集合類子類,都有Iterator()方法用於反饋迭代器,程序額可以獲取這個迭代器對象對Collection對象中的元素進行遍歷。
鍵值對容器 ——Map
Map是一種把鍵對象和值對象進行關聯的容器
指出:像set一樣,一個Map容器中的鍵對象不允許重復,這是為了保證查找結果的一致性。
E. Java中Set與Map各自實現類效率是怎樣的情況
Set是Map的key的集衡遲缺合,所以說set和map一樣都不可重復,set是map的簡化旦芹所以set要比map快,TreeSet和TreeMap相對於HashSet和HashMap主要是可以有排序的功能,在存儲數據是自動排序,因此效率肯定要低於HashSet和咐辯HashMap
F. Java中List Set Map 是否有序等總結
其實都是有序的。
不過set
和
map
的排序規則不是通常意義上拆派頌的1,2,羨中3這樣排的而是按照HashCode,演算法比較復雜,所以通旅鄭常把set和map當作無序的
list
的有序很簡單,就是按添加的順序
G. JAVA裡面set,map,list的區別是什麼(盡量詳細)
java集合的主要分為三種類型:
Set(集)
List(列表)
Map(映射)
要深入理解集合首先要了解下我們熟悉的數組:
數組是大小固定的,並且同一個數組只能存放類型一樣的數據(基本類型/引用類型),而JAVA集合可以存儲和操作數目不固定的一組數據。 所有的JAVA集合都位於 java.util包中! JAVA集合只能存放引用類型的的數據,不能存放基本數據類型。
簡單說下集合和數組的區別:(參考文章:《Thinking In Algorithm》03.數據結構之數組)
Java所有「存儲及隨機訪問一連串對象」的做法,array是最有效率的一種。
1、
效率高,但容量固定且無法動態改變。
array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們array的容量。
2、Java中有一個Arrays類,專門用來操作array。
arrays中擁有一組static函數,
equals():比較兩個array是否相等。array擁有相同元素個數,且所有對應元素兩兩相等。
fill():將值填入array中。
sort():用來對array進行排序。
binarySearch():在排好序的array中尋找元素。
System.array():array的復制。
若撰寫程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。所以就要用到集合。
那我們開始討論java中的集合。
集合分類:
Collection:List、Set
Map:HashMap、HashTable
H. Java中的Set,List,Map的區別
對JAVA的集合的理解是想對於數組
數組是大小固定的 並且同一個數組只能存放類型一樣的數據(基本類型/引用類型)
JAVA集合可以存儲和操作數目不固定的一組數據
所有的JAVA集合都位於 java util包中!
JAVA集合只能存放引用類型的的數據 不能存放基本數據類型
JAVA集合主要分為三種類型
Set(集)
List(列表)
Map(映射)
Collection 介面
Collection是最基本的集合介面 聲明了適用於JAVA集合(只包括Set和List)的通用方法
Set 和List 都繼承了Conllection Map沒有
Collection介面的方法
boolean add(Object o) :向集合中加入一個對象的引用
void clear() :刪除集合中所有的對象 即不再持有這些對象的引用
boolean isEmpty() :判斷集合是否為空
boolean contains(Object o): 判斷集合中是否持有特定對象的引用
Iterartor iterator() : 返回一個Iterator對象 可以鄭槐用來遍歷集合中的元素
boolean remove(Object o):從集合中刪除一個對象的引用
int size() :返回集合中元素的數目
Object[] toArray() :返回一個數組 該數組中包括集合中的所有元素
關於 Iterator() 和toArray() 方法都用於集合的所有的元素 前者返回一個Iterator對象 後者返回一個
包含集合中所有元素的數組
Iterator介面聲明了如下方法
hasNext(): 判斷集合中元素是否遍歷完畢 如果沒有 就返回true
next() :返回下一個元素
remove():從集合中刪除上一個有next()方法返回的元素
Set(集合)
Set是最簡單的友旅一種集合 集合中的對象不按特定的方式排序 並且沒有重復對象
Set介面主要實現了兩個實現類
HashSet : HashSet類按照哈希演算法來存取集合中的對象 存取速度比較快
TreeSet : TreeSet類實現了SortedSet介面 能夠對集合中的對象進行排序
Set 的用法
存放的是對象的引用 沒有重復對象
Set set=new HashSet();
String s =new String( hello );
String s =s ;
String s =new String( world );
set add(s );
set add(s );
set add(s );
System out println(set size());//列印集合中對象的數目 為
Set 的 add()方法是如何判斷對象是否已經存放在集合中?
boolean isExists=false;
Iterator iterator=erator();
while(it hasNext()) {
String oldStr=it next();
if(newStr equals(oldStr)){
isExists=true;
}
}
List(列表)
List的特徵是其元素以線性方式存儲 集合中可以存放重復對象
List介面主要實現類包括
ArrayList() : 代表長度可以改變得數組 可以對元素進行隨機的訪問 向ArrayList()中插入與
與刪除元素的速度慢
LinkedList(): 在實現中採用鏈表數據結構 插入和刪除速度快 訪問速度慢
對於List的隨機訪問來說 就是只隨機來檢索位於特定位置的元素
List 的 get(int index) 方法放回集合中由參數index指定的索引位置的對象 下標從 開始
最基本的兩種檢索集合中的所有對象的方法
: 用for循環和喊告友get()方法
for(int i= ; i<list size();i++){
System out println(list get(i));
}
: 使用 迭代器(Iterator):
Iterator it=erator();
while(it hashNext){
System out println(it next);
}
Map(映射):
Map 是一種把鍵對象和值對象映射的集合 它的每一個元素都包含一對鍵對象和值對象
Map沒有繼承於Collection介面
從Map集合中檢索元素時 只要給出鍵對象 就會返回對應的值對象
Map 的常用方法
添加 刪除操作
Object put(Object key Object value): 向集合中加入元素
Object remove(Object key): 刪除與KEY相關的元素
void putAll(Map t): 將來自特定映像的所有元素添加給該映像
void clear(): 從映像中刪除所有映射
查詢操作
Object get(Object key): 獲得與關鍵字key相關的值
Map集合中的鍵對象不允許重復 也就說 任意兩個鍵對象通過equals()方法比較的結果都是false
但是可以將任意多個鍵獨享映射到同一個值對象上
Conllections : 集合實用類
Conllections提供了供JAVA集合實用的靜態方法
總結
JAVA集合的基本用法 都歸納了 上面這些是平常最常用的JAVA集合 具體的其他的 還要參考JDK幫助文檔了 呵呵 關於 Map的應用 還有很多 具體就是這個 Conllections提供了很多 List /Map 實用的方法 對平常開發非常有用
對次會會不斷修改!
boolean containsKey(Object key): 判斷映像中是否存在關鍵字key
boolean containsValue(Object value): 判斷映像中是否存在值value
int size(): 返回當前映像中映射的數量
boolean isEmpty() 判斷映像中是否有任何映射
List按對象進入的順序保存對象 不做排序或編輯操作 Set對每個對象只接受一次 並使用自己內部的排序方法(通常 你只關心某個元素是否屬於Set 而不關心它的順序 否則應該使用List) Map同樣對每個元素保存一份 但這是基於 鍵 的 Map也有內置的排序 因而不關心元素添加的順序 如果添加元素的順序對你很重要 應該使用 LinkedHashSet或者LinkedHashMap
List的功能方法
實際上有兩種List: 一種是基本的ArrayList 其優點在於隨機訪問元素 另一種是更強大的LinkedList 它並不是為快速隨機訪問設計的 而是具有一套更通用的方法
List : 次序是List最重要的特點 它保證維護元素特定的順序 List為Collection添加了許多方法 使得能夠向List中間插入與移除元素(這只推薦LinkedList使用 )一個List可以生成ListIterator 使用它可以從兩個方向遍歷List 也可以從List中間插入和移除元素
ArrayList : 由數組實現的List 允許對元素進行快速隨機訪問 但是向List中間插入與移除元素的速度很慢 ListIterator只應該用來由後向前遍歷ArrayList 而不是用來插入和移除元素 因為那比LinkedList開銷要大很多
LinkedList : 對順序訪問進行了優化 向List中間插入與刪除的開銷並不大 隨機訪問則相對較慢 (使用ArrayList代替 )還具有下列方法 addFirst() addLast() getFirst() getLast() removeFirst() 和 removeLast() 這些方法 (沒有在任何介面或基類中定義過)使得LinkedList可以當作堆棧 隊列和雙向隊列使用
Set的功能方法
Set具有與Collection完全一樣的介面 因此沒有任何額外的功能 不像前面有兩個不同的List 實際上Set就是Collection 只是行為不同 (這是繼承與多態思想的典型應用 表現不同的行為 )Set不保存重復的元素(至於如何判斷元素相同則較為負責)
Set : 存入Set的每個元素都必須是唯一的 因為Set不保存重復元素 加入Set的元素必須定義equals()方法以確保對象的唯一性 Set與Collection有完全一樣的介面 Set介面不保證維護元素的次序
HashSet : 為快速查找設計的Set 存入HashSet的對象必須定義hashCode()
TreeSet : 保存次序的Set 底層為樹結構 使用它可以從Set中提取有序的序列
LinkedHashSet : 具有HashSet的查詢速度 且內部使用鏈表維護元素的順序(插入的次序) 於是在使用迭代器遍歷Set時 結果會按元素插入的次序顯示
Map的功能方法
方法put(Object key Object value)添加一個 值 (想要得東西)和與 值 相關聯的 鍵 (key)(使用它來查找) 方法get(Object key)返回與給定 鍵 相關聯的 值 可以用containsKey()和containsValue()測試Map中是否包含某個 鍵 或 值 標準的Java類庫中包含了幾種不同的Map HashMap TreeMap LinkedHashMap WeakHashMap IdentityHashMap 它們都有同樣的基本介面Map 但是行為 效率 排序策略 保存對象的生命周期和判定 鍵 等價的策略等各不相同
執行效率是Map的一個大問題 看看get()要做哪些事 就會明白為什麼在ArrayList中搜索 鍵 是相當慢的 而這正是HashMap提高速度的地方 HashMap使用了特殊的值 稱為 散列碼 (hash code) 來取代對鍵的緩慢搜索 散列碼 是 相對唯一 用以代表對象的int值 它是通過將該對象的某些信息進行轉換而生成的 所有Java對象都能產生散列碼 因為hashCode()是定義在基類Object中的方法
HashMap就是使用對象的hashCode()進行快速查詢的 此方法能夠顯著提高性能
Map : 維護 鍵值對 的關聯性 使你可以通過 鍵 查找 值
HashMap : Map基於散列表的實現 插入和查詢 鍵值對 的開銷是固定的 可以通過構造器設置容量capacity和負載因子load factor 以調整容器的性能
LinkedHashMap : 類似於HashMap 但是迭代遍歷它時 取得 鍵值對 的順序是其插入次序 或者是最近最少使用(LRU)的次序 只比HashMap慢一點 而在迭代訪問時發而更快 因為它使用鏈表維護內部次序
TreeMap : 基於紅黑樹數據結構的實現 查看 鍵 或 鍵值對 時 它們會被排序(次序由Comparabel或Comparator決定) TreeMap的特點在於 你得到的結果是經過排序的 TreeMap是唯一的帶有subMap()方法的Map 它可以返回一個子樹
WeakHashMao : 弱鍵(weak key)Map Map中使用的對象也被允許釋放: 這是為解決特殊問題設計的 如果沒有map之外的引用指向某個 鍵 則此 鍵 可以被垃圾收集器回收
lishixin/Article/program/Java/ky/201311/27866
I. Java實際開發中set,Map,List分別用在什麼情況
set、map、list是Java API封裝的數據結構。之所以封裝它們,是為了符合數學意義上的set、map和list上的一些特唯賣點。
比如set(集合)具有無序性,而且元素不能重復。
map主要是散列思想,即key-value值對。
list是鏈表結構,插入和刪除元素,一個在頭,一個在尾。
另外還有Stack是同一端插入和刪除。
你說他們功能一樣其實是錯的,雖然對於某些問題用他們都可以解決,比如迷宮問題,可以用Stack,可以用鏈表,甚至可以直接用個簡單的一維數組(因為多維數組可以由一維數組表示),但是解決時的復雜度是不同的。這其中除了演算法中的時間、空腔老間代價的不同(比如使用散列,搜索時間大大減少,但是佔用空間增大),當然還包括使用不同數據結構解決不同問題時的「自然」程度(即讓別人容易明白你的演算法的程度)。
說了這么多,其實封裝這些東西就是為了方便編程,方便實現功能。
就像你可以說:「一條語句和一個函數(語句組成)本質上都是相同的,那為什麼要那麼麻煩設計函數?」那你就可以去查查函數編程思想和之後發展起來的面向對象指圓逗編程思想的優勢。
最後再提下Java裡面一些高級點的東西,即所謂線程安全,某些數據結構封裝類不是線程安全的,而另外一些是,這些你可以去查看API或者底層代碼實現,要花費很大耐心的
J. java中的set和map的內部實現細節是什麼(就像ArrayList是Object數組,LinkedList是鏈表),越詳細越好。
一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。正如其名稱所暗示的,此介面模仿了大指數學上的 set 抽象。
在所有構造方法以及 add、equals 和 hashCode 方法的協定上,Set 介面還加入了其他規定,這些規定超出了從 Collection 介面所繼承的內容。出於方便考慮,它還包括了其他繼承方法的聲明(這些聲明的規范已經專門針對 Set 介面進行了修改,但是沒有包含任何其他的規定)。
對這些構造方法的其他滲嘩規定是(不要奇怪),所有構造方法必須創建一個不包含重復元素的 set(正如上面所定義的)。
註:如果將可變對象用作 set 元素,那麼必須極其小心。如果對象是 set 中某個元素,以一種影響 equals 比較的方式改變對象的值,那麼 set 的行為就是不確定的。此項禁止的一個特殊情況是不允許某個 set 包含其自身作為元素。
某些 set 實現對其所包含的元素有所限制。例如,某些實現禁止 null 元素,而某些則對其元素的類型所有限制。試圖添加不合格的元素會拋出未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢不合格的元素是否存在可能會拋出異常,也可能簡單地返回 false;某些實現會採用前一種行為,而某些則採用後者。概括地說,試圖對不合格元素執行操作時,如果完成該操作後不會導致在 set 中插入不合格的元素,則該操作可能拋出一個異常,也可能成功,這取決於實現的選擇。此介面的規范中將這樣的異常標記為「可選」。
public interface Map<K,V>將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多隻能映射到一個值。
此介面取代 Dictionary 類,後者完全是一個抽象類,而不是一個介面。
Map 介面提供三種collection 視圖,允許以鍵集、值集或鍵-值映射關系集的形式查看某個映射的內容。映射順序 定義為迭代器在映射的 collection 視圖上返回其元素的順序。某些映射實現可明確保證其順序,如 TreeMap 類;另一些映射實現則不保證順序,如 HashMap 類。
註:將可變對象用作映射鍵時必須格外小心。當對象是映射中某個鍵時,如果以影響 equals 比較的方式更改了對象的值,則映射的行為將是不確定的。此項滾喊配禁止的一種特殊情況是不允許某個映射將自身作為一個鍵包含。雖然允許某個映射將自身作為值包含,但請格外小心:在這樣的映射上 equals 和 hashCode 方法的定義將不再是明確的。
所有通用的映射實現類應該提供兩個「標準的」構造方法:一個 void(無參數)構造方法,用於創建空映射;一個是帶有單個 Map 類型參數的構造方法,用於創建一個與其參數具有相同鍵-值映射關系的新映射。實際上,後一個構造方法允許用戶復制任意映射,生成所需類的一個等價映射。盡管無法強制執行此建議(因為介面不能包含構造方法),但是 JDK 中所有通用的映射實現都遵從它。
此介面中包含的「破壞」方法可修改其操作的映射,如果此映射不支持該操作,這些方法將拋出 UnsupportedOperationException。如果是這樣,那麼在調用對映射無效時,這些方法可以(但不要求)拋出 UnsupportedOperationException。例如,如果某個不可修改的映射(其映射關系是「重疊」的)為空,則對該映射調用 putAll(Map) 方法時,可以(但不要求)拋出異常。
某些映射實現對可能包含的鍵和值有所限制。例如,某些實現禁止 null 鍵和值,另一些則對其鍵的類型有限制。嘗試插入不合格的鍵或值將拋出一個未經檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢是否存在不合格的鍵或值可能拋出異常,或者返回 false;某些實現將表現出前一種行為,而另一些則表現後一種。一般來說,試圖對不合格的鍵或值執行操作且該操作的完成不會導致不合格的元素被插入映射中時,將可能拋出一個異常,也可能操作成功,這取決於實現本身。這樣的異常在此介面的規范中標記為「可選」。
此介面是 Java Collections Framework 的成員。
Collections Framework 介面中的很多方法是根據 equals 方法定義的。例如,containsKey(Object key) 方法的規范中寫道:「當且僅當此映射包含針對滿足 (key==null ? k==null : key.equals(k)) 的鍵 k 的映射關系時,返回 true」。不 應將此規范解釋為:調用具有非空參數 key 的 Map.containsKey 將導致對任意的鍵 k 調用 key.equals(k)。實現可隨意進行優化,以避免調用 equals,例如,可首先比較兩個鍵的哈希碼(Object.hashCode() 規范保證哈希碼不相等的兩個對象不會相等)。一般來說,只要實現者認為合適,各種 Collections Framework 介面的實現可隨意利用底層 Object 方法的指定行為。