setjava,setjava中用法

本文目錄一覽:

怎樣從java集合類set中取出數據?

創建set的iterator方法:

SetObject set = new HashSetObject();

IteratorObject it = set.iterator();

while(it.hasNext())//判斷是否有下一個

it.next()取出元素。

以上方法便是從Set集合中取出數據。

擴展資料:

Java中使用Set接口描述一個集合(集合不允許有「重複值」,注意重複的概念),集合Set是Collection的子接口,Set不允許其數據元素重複出現,也就是說在Set中每一個數據元素都是唯一的。Set接口定義的常用方法如下:

1、size()    獲取Set尺寸(即Set包含數據元素的總數)。

2、 add(Object obj)    向Set中添加數據元素obj。

3、remove(Object obj)    從Set中移除數據元素obj。

4 、contains(Object obj)    判斷當前Set中是否包含數據元素obj,如果包含返回true,否則返回false。

5、 iterator()    將Set裝入迭代器。

參考資料:java集合類_百度百科

java中 List 與Set 有什麼區別?

Java的集合類都位於java.util包中,Java集合中存放的是對象的引用,而非對象本身。

Java集合主要分為三種類型:

a.Set(集):集合中的對象不按特定方式排序,並且沒有重複對象。它的有些實現類能對集合中的對象按特定方式排序。

b.List(列表):集合中的對象按索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象。

c.Map(映射):集合中的每一個元素包含一對鍵對象和值對象,集合中沒有重複的鍵對象,值對象可以重複。它的有些實現類能對集合中的鍵對象進行排序。

Set、List和Map統稱為Java集合。

1.Set(集)

Set集合中的對象不按特定方式排序,並且沒有重複對象。Set接口主要有兩個實現類HashSet和TreeSet。HashSet類按照哈希算法來存取集合中的對象,存取速度比較快。HashSet類還有一個子類LinkedHashSet類,它不僅實現了哈希算法,而且實現了鏈表數據結構。TreeSet類實現了SortedSet接口,具有排序功能。

Set的add()方法判斷對象是否已經存在於集合中的判斷流程:

boolean isExists = false;

Iterator it = set.iterator();

while(it.hasNext()){

Object object = it.next();

if(newObject.equals(oldObject)){

isExists = true;

break;

}

}

2.HashSet類

當HashSet向集合中加入一個對象時,會調用對象的hashCode()方法獲得哈希碼,然後根據這個哈希碼進一步計算出對象在集合中的存放位置。

當Object1變量和object2變量實際上引用了同一個對象,那麼object1和object2的哈希碼肯定相同。

為了保證HashSet能正常工作,要求當兩個對象用equals()方法比較的結果為相等時,它們的哈希碼也相等。即:

customer1.hashCode() == customer2.hashCode();

如:對應於Customer類的以下重寫後的equals()方法:

public boolean equals(Object o){

if(this==o) return true;

if(!o instanceof Customer) return false;

final Customer other = (Customer)o;

if(this.name.equals(other.getName())this.age==other.getAge())

return true;

else

return false;

}

為了保證HashSet正常工作,如果Customer類覆蓋了equals()方法,也應該覆蓋hashCode()方法,並且保證兩個相等的Customer對象的哈希碼也一樣。

public int hashCode(){

int result;

result = (name==null?0:name.hashCode());

result = 29*result+(age==null?0:age.hashCode());

return result;

}

3.TreeSet類

TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序。TreeSet支持兩種排序方式:自然排序和客戶化排序,在默認情況下TreeSet採用自然排序方式。

a.自然排序

在JDK中,有一部分類實現了Comparable接口,如Integer、Double和String等。Comparable接口有一個compareTo(Object o)方法,它返回整數類型。對於表達式x.compareTo(y),如果返回值為0,表示x和y相等,如果返回值大於0,表示x大於y,如果返回值小於0,表示x小於y。

TreeSet調用對象的compareTo()方法比較集合中對象的大小,然後進行升序排列,這種排序方式稱為自然排序。

以下列出了JDK中實現了Comparable接口的一些類的排序方式

類 排序

BigDecimal\BigInteger\Byte\Double\Float\Integer\Long\Short 按數字大小排序

Character 按字符的Unicode值的數字大小排序

String 按字符串中字符的Unicode值排序

使用自然排序時,只能向TreeSet集合中加入同類型的對象,並且這些對象的類必須實現了Comparable接口,否則會在第二次調用TreeSet的add()方法時,會拋出ClassCastException異常。

例如:

