1.散列集HashSet
1.remove()消除的是iterator前一个元素,如果是之前调用next(),就是删除左边的,如果是使用previous(),就是删除右边的元素。
2.set是没有重复元素的元素集合。
3.hashset是无序的,不关系集合顺序才用散列集。
4.hashset是根据hashcode来放置位置,散列表用链表数组来实现,每个列表被称为bucket。
5.自定义类要自己定义hashcode(),和equals(),并且这要兼容,既equals()返回值为true,
那么hashcode()是一致的。
2.树集TreeSet:
2.有序集合,效率是:hashset>Treeset>arraylist/linkedlist
排序方法:根据要插入的元素的实现comparable接口的方式,实现里面的int compareTo(T other) ,a.compareTo(b),如何=0,相等,>0,a在b后面,<0,a在b前面。如果被排序的类没有实现comparable(),就需要使用comparator接口,需要定义一个类来实现comparator接口,将这个类的对象传入到treeset中
注意:排序的对象是一定要实现comparable接口的,不然无法顺利排序。并且接口中需要比较的是和下一个本类对象,所以compareTo(T o)中只有一个形参,同时这个形参的类型都是本类。
2.1 comparator接口:publicinterface Comparator<T>{int compare(T a,T b)}
2.2实现comparator接口的类:classItemComparator implements comparator<Item>
{
public int compare(Item a, item b){….}
}
2.3 传入树集中 itemComparatorcomp=new itemComparator();
TreeSet<Item> tree1=newTreeSet<>(comp);
注意:因为这个comparator是单独的一个类,所以需要对两个所需的类进行比较,所以函数compare(T o1, T o2),同时这个两个T的类型一定是所需要在树集中存入的类。
3.队列、双端队列、优先级队列Queue,Deque,PriorityQueue
1.队列可以在尾部添加一个元素,在头部删除一个元素。
2.双端队列Deque可以头尾同时添加和删除元素。
3.队列和双端队列不可以在中间添加元素
4.优先级队列可以按照任意顺序插入,但是按照排序的顺序检索,使用堆heap数据结构存储,让最小的元素移动到根部。
5.优先级队列像treeset一样,可以保存实现了comparable接口的类对象,同时可以保存在构造器提供比较器的对象。
4.映射表
1.键是唯一的,对同一个键调用put,第二个值会取代第一个值
5.专用集与映射表类
1.弱散列映射表,链接散列集,链接映射表,枚举集,映射表,标志散列映射表
6.集合框架
1.框架:包含超类,超类拥有非常有用的功能、策略和机制。框架使用者可以通过子类拓展他。
1.1集合两个基本的接口:Collection和Map
分别是用add()和put()方法,Collection读取是使用迭代器,Map除了使用迭代器,还可以使用get()方法。
1.2 List是有序集合
将对象放在某个位置可以:采用整数索引或使用列表迭代器
随机访问的方法:
voidadd(int index,E element)
Eget(index)
voidremove(in index)
通过RandomAccess来判断集合是否支持高效随机访问
if(cinstanceof RandomAccess){}
2.视图和包装类:
2.1Collection是接口,Collections是包装类
2.2视图就是看起来似乎是使用一个方法创造了一个新集,实际上是通过这个方法返回一个实现了接口的类对象。
e.g:Card[]cardDeck = new Card[25];
List<Card>cardList = Arrays.asList(cardDeck); (数组转List视图对象)
返回的不是ArrayList对象,是返回一个视图对象,这个对象实现了List接口,该视图可以get和set,不可以改变数组大小
2.3子范围:为集合建立子范围视图:
List g2 =staff.subList(10,20);
SortedSet<E>subSet(E from ,E to);
SortedSet<E>headSet(E to);
SortedSet<E>tailSet(E from);
SortedMap<E>subMap(E from ,E to);
SortedMap<E>headMap(E to);
SortedMap<E>tailMap(E from);
2.4不可修改视图:不可修改视图并不是 集合本身不可修改,只是无法通过其投影出的视图修改原始集合。
Collections.unmodifiableCollection
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableSortedSet
Collections.unmodifiableMap
Collections.unmodifiableSortedMap
2.5同步视图
确保线程安全,如synchronizedMap方法,
e.g: Map<String,Employee> map = Collections.synchronizedMap(new HashMap<String,Employee>());//将任何映射表转化成具有同步访问的方法Map
3.批操作:可以避免频繁的使用迭代器,比如retainAll()
Set<String>result=new HashSet<>(a);
result.retainAll(b);//可以保存既在a中出现,也在b中出现的元素,构成交集。
4.集合与数组之间的转换:
4.1 asList()
eg: 数组转化为集合
String[] values=…;
HashSet<String>staff=new HashSet<>(Arrays.asList(values));
eg:集合转换为数组:
toArray();
7.遗留集合
1.Hashtable:
1.1首先注意的是t是小写,不是大写,因为windows文件系统大小写不敏感,但是java编译器是大小写敏感的。
1.2 Hashtable作用和HashMap是一致的,接口相同,但是Hashtablle是同步的。
2.Enumeration
2.1Enumeration接口对元素序列进行遍历。有两个方法:hasMoreElements,nextElements
3.Properitie
3.1Porperities是特殊的map
3.2键值都是字符串,表可以保存在一个文件中,也可以从文件加载。
4.Stack
4.1有pop()出栈,push()压栈,peek()返回栈顶元素,但是不弹出。
5.BitSet
5.1存放一个位序列。
8.算法
1集合的排序和混排
1.1Collections中的静态方法sort()可以对实现了List接口的集合进行排序
List<String>staff=new LinkedList<>();
….
Collections.sort(staff);
还可以传入某个做好的比较器
Collections.sort(staff,staffcomparator);
1.2Collections.shuffle();随机混排列表中的元素
2.二分查找
2.1Collections.binarySearch(); 但是必须是排序好的,否则会返回错误答案,且传入的集 合要实现list接口,如果集合没有实现comparable,还要传入比较器对象
i=Collections.binarySearch(c,element);
i=Collections.binarySearch(c,element,comparator);
>0匹配索引,<0没有匹配的元素,但是可以利用返回值计算将element插入到哪个集合
insertionPoint=-i-1
if(i<0)c.add(-i-1,element)
2.2只有采用随机访问,二分查找才有意义,如果提供的是一个链表,binarySearch()就 自动的变成线性查找
3.简单算法
都是Collections中的静态函数,比如说min(),max(),addALL(),copy()………
9.总结
1.iterable接口,实现这个接口允许对象成为foreach的目标
2.集合有两个基本的接口Collection和Map,Set,List,Queue继承了Collection接口
3.Collection:一些Collection允许重复,一些Collection不允许重复,一些有序,一些无序
3.1定义的方法:
add(),addAll(),clear(),remove(),removeAll(),retainAll(),contains(),containsAll(),equals(),hashCode(),isEmpty(),iterator(),size(),toArray(),
4.Set:
4.1 Set集没有重复的元素,没有重复元素的Collection,通过equals来判断,同时,Set集的迭代器Iterator中没有add,因为迭代器是用来描述集合位置的。
4.2继承了Set接口的SortedSet接口,TreeSet实现了这个类
3.2.1 SortedSet接口是进一步提供了元素的整体排序的set,要么实现了comparable接口,要么提供comparator比较器。
4.3TreeSet类:
3.3.1速度:HashSet>TreeSet>LinkedList/ArrayList,实现了SortedSet接口。
3.3.2所传入的元素需要实现Comparable接口,需要实现compareTo()方法,Object类中没有默认的compareTo()的实现,或者将实现比较器Comparator接口的对象传入TreeSet构造器,该对象需要实现函数compare()
3.3.3 TreeSet不同步,如果需要同步,就使用Collections.synchronizedSortedSet来包装该对象。
4.4HashSet类:
3.4.1是基于散列表的集,没有顺序。
3.4.2 同样是不同步的,如果需要同步,就使用Collections.synchronizedMap来包装该对象
4.5LinkedHashSet类
4.5.1
4.6 EnumSet类
5.List
5.1. 有序的collection。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。可以插入重复元素,同时允许null元素
5.2 LinkedList
5.2.1 LinkedList是双向链接的
5.2.2删除元素通过Iterator,next(),remove(),
5.2.3 LinkedList.add()方法是将元素添加的尾部,如果需要添加到中间,则使用子接口ListIterator,通过使用next()或者previous(),然后add(),需要注意的是,add()添加的位置是迭代器的左边,往前添加一个元素之后,迭代器的位置不变:
[1apple, 5pear, 6peach, 2banana, 3orange, 4watermelon]
1和2之间是迭代器的位置,分别添加了5和6。
5.2.4但是删除操作remove(),之前是next(),则是删除迭代器左边的元素,如果是使用previous(),则是使用迭代器后面的元素。
5.2.5 set()是取代next或者previous之前的那个元素
5.2.6 链表不支持快速随机访问,但是有访问特定元素方法get(),这个方法效率特别低,所以如果需要使用快速随机访问,则使用ArrayList。
5.2.7 使用链表的唯一原因是减少在列表中插入和删除元素的开销
5.2.8 但是因为LinkedList实现了Deque接口,所以LinkedList可以通过addFirst()和addLast()在头部和尾部添加,也可以通过removeFirst()和removeLast()删除头部或者尾部元素。
5.3ArrayList
5.3.1实现了list接口,适用于快速随机访问,使用get和set方法。
5.3.2 和Vector不同的是,Vector类的所有方法都是同步的,但是如果只有一个线程访问Vector,那么会在同步操作上花费大量的时间。所以,需要同步时使用Vector,不需要同步是使用ArrayList
6.Queue
6.1队列是支持先进先出,在尾部添加,在头部删除,不允许在中间插入或者删除元素
6.2有双端队列可以支持同时在头部和尾部添加删除元素,如LinkedList和ArrayDeque
6.3 优先权队列PriorityQueue,可以按照任意顺序插入,但是总是按照排序的顺序检索,也就是无论什么时候调用remove,都会获得当前优先级最小的元素,优先级的排列如同TreeSet一样,插入对象实现了Comparable接口或者通过一个实现了Comparator接口的类对象来进行排序。
7.Map,实现Map接口的有HashMap,TreeMap,
7.1键必须是唯一的,如果对同一个键使用put方法两次,那么第二个会覆盖第一个。
7.2速度:HashMap>TreeSet
7.3TreeSet根据键的整体顺序进行排序,HashSet对键进行散列,
7.4WeakHashMap,如果一个键被删除,那么键对应的对象也被删除。
7.5LinkedHashMap
7.6IdentityHashMap