java的集合学习

来源:互联网 发布:颜值高的游戏本知乎 编辑:程序博客网 时间:2024/06/15 01:44

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

原创粉丝点击