當前位置:首頁 » 服務存儲 » 以鍵值對的方式存儲對象的介面是
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

以鍵值對的方式存儲對象的介面是

發布時間: 2022-06-30 08:23:55

⑴ 實現鍵值對存儲(一):什麼是鍵值對存儲,為什麼

鍵值對存儲是資料庫最簡單的組織形式。基本上全部的編程語言都帶有應用在內存中的鍵值對存儲。C++STL的映射容器(map container)和Java的HashMap以及Python的字典類型都是鍵值對存儲。鍵值對存儲通常都有例如以下介面:

Get( key ):獲取之前存儲於某標示符「key」之下的一些數據,或者「key」下沒有數據時報錯。

Set( key, value ):將「value」存儲到存儲空間中某標示符「key」下。使得我們能夠通過調用同樣的「key」來訪問它。

假設「key」下已經有了一些數據,舊的數據將被替換。

Delete( key ):刪除存儲在「key」下的數據。

大部分低層實現都是使用哈希表或者某種自平衡樹(比如B-樹或者紅黑樹)。有時候數據太大而不裝不進內存,或者必須維持數據謹防系統由於未知原因而崩潰。在這些情況下。就必須使用到文件系統。

鍵值對存儲是NoSQL運動的一部分。NoSQL將全部不使用基於關系型資料庫概念的資料庫系統組合在一起。

維基網路上的NoSQL詞條非常好的總結了這些資料庫的特徵。

  • 不使用SQL查詢語言

  • 可不全面支持ACID(原子性、一致性、隔離性、持久性)。

  • 可提供分布式、容錯強的結構

⑵ java集合框架中 哪個集合介面是存儲一組成對的鍵值對象的

肯定是Map啦
舉例:
Map<String,Object> map = new HashMap<String,Object>(); //初始化一個map
map.put("name","小明"); // 往map中put入數據

System.out.println(map.get("name")); // 通過鍵值name獲取值

其中第一個name就是鍵,「小明」就是值

⑶ LinkedList集合是通過鍵值對的方式來存儲對象的。

摘要 Copyright © 1999-2020, CSDN.NET, All Rights Reserved

⑷ Java中Set、List、Map集合類(介面)的特點及區別。分別有哪些常用實現類。

  1. Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變;

  2. List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變;

  3. Map:適合儲存鍵值對的數據。

⑸ 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對象所對應的值對象。

⑹ 勞駕前輩 給我說說 Java的集合框架中的 map list 和set這三個怎麼區分什麼時候什麼情況用哪一個

map集合,對象以鍵值對的形式存放在集合中,並且鍵它是不允許重復的。常用的實現是HashMap和TreeMap,HashMap能夠快速的查詢到一個鍵,而TreeMap則是對鍵按序存放的。
list介面是對collection的擴充,它允許存放相同的元素。常用的有2種實現類,ArrayList和LinkedList。ArraryList是一種以數組形式存放元素的集合,更適合於做查詢,而LinkedList內部實現鏈表,適合做增刪元素操作。
set介面同樣是對collection的擴充,它不允許存放相同的元素。常用類HashSet和TreeSet.HashSet主要能夠快速定位到一個元素,需要用到HashCode()方法,而TreeSet類中可以實現對元素的排序。

⑺ 哪位大俠說說java中的介面

Collection 用來管理多個對象,集合中的每個元素都是對象。

Map,Map中沒有對象,而是鍵值對,由Key,value組成的鍵值對,Key是不可重復的。value是可以相同的,一個Key和一個value一一對應。

集合中用到的類,介面在java.util包中,在使用時注意將其引入import。

Collection 介面(以下介紹其子介面)

1)List 一個List的實現類的對象在管理多個對象時會按順序組織對象(即按照將對象放入的順序存儲),List實現類的對象是有順序的,List實現類對象中的內容是是可重復的。(注意,順序和排序的區別)