以下是Customer類的compareTo()方法的一種實現方式:

public int compareTo(Object o){

Customer other = (Customer)o;

//先按照name屬性排序

if(this.name.compareTo(other.getName())0) return 1;

if(this.name.compareTo(other.getName())0) return -1;

//再按照age屬性排序

if(this.ageother.getAge()) return 1;

if(this.ageother.getAge()) return -1;

return 0;

}

為了保證TreeSet能正確地排序,要求Customer類的compareTo()方法與equals()方法按相同的規則比較兩個Customer對象是否相等。

因此在Customer類的equals()方法中應該採用相同的比較規則:

public boolean equals(Object o){

if(this==o) return true;

if(!(o instanceof Customer)) return false;

final Customer other = (Customer)o;

if(this.name.equals(other.getName())this.age==other.getAge()){

return true;

}else{

return false;

}

}

值得注意的是,對於TreeSet中已經存在的Customer對象,如果修改了它們的屬性,TreeSet不會對集合進行重新排序。在實際域模型中,實體類的屬性可以被更新,因此不適合通過TreeSet來排序。最適合於排序的是不可變類。

b.客戶化排序

除了自然排序,TreeSet還支持客戶化排序。java.util.Comparator接口用於指定具體的排序方式,它有個compare(Object object1,Object object2)方法,用於比較兩個對象的大小。當表達式compare(x,y)的值大於0,表示x大於y;當compare(x,y)的值小於0,表示x小於y;當compare(x,y)的值等於0,表示x等於y。

例如:如果希望TreeSet僅按照Customer對象的name屬性進行降序排列,可以創建一個實現Comparator接口的類CustomerComparator:

public class CustomerComparator implements Comparator{

public int compare(Object o1,Object o2){

Customer c1= (Customer)o1;

Customer c2 = (Customer)o2;

if(c1.getName().compareTo(c2.getName())0) return -1;

if(c2.getName().compareTo(c2.getName())0) return 1;

return 0;

}

}

接下來在構造TreeSet的實例時,調用它的TreeSet(Comparator comparator)構造方法:

Set set = new TreeSet(new CustomerComparator());

4.向Set中加入持久化類的對象

例如兩個Session實例從數據庫加載相同的Order對象,然後往HashSet集合里存放,在默認情況下,Order類的equals()方法比較兩個Orer對象的內存地址是否相同,因此order1.equals(order2)==false,所以order1和order2遊離對象都加入到HashSet集合中,但實際上order1和order2對應的是ORDERS表中的同一條記錄。對於這一問題,有兩種解決方案:

(1)在應用程序中,謹慎地把來自於不同Session緩存的遊離對象加入到Set集合中,如:

Set orders = new HashSet();

orders.add(order1);

if(!order2.getOrderNumber().equals(order1.getOrderNumber()))

order.add(order2);

(2)在Order類中重新實現equals()和hashCode()方法,按照業務主鍵比較兩個Order對象是否相等。

提示:為了保證HashSet正常工作,要求當一個對象加入到HashSet集合中後,它的哈希碼不會發生變化。

5.List(列表)

List的主要特徵是其對象以線性方式存儲,集合中允許存放重複對象。List接口主要的實現類有LinkedList和ArrayList。LinkedList採用鏈表數據結構,而ArrayList代表大小可變的數組。List接口還有一個實現類Vector,它的功能和ArrayList比較相似,兩者的區別在於Vector類的實現採用了同步機制,而ArrayList沒有使用同步機制。

List只能對集合中的對象按索引位置排序,如果希望對List中的對象按其他特定方式排序,可以藉助Comparator和Collections類。Collections類是集合API中的輔助類,它提供了操縱集合的各種靜態方法,其中sort()方法用於對List中的對象進行排序:

a.sort(List list):對List中的對象進行自然排序。

b.sort(List list,Comparator comparator):對List中的對象進行客戶化排序,comparator參數指定排序方式。

如Collections.sort(list);

6.Map(映射)

Map(映射)是一種把鍵對象和值對象進行映射的集合,它的每一個元素都包含一對鍵對象和值對象,而值對象仍可以是Map類型,依次類推,這樣就形成了多級映射。

Map有兩種比較常用的實現:HashMap和TreeMap。HashMap按照哈希算法來存取鍵對象,有很好的存取性能,為了保證HashMap能正常工作,和HashSet一樣,要求當兩個鍵對象通過equals()方法比較為true時,這兩個對象的hashCode()方法返回的哈希碼也一樣。

