JAVA集合框架(二)-List和Set

list集合是有序的,順序即添加的順序,元素是可重復的。

ArrayList

底層基于數組實現。在add元素的過程中,如果超過了數組容量,會自動擴容。

主要特點:隨機訪問快(數組的特性),但是在中間插入和移除元素時較慢(涉及數組拷貝動作)。

LinkedList

底層基于鏈表數據結構設計。 主要特點:在中間插入和刪除操作快。但是隨機訪問較慢(需要遍歷node指針)。 LinkedList的一些專有方法:

  • void addFirst(E e) 將指定元素添加到此集合的開頭
  • void addLast(E e) 將指定元素添加到此集合的末尾
  • E getFirst() 返回此集合的第一個元素
  • E getLast() 返回此集合的最后一個元素
  • E removeFirst() 刪除此集合中的第一個元素
  • E removeLast() 刪除此集合中的最后一個元素

Vector的實現類似ArrayList。只是Vector是線程安全的。它的大部分方法都加了同步synchronized

Set的常用實現類

set集合不保存重復的元素。

HashSet

HashSet按照Hash算法存儲集合中的元素,具有很好的存取和查找性能。 通過元素的hash()和equals()方法來判斷元素是否重復。因此,HashSet中元素的存儲順序是和元素的添加順序不一樣的。

LinkedHashSet

LinkedHashSet是HashSet的子類。使用鏈表來維護元素的添加次序,因此存儲順序就是元素的添加順序。

TreeSet

底層元素存儲基于紅黑樹數據結構實現。TreeSet保證了存入集合中的元素處于有序狀態。這種有序可以是自然排序和定制排序。 自然排序:

TreeSet會調用集合元素的compareTo(Object obj)方法來比較元素之間的大小關系,然后讓集合按照升序排列。 加入集合中的元素需要實現Comparable接口,重寫compareTo()。

public class Person implements Comparable<Person>{

	private String name;
	private int age;
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	// 按年齡排序
	public int compareTo(Person person) {
		int ret = (this.age - person.age);
		return ret;
	}
}

測試類:  
public class setMain {
	public static void main(String[] args) {
		Set<Person> personSet = new TreeSet<Person>();
		personSet.add(new Person("張三",10));
		personSet.add(new Person("王五",23));
		personSet.add(new Person("李四",15));
		System.out.println(personSet);
	}
	
}

復制代碼

輸出:

[Person [name=張三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]

定制排序:

如果要定制排序,需要在TreeSet構造器中傳入Comparator比較器。

public class NameComparator implements Comparator<Person>{

	public int compare(Person person1, Person person2) {
		return person1.compareTo(person2);
	}
}

測試類:   
public class setMain {
	public static void main(String[] args) {
		Set<Person> set = new TreeSet<Person>(new NameComparator());
		set.add(new Person("張三",10));
		set.add(new Person("王五",23));
		set.add(new Person("李四",15));
		System.out.println(set);
	}
}
復制代碼

輸出:

[Person [name=張三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]

關注螞蟻編程 ↓

JAVA集合框架(二)-List和Set

原文 

https://juejin.im/post/5d0dcda4f265da1b833396c4

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。

PS:推薦一個微信公眾號: askHarries 或者qq群:474807195,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

轉載請注明原文出處:Harries Blog? » JAVA集合框架(二)-List和Set

贊 (0)
分享到:更多 ()

評論 0

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
手机彩票计划软件超稳