2)Set 一個Set的實現類表示一個數學概念上的集合,Set的實現類的對象中的元素是無順序的,也就是不會按照輸入順序來存放,Set的實現類對象中的元素是不重復的。

3)SortedSet,他是Set的子介面,他的實現類會對集合中的元素進行排序。但是要指定排序規則,他會按排序規則進行排序。

Map 介面(以下介紹其子介面)

SortedMap,這個介面的實現類同樣可以實現,不過是對鍵值對中的Key進行排序,這個介面的實現類也是要指定排序規則的。

JDK1.4中的集合是不安全的對象,JDK5.0中解決了這個問題。

List介面的實現類

1> ArrayList是接近於功能的集合類,ArryList的實質就是一個會自動增長的數組,ArrayList是用封裝的數組來實現的List介面的。

Collection的實現類對象的遍歷方式是用迭代來實現的。
在使用迭代器時先要活得一個迭代器的對象,Iterator(迭代器介面)這是一個介面,迭代器是在集合類中實現的,也就是說,他是一個內部類(匿名內部類)實現的。
Iterator介面中定義的常用方法方法hasNext(),next()。
hasNext(),這個方法會使用一個游標,並通過判斷游標指向的位置是否存放有對象。
next()方法也是Iterator介面中定義好的方法,這個方法會使游標指向下一個元素的位置,游標會跳過第一個元素,並返回其中的內容。

Collections 這是一個工具類,也是java.util包中的,這個類中的sort(list介面的實現類的對象)方法,其參數是一個集合類的對象,這個方法使用來對集合類的對象進行排序的。以後,我將以集合這個名字來稱呼集合類的對象。,對於字元串對象內容的集合來說會按字典順序排序(升序),對於數字內容的集合排序也會按照升序排序。

排序可一份為兩部分內容,一個是排序的規則,也就是按照什麼來進行排序,並且排成什麼樣的順序。
第二個就是排序的演算法,他決定了排序的效率。

在對自定義的集合內容類型排序時,需要先定義那個類型的排序規則。
Comparable介面,這個介面中只定義了一個compareTo(Object o),方法的返回至類型是整型,如果當前對象大於參數對象就返回正數,當前對象等於參數對象是就返回0,當前對象小於參數對象時就返回負值,這樣寫就是升序排列,反之則是進行降序排列,在實現這個介面中的方法時,返回值定義方式,只有這兩種。

根據指定類型的排序規則實現了Comparable介面,那麼就可以對存有這個類型的集合進行整體排序。Comparable介面,也叫做可比較介面。這個介面在java.lang包下。只要實現了這個介面,就是可排序的。

接下來介紹另外一種對自定義類型對象的集合整體排序的方法,也就是實現比較器介面(Comparator),這個介面中定義了一個compare(Object o1,Object o2)方法來比較兩個對象,這個方法的返回值定義和上面介紹的那個方法是一樣。

注意:在API,幫助文檔中以上兩個方法的參數類型是T,這代表的模板類型,也就是集合中存放的內容的類型,在JDK1.4中其參數就是Object類型,模板類型的詳細內容會在最後的JDK5.0新特性中講到。

Comparator介面可以在匿名內部類中實現,Collections 中的sort(集合了的對象,比較器)方法,可以對自定義類型內容的集合進行整體排序。

2> LinkedList,它是List介面的實現類,其底層是用雙向循環鏈表來實現的。

注意:ArrayList的查詢效率比較高,增刪動作的效率比較差,適用於查詢比較頻繁,增刪動作較少的元素管理的集合。
LinkedList的查詢效率低,但是增刪效率很高。適用於增刪動作的比較頻繁,查詢次數較少的元素管理集合。

ArrayList,LinkedList都是線程不安全的。

