Java集合之Set
来源:互联网 发布:封神演义 知乎 编辑:程序博客网 时间:2024/04/29 22:26
一 综述
Set集合类似 于数学中的集合,不允许有重复元素。它判断对象是否相等是根据equals方法。Set继承了Collection的方法,没有另外添加方法。经常使用的是HashSet、TreeSet。
1.HashSet :按照hash算法存储元素,因此查找和存取元素性能较高。
(1)HashSet不是线程同步的;
(2)元素顺序是变化的;
(3)元素的值可以是null,但是只能有一个;
(4)判断元素相等不能不仅仅是equals相等,还有hashcode相等。hashcode决定元素的存储位置。
HashSet有个子类LinkedHashSet,使用链表维护集合的次序。因此插入元素的性能低于HashSet,但是迭代元素的性能较高。LinkedHashSet元素的顺序总是于元素的添加顺序一致。如下面代码所示:
HashSet<String> hlSet = new LinkedHashSet<String>(); hlSet.add("a"); hlSet.add("b"); hlSet.add("c"); hlSet.add("d"); //输出:LinkedHashSet---->[a, b, c, d] System.out.println("LinkedHashSet---->"+hlSet); HashSet<String> hSet = new HashSet<String>(); hSet.add("a"); hSet.add("b"); hSet.add("c"); hSet.add("d"); //输出:HashSet---->[d, b, c, a] System.out.println("HashSet---->"+hSet);2.TreeSet中元素处于排序状态,它提供了几个额外的方法:
boolean
add(E e)
boolean
addAll(Collection<? extendsE> c)
E
ceiling(E e)
null
if there is no such element.void
clear()
Object
clone()
TreeSet
instance.Comparator<? superE>
comparator()
boolean
contains(Object o)
true
if this set contains the specified element.Iterator<E>
descendingIterator()
NavigableSet<E>
descendingSet()
E
first()
E
floor(E e)
null
if there is no such element.SortedSet<E>
headSet(E toElement)
NavigableSet<E>
headSet(E toElement, boolean inclusive)
inclusive
is true)toElement
.E
higher(E e)
null
if there is no such element.boolean
isEmpty()
true
if this set contains no elements.Iterator<E>
iterator()
E
last()
E
lower(E e)
null
if there is no such element.E
pollFirst()
null
if this set is empty.E
pollLast()
null
if this set is empty.boolean
remove(Object o)
int
size()
NavigableSet<E>
subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive)
fromElement
totoElement
.SortedSet<E>
subSet(E fromElement,E toElement)
SortedSet<E>
tailSet(E fromElement)
NavigableSet<E>
tailSet(E fromElement, boolean inclusive)
inclusive
is true)fromElement
TreeSet<Integer> tSet = new TreeSet<Integer>(); tSet.add(1); tSet.add(2); tSet.add(3); tSet.add(4); tSet.add(5); tSet.add(6); System.out.println("first----->"+tSet.first()); //first----->1 System.out.println("last----->"+tSet.last()); //last----->6 System.out.println("lower----->"+tSet.lower(5)); //lower----->4 System.out.println("higher----->"+tSet.higher(2)); //higher----->3 System.out.println("subSet----->"+tSet.subSet(2, 5)); //subSet----->[2, 3, 4] System.out.println("headSet----->"+tSet.headSet(3)); //headSet----->[1, 2] System.out.println("tailSet----->"+tSet.tailSet(3)); //tailSet----->[3, 4, 5, 6] //输出:----->6----->5----->4----->3----->2----->1 Iterator<Integer> itDes= tSet.descendingIterator(); while(itDes.hasNext()) { System.out.print("----->"+itDes.next()); } System.out.println();TreeSet支持两种排序
(1)自然排序:调用compareTo方法来比较元素之间的大小。Java的常用类大都实现了Comparable接口,提供了比较大小的方法:
1》BigDecimal、BigInteger及所有数值型类:按照对应的数值大小比较;
2》Character:按照Unicode码值进行比较;
3》Boolean:True大于False;
4》String:按照字符串中的Unicode值比较;
5》Date、Time:后面的日期时间比前面的大。
向TreeSet中插入元素时,只有第一个不需要实现Comparable接口,后面的都需要实现,否则会报ClassCastException。
(2)定制排序:定制排序需要实现Comparable接口,例如逆序。
public class TreeSetTest3 { public static void main(String[] args) { Set<String> set = new TreeSet<String>(new MyComparator()); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); set.add("A"); for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next()+" "); //输出:<span style="font-size:18px;color:#3366ff;"><strong>e d c b a A </strong></span> } } } class MyComparator implements Comparator<String>{ @Override public int compare(String o1, String o2) { return o2.compareTo(o1);//降序排列 } }
自定义类型的排序:
public class TreeSetTest2 { public static void main(String[] args) { Set<Person> set = new TreeSet<Person>(new PersonComparator()); Person p1 = new Person(10); Person p2 = new Person(20); Person p3 = new Person(30); Person p4 = new Person(40); set.add(p1); set.add(p2); set.add(p3); set.add(p4); for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next().score+" "); //输出:10,20,30,40 } } } class Person{ int score; public Person(int score){ this.score = score; } public String toString(){ return String.valueOf(this.score); } } class PersonComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { return o1.score - o2.score; } }
2、HashSet的性能总是要好于TreeSet,因为TreeSet要维护红黑树。HashSet、TreeSet不是线程同步的。
- JAVA集合之SET
- java集合之Set
- Java集合之set
- Java集合之Set
- Java集合之Set
- Java集合之set
- Java集合之Set
- java集合之Set
- java集合之Set
- java 集合之Set
- Java集合之Set
- Java集合之Set
- Java之集合Set
- Java集合之Set
- Java集合之Set集合
- Java集合之Set集合
- (转) Java集合之Set
- Java集合之Set探讨
- Linux_文件系统&磁盘分区
- 制作图标小记
- Enterprise Architect之UML实践
- Construct Binary Tree from Preorder and Inorder Traversal
- 读《50 Android Hacks》笔记整理Hack 9~Hack 17
- Java集合之Set
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
- GraphLab 安装在Hadoop集群
- 百度地图的使用(1)
- Linux下配置安装PHP环境
- 文件读写的一些函数--fseek()---fread()----ftell()
- 黑马程序员——javaSE_IO流
- 68eshop 版权去除
- POJ2516-Minimum Cost 最小费用最大流