java hasset 顺序_java集合排序问题
List: 元素是有序的,元素可以重復(fù),因?yàn)樵摷象w系有索引(腳標(biāo))
常用的子類(lèi)對(duì)象:
1————ArrayList 底層的數(shù)據(jù)結(jié)構(gòu)是使用的數(shù)組結(jié)構(gòu)特點(diǎn):查詢速度快,但是增刪比較慢
2————LinkedList底層的數(shù)據(jù)結(jié)構(gòu)使用的是鏈表結(jié)構(gòu)特點(diǎn):增刪速度快,但是查詢比較慢
Vector 底層是數(shù)組數(shù)據(jù)結(jié)構(gòu)。
線程同步,ArrayList線程不同步,替代了vector ArrayList 是可變長(zhǎng)度數(shù)組,默認(rèn)長(zhǎng)度是10,當(dāng)添加的元素大于10時(shí),系統(tǒng)自動(dòng)new一個(gè)新的數(shù)組且增長(zhǎng)原數(shù)組的一半長(zhǎng)度,并把之前的元素復(fù)制到這個(gè)新數(shù)組中,vector和它一樣,但是延長(zhǎng)一倍。
Set:無(wú)序,不可重復(fù)元素 HashSet:數(shù)據(jù)結(jié)構(gòu)是哈希表,線程是非同步的。保證元素唯一性的原理,判斷元素的hashCode值是否相同如果相同,還會(huì)繼續(xù)判斷元素的equals方法,是否為true。
TreeSet:
可以對(duì)Set集合中的元素進(jìn)行排序。底層數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù)。 保證元素唯一行的依據(jù),compareTo方法return 0;
TreeSet 排序的第一種方式
讓元素(對(duì)象)自身具備比較性。元素需要實(shí)現(xiàn)Comparable接口,覆蓋 compareTo方法這種方式也稱(chēng)為元素的自然順序,或者叫做默認(rèn)順序
TreeSet第二種排序方式:
當(dāng)元素自身不具備比較性時(shí),或者具備的比較性不是所需要的,這時(shí)需要讓集合(TreeSet)自身具備比較性。做法是在集合初始化時(shí),就有了比較方式,即定義一個(gè)比較器將比較器作為參數(shù)傳遞給TreeSet集合的構(gòu)造函數(shù)。比較器--定義一個(gè)類(lèi),實(shí)現(xiàn)Comparator接口,覆蓋compare方法。而當(dāng)兩種排序都存在時(shí)以比較器為主。
關(guān)于ArrayList添加對(duì)象,自定義判斷條件問(wèn)題以及HashSet集合添加自定義對(duì)象問(wèn)題雖然兩個(gè)集合的底層結(jié)構(gòu)不同,但是他們都調(diào)用添加對(duì)象類(lèi)中的equals方法,而 ArrayList是通過(guò)contains()方法讓系統(tǒng)自動(dòng)調(diào)用equals方法;HashSet是通過(guò)當(dāng)add添加元素的時(shí)候系統(tǒng)自動(dòng)調(diào)用hashCode()方法判斷hash值如果相等則不會(huì)被添加,如果相等,再通過(guò)hashCode方法調(diào)用equals方法判斷。一般添加的時(shí)候都會(huì)在類(lèi)中重寫(xiě)hashCode 和equals以滿足實(shí)際條件的需求。但是,ArrayList和HashSet重寫(xiě)Object類(lèi)中的equals方法原理都是一樣的。
例如:
class Person {
private String name;
private int age;
Person(String name,int age) { this.name=name; this.age=age; }
public String getName() { return name; }
public int getAge() { return age; } }
此equals是重寫(xiě)Object中的equals方法 obj形參實(shí)參是contains中的,相當(dāng)于obj=new Person("xiaoxiao11",15);
多態(tài) public boolean equals(Object obj) { 判斷傳進(jìn)來(lái)的對(duì)象是否是Person對(duì)象不是的話就返回false if (!(obj instanceof Person)) { return false; } 因?yàn)閭鲄鬟M(jìn)來(lái)的對(duì)象是Object的子類(lèi)對(duì)象,體現(xiàn)多態(tài)性,必須向下轉(zhuǎn)型 Person p=(Person)obj; return this.name.equals(p.name)&&this.age==p.age; 而return中的equlas是字符串中的equals方法~~! 比較字符串對(duì)象的內(nèi)容是否相同 } }
關(guān)于TreeSet添加自定意對(duì)象,讓其排序的問(wèn)題。有兩種方式
第一種讓元素(對(duì)象)自身具備比較性。元素需要實(shí)現(xiàn)Comparable接口,覆蓋 compareTo方法這種方式也稱(chēng)為元素的自然順序,或者叫做默認(rèn)順序
class Student implements Comparable {
private String name;
private int age;
Student(String name,int age) { this.name=name; this.age=age; }
當(dāng)在TreSet中添加對(duì)象的時(shí)候底層自動(dòng)調(diào)用Comparable接口中的compareTo方法
class Student implements Comparable {
private String name;
private int age;
Student(String name,int age) { this.name=name; this.age=age; }
public int compareTo(Student s) { System.out.println(this.name+"...compareto...."+s.name);
int num= new Integer(this.age).compareTo(new Integer (s.age));
if(num==0) return this.name.compareTo(s.name);//比較名字是否相同時(shí)次要條件
return num; }
public String getName() { return name; }
public int getAge() { return age; } }
第二種:當(dāng)元素自身不具備比較性時(shí),或者具備的比較性不是所需要的,這時(shí)需要讓集合(TreeSet)自身具備比較性。做法是在集合初始化時(shí),就有了比較方式,即定義一個(gè)比較器將比較器作為參數(shù)傳遞給TreeSet集合的構(gòu)造函數(shù)。比較器--定義一個(gè)類(lèi),實(shí)現(xiàn)Comparator接口,覆蓋compare方法。而當(dāng)兩種排序都存在時(shí)以比較器為主使用了泛型--在集合初始化時(shí)把new Mycomparator()以構(gòu)造方法傳參傳進(jìn)去即可
class Mycomparator implements Comparator {
public int compare(String o1,String o2) { int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));
if (num==0) { return o1.compareTo(o2); }
return num; } }
Map集合的兩種取出方式
Set keySet:將Map中所有的鍵存入到Set集合,因?yàn)镾et集合具備迭代器所以可以迭代取出所有的鍵,在根據(jù)get(key)獲取值。 Map集合的取出原理:將Map集合轉(zhuǎn)成Set集合,再迭代取出。
Set> entrySet:將Map集合中的映射關(guān)系存入到Set集合中,而這個(gè)關(guān)系的數(shù)據(jù)類(lèi)型就是:Map.Entry Map.Entry 其實(shí)Entry也是一個(gè)就扣,它是Map接口中的一個(gè)內(nèi)部接口。
interface Map {
public static interface Entry {
//定義內(nèi)部接口是因?yàn)槿〕鯩ap中的成員屬性方便
public abstract Object getKey();
public abstract Object getValue(); } }
class HashMap implements Map {
//HashMap 取出元素的原理
class Haha implements Map.Entry {
public abstract Object getKey(){ }
public abstract Object getValue(){ } }
Map的子類(lèi)
Hashtable:底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可以存null鍵null值。線程同步
HashMap: 底層是哈希表數(shù)據(jù)結(jié)構(gòu),允許存null鍵null值,線程不同步
TreeMap: 底層是二叉樹(shù)數(shù)據(jù)結(jié)構(gòu),線程不同步,可以給Map中的鍵排序其實(shí)Set底層就是使用了Map集合
總結(jié)
以上是生活随笔為你收集整理的java hasset 顺序_java集合排序问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: kafka分区与分组原理_大数据技术-K
- 下一篇: 安卓投屏软件_有哪些好用又免费的手机投屏