實現堆棧 1,數組(ArrayList,增刪效率比較低,不適合)
2,LinkedList(實現堆棧的好方法)
3,java.util.Stack類,Stack是Vector的子類,Vector類是一個線程安全的(是一個重量級的類),並繼承了Vector的方法,Verctor類(這個類也是List介面的實現類)和ArrayList的功能近乎相同。(不推薦使用Stack類來實現堆棧)。

Set介面的實現類

HashSet

Set的實現類的集合對象中不能夠有重復元素,HashSet也一樣他是使用了一種標識來確定元素的不重復,HashSet用一種演算法來保證HashSet中的元素是不重復的,HashSet的底層實現還是數組。

Object類中的hashCode()的方法是所有子類都會繼承這個方法,這個方法會用Hash演算法算出一個Hash(哈希)碼值返回,HashSet會用Hash碼值去和數組長度取模,模(這個模就是對象要存放在數組中的位置)相同時才會判斷數組中的元素和要加入的對象的內容是否相同,如果不同才會添加進去。

Hash演算法是一種散列演算法。

注意:所以要存入HashSet的集合對象中的自定義類必須覆蓋hashCode(),equals()兩個方法,才能保證集合中元素容不重復。在覆蓋和hashCode()方法時,要使相同對象的hashCode()方法返回相同值,覆蓋equals()方法再判斷其內容。為了保證效率,所以在覆蓋hashCode()方法時,也要盡量使不同對象盡量返回不同的Hash碼值。

如果數組中的元素和要加入的對象的hashCode()返回了相同的Hash值(相同對象),才會用equals()方法來判斷兩個對象的內容是否相同。

SortedSet介面是Set的子介面。
TreeSet是SortedSet介面的實現類,他可以對集合中的元素進行排序。
要存放在TreeSet中自定義類的對象,這個類要麼是已經實現了Comparable介面,要麼是能給出Comparator比較器,TreeSet可以自動過濾掉重復元素所以不用重載hashCode()方法,TreeSet會根據比較規則判斷元素內容是否相同,TreeSet會在元素存入世就進行了排序。(在TreeSet給出排序規則時,一定要注意對象內容相等的條件,一定要注意在主觀的認為兩個對象內容相同時,才可以使用比較少的條件來進行判斷)

在要排序時才使用TreeSet類(存儲效率比較低),HashSet的存儲效率比較高,在需要為HashSet的對象排序時,就可以把HashSet中的元素放入TreeSet。

Map介面的實現類

Map中只可以存放鍵值對(Key,value),其中Key是不可以重復的。Key和value是一一對應的。

HashMap,是Map介面的實現類,Key時無序存放的,其中Key是不可以重復的,它也是通過Hash碼值來保證Key不重復的,Key和value是一一對應的。如果要加入的鍵值對和HashMap中鍵值對的Key是相同的就會將這個集合中的Key所隊應的value值進行覆蓋,在使用自定義類型作為Key時,那就是要覆蓋hashCode(),equals()方法,也就是和HashSet中要放入自定義類型是的處理方法相同。這個類的對象是線程不安全的。

在遍歷Map時,要使用其keySet()方法獲得Key的一個Set集合,可以通過遍歷這個Set,用get()方法來獲得Key所對應的value,也就遍歷了Map。

Hashtabl,也是Map介面的實現類,他和HashMap比較相似,只不過這個類對象是重量級的,也是線程安全的。他不允許Key和value為null。

Properties,這個類是Hashtable的子類,他的Key和value只能是字元串。

SortedMap是Map的子介面

TreeMap,是SortedMap的實現類,他會按照Key進行排序。和TreeSet類一樣,在使用自定義類作Key時,要用自定義類實現Comparable介面。

注意:其實HashSet底層就是一個HashMap,只不過其中的value值都是null值,而HashMap的底層是用數組實現的。

