JAVA集合笔记

Java集合UML图

这里写图片描述
Collection集合体系的继承树

这里写图片描述
Map体系的继承树
(图源:疯狂Java讲义第三版)

集合:和数组不一样,数组既可以保存基本类型的值,也可以是对象,但是集合仅仅可以保存对象。

Collection

Collection的几个使用的比较频繁的方法:

boolean add(Object o)
boolean addAll(Collection c)
boolean contains(Object o)
Iterator iterator()
Object[] toArray()

注意:在不使用泛型的情况下,把一个对象“丢进”集合里面后,集合会忘记这个对象的具体类型,系统会把所有集合对象元素当作是Object类型。

Iterator

从上面collection的方法中,iterator的方法就是返回一个当前集合的一个迭代器,用于遍历集合里面的元素。
一般方法:
boolean hasNext()
Object next()
void remove()
注意:当使用iterator对集合进行迭代时,iterator并不是把集合元素本身传递给迭代变量(迭代器并没有复制引用),而是把集合元素的值传给迭代变量,通过iterator的remove()方法对于集合是没有任何影响的。并且当时用Iteratot访问集合元素时,集合的元素不可以被改变,否则会抛出Java.util.ConcurrentModificationException异常。

set集合

Set集合与Collection基本相同,没有提供任何额外的方法。实际上set就是Collection,只是行为略有不一样,set不允许含有重复元素(建议看一下源码,看一下为什么导致这个行为),其几个实现类HashSet、TreeSet,主要是这两个。

HashSet类

特点:
1、不能保证元素的 排列顺序
2、HashSet不是同步的,如果有多个线程来访问一个HashSet的时候,则必须通过代码实现同步。

添加过程:
当向HashSet集合存入一个元素的时候,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值来决定该对象在hashSet中的存储位置。如果有两个元素通过equals()方法比较放回TRUE,但是他们的hashCode()方法返回的值不相等,HashSet还是会将他们存储在不同的位置。

注意:如果某个类的对象保存到HashSet集合中,重写这个类的equals()方法和hashCode()方法时,尽量保证两个对象通过equals()
比较返回TRUE时、他们的hashCode()方法返回值也相等。因为当两个对象的hashCode值相同,HashSet将试图把他们保存到同一个位置,实际上会在这个位置用链式结构来保存多个对象,所以如果HashSet中的两个以上的元素具有相同的hashCode会导致功能下降。

注意:当向HashSet中添加可变对象时,必须小心。如果修改了HashSet集合里面的对象,有可能导致该对象与集合中的其他对象相等,从而导致HashSet无法准确访问该对象。

LinkedHashSet

LinkedHashSet集合也是根据元素的hashCode来决定存储位置,但是使用链表维护元素的次序,这样使得元素看起来是以插入顺序保护的。

TreeSet类

TreeSet是SortSet接口的实现类,可以确保元素处于排序状态,根据元素实际大小来进行排序,默认情况下,TreeSet采用自然排序。
方法:

Comparator comparator()
SortedSet subSet(Object fromElement,Object toElement)
SortedSet headSet(Object toElement)
SortedSet tailSet(Object fromElement)

1、自然排序
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排序。所以如果试图将一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会抛出异常。并且向TreeSet中添加的应该是同一个类的对象,否则也会引发ClassCastException异常。

注意:对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较是否返回0,所以如果两个对象通过equals()方法比较放回TRUE时,这两个对象通过compareTo(Object obj)方法应该返回0。

注意:如果向TreeSet中添加一个可变对象后,并且后面的程序修改了可变对象的实例变量,这可能将导致与其他对象的大小顺序发生改变,当时TreeSet不会再次调整他们的顺序,甚至可能导致TreeSet中保存的这两个对象通过compareTo(Object obj)方法比较返回0。一旦改变了TreeSet集合可变元素的实例变量,当再次试图删除该对象是,TreeSet也会删除失败,TreeSet可以删除没有被修改的实例变量,且不与其他被修改的实例变量重复的对象。

List集合

方法:

Object get(int index)
int indexOf(Object o)
List subList(int fromIndex,int toIndex)
void sort(Comparator c)

除了iterator()方法不同,List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。与Iterator不同,listIterator会改变集合的内容。
方法:

boolean hasPrevious()
Object previous()  //添加了向前迭代
void add(Object o)

ArrayList和Vector

ArrayListh和Vector都是基于数组的List的实现类,所以ArrayList和Vector类都封装了一个动态的,允许再分配的Object[] 数组。ArrayList或Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,他们的initialCapacity会自动增加。

ArrayList和Vector的显著区别是:ArrayList是线程不安全的,而Vector是线程安全的。

固定长度的List
Arrays工具类提供了asList(Object….a)方法,该方法可以把一个数组或者指定个数的对象转化成一个List的集合,既不是ArrayList,也不是Vector,而是Arrays的内部类ArrayL的实例,Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合的元素,而不能进行增删操作。

Queue集合

Queue用于模仿队列这种结构。
方法:

void add(Object e)
Object element()
boolean offer(Object e)
Object peek()
Object poll()
Object remove()

PriorityQueue

PriorityQueue是不太标准的队列实现类,因为PriorityQueue保存队列元素的 顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序,因此当调用peek()方法或者poll()方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。

PriorityQueue不允许插入null值,并且插入的对象必须是实现了Comparable接口,而且是同一个类里面的实例对象。

Deque接口(是Queue的字接口,代表一个双端队列)与ArrayDeque实现类

方法:

void addFirst(Object e)
void addLast(Object e)
Iterator descendingIterator()
Object getFirst()
Object getLast
boolean offerFirst(Object e)
boolean offerLast(Object e)
Object peekFirst()
Object peekLast()
Object pollFirst()
Object pollLast()
Object pop()       //栈方法
void push(Object e) //栈方法

Deque不仅可以用于队列的实现,也可以用于栈的实现

LinkedList实现类

LinkedList类是List接口的实现类,是List的集合,可以根据索引值类进行随机访问集合中的元素
LinkedList实现了Deque接口,可以被用于双端队列的应用。

Map集合

方法:

void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
Set entrySet()
Object get(Object key)
boolean isEmpty()
Set KeySet()
Object put(Object key,Object value)
Collection values()

Map的一个内部类Entry,该类封装了一个key-value对
方法:

Object getKey()
Object getValue()
Object setValue(V value)

HashMap和Hashtable实现类

Hashtable 和 HashMap区别:
1、Hashtable线程安全,HashMap线程不安全
2、Hashtable不允许使用null作为key和value,如果尝试把null放进hashtable中,将会引发NullPointException异常,但hashMap可以使用null作为key或value

注意:为了成功地在HashMap、Hashtable中存储、获取对象,用作key的对象必须实现hashCode()方法和equals()方法,并且与HashSet类似,如果使用可变对象作为HashMap、Hashtable的key,并且程序修改了作为key的可变对象,也可能出现于HashSet类似的情况:程序再也无法准确访问 Map中被修改的key。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值