TreeMap實現了SortedMap接口,能對鍵對象進行排序。和TreeSet一樣,TreeMap也支持自然排序和客戶化排序兩種方式。

例:創建一個緩存類EntityCache,它能粗略地模仿Session的緩存功能,保證緩存中不會出現兩個OID相同的Customer對象或兩個OID相同的Order對象,這種惟一性是由鍵對象的惟一性來保證的。

Key.java:

package mypack;

public class Key{

private Class classType;

private Long id;

public Key(Class classType,Long id){

this.classType = classType;

this.id = id;

}

public Class getClassType(){

return this.classType;

}

public Long getId(){

return this.id;

}

public boolean equals(Object o){

if(this==o) return true;

if(!(o instanceof Key)) return false;

final Key other = (Key)o;

if(classType.equals(other.getClassType())id.equals(other.getId()))

return true;

return false;

}

public int hashCode(){

int result;

result = classType.hashCode();

result = 29 * result + id.hashCode();

return result;

}

}

EntityCache.java:

package mypack;

import java.util.*;

public class EntityCache {

private Map entitiesByKey;

public EntityCache() {

entitiesByKey=new HashMap();

}

public void put(BusinessObject entity){

Key key=new Key(entity.getClass(),entity.getId());

entitiesByKey.put(key,entity);

}

public Object get(Class classType,Long id){

Key key=new Key(classType,id);

return entitiesByKey.get(key);

}

public Collection getAllEntities(){

return entitiesByKey.values();

}

public boolean contains(Class classType,Long id){

Key key=new Key(classType,id);

return entitiesByKey.containsKey(key);

}

}

java set 順序

在java語言中,提供多種不同的結構來組織對象,Set(集合)是其中的一種,本身是一個接口,其迭代時的順序取決於其具體實現。典型的實現包括:

HashSet:哈希表是通過使用稱為散列法的機制來存儲信息的,元素並沒有以某種特定順序來存放;

LinkedHashSet:以元素插入的順序來維護集合的鏈接表,允許以插入的順序在集合中迭代;

TreeSet:提供一個使用樹結構存儲Set接口的實現,對象以升序順序存儲,訪問和遍歷的時間很快。

擴展資料

SetString set = new TreeSetString();    

set.add(“f”);

set.add(“a”);

set.add(“b”);

set.add(“c”);

set.add(“d”);

set.add(“e”);        

System.out.println(set);

參考資料:百度百科 set (計算機學)

java集合set有哪些方法

set是一個接口,一般實現類用HashSet

方法摘要

boolean add(E e)

如果 set 中尚未存在指定的元素,則添加此元素(可選操作)。

boolean addAll(Collection? extends E c)

如果 set 中沒有指定 collection 中的所有元素,則將其添加到此 set 中(可選操作)。

void clear()

移除此 set 中的所有元素(可選操作)。

boolean contains(Object o)

如果 set 包含指定的元素,則返回 true。

boolean containsAll(Collection? c)

如果此 set 包含指定 collection 的所有元素,則返回 true。

boolean equals(Object o)

比較指定對象與此 set 的相等性。

int hashCode()

返回 set 的哈希碼值。

boolean isEmpty()

如果 set 不包含元素,則返回 true。

IteratorE iterator()

返回在此 set 中的元素上進行迭代的迭代器。

boolean remove(Object o)

如果 set 中存在指定的元素,則將其移除(可選操作)。

boolean removeAll(Collection? c)

移除 set 中那些包含在指定 collection 中的元素(可選操作)。

boolean retainAll(Collection? c)

僅保留 set 中那些包含在指定 collection 中的元素(可選操作)。

int size()

返回 set 中的元素數(其容量)。

Object[] toArray()

返回一個包含 set 中所有元素的數組。

T

T[] toArray(T[] a)

返回一個包含此 set

中所有元素的數組;返回數組的運行時類型是指定數組的類型。

java中set的用法

class Test {

private String name ;

void setName(String name){ this.name = name ;}

String getName() { return name ;}

public static void main(String [] args)

{

Test test = new Test();

test.setName(“Tom”);

System.out.println (“get the name is :” + test.getName());

}

}

java 怎麼給set賦值

通過remove和add方法,set集合中的對象屬性為private final

Set接口

集合里的多個對象沒有明顯順序。Set集合和Collection基本一樣,沒有

提供額外方法,只是和Collection行為不同

Set集合不允許包含相同的元素,如果add的是兩個相同元素會返回false

Set不實用==運算符,根據equals方法

HashSet類