⑻ List,Map,Set三個介面存取元素時,各有什麼特點

  1. List特點:元素有放入順序,元素可重復 Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的) 。

  2. Map特點:元素按鍵值對存儲,無放入順序 (應該知道什麼是鍵值對吧!)List介面有三個實現類:LinkedList,ArrayList,Vector LinkedList:底層基於鏈表實現,鏈表內存是散亂的,每一個元素存儲本身內存地址的同時還存儲下一個元素的地址。

    鏈表增刪快,查找慢 ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低 Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet SortedSet介面有一個實現類:TreeSet(底層由平衡二叉樹實現) Query介面有一個實現類:LinkList Map介面有三個實現類:HashMap,HashTable,LinkeHashMap HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null SortedMap有一個實現類:TreeMap 其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,存儲的是鍵值對 set 一般無序不重復.map kv 結構 list 有序。

3.首先list,set的上層介面是Collection介面。list底層存儲數據是通過數組儲存。 他有實現類ArrayList和LinkedList比較常用。Vector這個類現在基本沒用。Vector和ArrayList是數組,插入數據較慢,查詢較快。區別在Vector是線程安全的,所以處理速度不如ArrayList。linkedList是鏈表結構儲存,插入數據較快,查詢較慢。

4.Set集合最大特點不存重復元素,Set集合有自己的排序方式,所以取出時順序和存儲時不一樣。常用實現類HashSetHashSet儲存會判斷值的Hash值,相同的話則不儲存。Map介面是一個鍵值對集合,鍵不可以重復,值無所謂。Map集合也是有自己的排序方式常用實現類HashMap.實際Map集合存的就是映射。

⑼ 關於資料庫存儲鍵值對的問題

這是前端(應用端)和後端(服務端)的問題,這個應該是每個用戶的單獨配置,那麼應該放在前端而是不是放在後端,如果放在後端,那麼每個用戶都要讀取,那麼體驗一定不好。
對於前端來說,只要加一個「配置文件」(其實就是一段代碼)就可以,然後通過服務端的程序讀取這個「配置文件」,就知道相應的順序了,這樣總比,連通伺服器讀取相應的表,來的要快。
如果非要用資料庫解決,那我們做一個假設,有100項,某人將所有的項目變成了從後往前倒著寫的,也就是第100項與第1項位置互換,第99項與第2項位置互換,這樣,那麼最後是第50項與第51項調換,也就是100項完全變換了位置,那麼不管你怎麼存儲,怎麼讀取,這些項都必須全部保存起來,因為每一項的順序都變了,所以這個方案並不是十分好。
當然,如果非要這么做的話,那麼有一個稍微簡單一點的辦法,不過也需要前端的配合而且,很可能出現徵用的情況,使用效果也不一定能太好。
我的辦法是建立userid 10001 10002 10003 這樣一張表,說白了就是一張以默認順序MoleID(個人覺得這個可能是你的表頭代碼,如果不是不要介意)為欄位名的表,然後每條用戶id,對應一組編號比如(默認編號為1,2,3,4):
userid 10001 10002 10003 10004
1 4 3 1 2
2 2 1 4 3
3 1 2 3 4
類似於這樣就能直接得到用戶的編號順序了,不過這種還是不如在前端一個配置文件來的舒服(用戶修改配置文件後,服務端也會備份(類似於上表這種也可以作為一個客戶端配置的備份),但是這種備份比直接修改資料庫要要省事不少,至少節省了資料庫的資源),而且可能出現徵用的問題,比如兩個人或更多的人同時修改代碼,那麼一張表不可能讓這么多人同時update,肯定要出現徵用,那麼服務體驗就不會太好(備份的話,不用那麼及時,所以徵用的可能性不大,即使出現也是發生在後端,用戶的體驗並沒有什麼影響)。
以上均為個人理解,共同探討。

⑽ java中map可以存放哪些信息

java map是以鍵值對的方式保存數據的,map中的鍵key和值value可以是各種對象,如String、Double、Integer、或者自己定義的類對象,不能是普通基本類型如int、double等