HashSet類是Set接口的典型實現,大多數時候使用Set集合都是用這個類實現

HashSet按Hash算法來存儲集合中的元素

HashSet特點:

1.不能保證元素的排列順序,順序可能變化

2.HashSet不是同步的,多個線程同時訪問一個Set集合,必須用代碼

保證同步

3.集合元素值可以是null

當向HashSet集合中存入一個元素,HashSet會調用該對象的HashCode()

得到對象的hashCode,根據HashCode來決定對象在HashSet中的位置

如果兩個元素equal方法比較返回true但是hashCode()方法返回值不同,

HashSet會把兩個元素存儲在不同位置

HashSet判斷兩個元素相同需要equal和hashCode都相同

因此重寫類的equals方法和hashCode()方法要保證兩個對象通過equals

返回true時hashCode也相等

Hash算法保證通過一個對象快速找到另一個對象。可以很快的執行,當需要

查找集合中的某個元素時,hash算法可以直接根據該元素的值找到該元素

從而讓程序快速找到元素。

在數組中通過數組元素索引尋找元素,HashSet通過hashcode索引

重寫hashCode()方法的基本步驟

當兩個對象通過equals方法返回true時,兩個對象的hashCode相等

對象中用作equals比較標準的屬性,應該用來計算hashCode

向HashSet中添加可變對象時,如果修改HashSet集合中對象,有可能導致

該對象與集合中其他對象相等,從而導致HashSet無法正確訪問對象

HashSet有一個子類 LinkedHashSet,LinkedHashSet集合也是根據HashCode來決定

元素的存儲位置,同時使用鏈表維護元素次序,這樣是的元素看起來是以

插入順序保存,便利集合時會按插入順序來訪問。

Linked需要維護元素的插入順序,性能略低於HashSet,但在迭代時性能更好

TreeSet是SortedSet接口的唯一實現

TreeSet可以確保元素處於排序狀態。提供了幾個額外方法:

1.Comparator

comparator():返回當前Set使用的Comparator,或者null,表示

自然的方式排序

2.Object first():返回集合中的第一個元素

3.Object last():返回集合中最後一個元素

4.Object lower(Object

e):返回集合中位於指定元素之前的元素

5.Object higher(Object

e):返回集合中位於制定元素之後的元素

6.SortedSet

subSet(fromElement,toElement):返回set的子集,範圍從from到to

7.SortedSet headSet(toElement)返回set子集,小於toElement

8.SortedSet

tailSet(fromElement)返回set子集,由大於等於fromElement元素組成

TreeSet是根據元素值來進行排序而不是根據插入順序

TreeSet採用紅黑樹的數據結構對元素排序 :支持自然排序(默認)和定製排序

自然排序:

TreeSet會調用集合元素的compareTo方法來比較元素之間的大小關係,

然後將集合元素按升序排列。

Java提供了一個Comparable接口,該接口定義了一個compareTo(Object obj)方法

該方法返回一個整數值,實現該接口的類必須實現該方法,實現了該接口的類的對象

可以比較大小。obj1.compareTo(obj2),如果方法返回0,表明兩個對象相等。如果

返回正整數,表明obj1大於obj2;如果返回負整數,表明obj1小於obj2

如果要將對象添加如TreeSet該對象必須實現Comparable接口

當想TreeSet中添加對象時,會先將要添加的對象與TreeSet中的對象用compareTo比較

如果找不到compareTo則引發ClassCastException異常

因為只有同一個類型才能比較大小 所以TreeSet中添加的應該是同一個類型的對象

TreeSet和HashSet集合中的對象如果是可變對象,對象屬性改變時,會導致集合處理

對象複雜化,易出錯。所以應該盡量在集合中添加不可變對象

不可變對象是

1.屬性為private final

2.含有帶參數構造器,為對象初始化

3.屬性有get方法沒有set方法

定製排序:

TreeSet的自然排序是根據集合元素大小,TreeSet將它們以升序排列。使用定製

排序,如降序,使用Comparator接口的幫助。接口中包含一個int compare(T o1,T o2)

用於比較o1和o2的大小:重寫該方法可以改變排序規則

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/189354.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 08:02
下一篇 2024-11-29 08:02

相關推薦

  • setjava,setjava中用法

    本文目錄一覽: 1、怎樣從java集合類set中取出數據? 2、java中 List 與Set 有什麼區別? 3、java set 順序 4、java集合set有哪些方法 5、ja…

    編程 2024-11-29

發表回復

登錄後才能評論