Java入门:集合

集合

所谓集合,就是来保存,装数据,也可称为容器类。
集合中的类在java.util包下。
Java的集合框架提供了操作一组数据的很多方法,这些方法可以直接调用。
在Java2的Collections框架中,主要包括4个接口及其扩展和实现类。

分类

Collection(一组对立的元素)

每个位置只能保存一个元素

  • List:可以重复元素的集合
  • Set:不允许重复的集合
  • Queue:保存队列先进先出的顺序

Collection
Collection是集合体系中最顶层、最基本的接口,可以使用foreach进行遍历,还有迭代器iterator()方法进行遍历。

Set
实现Collection接口,不能包含重复的元素。
equeals()方法:判断两个对象是否相同,新加入的元素和已有元素相比,返回false,否则拒绝添加。

HashSet
使用Hash算法来储存元素,具有良好的存取和查找性能。根据元素的Hashcode值决定元素在Hashset的位置。

LinkedHashSet
也是利用Hashcode决定元素储存位置,但是使用链表维护元素的次序。当遍历的时候,是按照插入的顺序遍历的。
LinkedHashSet需要维护元素的插入顺序,因此性能会略低于HashSet的性能,但是在迭代访问所有元素时性能很高。(链表适合遍历)

SortedSet
排序,插入的元素类型需要一样,否则会出现ClassCastException错误

TreeSet
SortedSet的实现类,保证元素处于排序状态

EnumSet
为枚举类设计的集合类

List
有顺序,可重复,因此可以通过索引来指定位置的集合元素

ArrayList
给予数组的List,封装了动态增长的Object[]数组

Vector
和ArrayList几乎一样,比较古老,线程安全

Stack
是Vector的子类,是的结构(后进先出)

LinkedList
实现List,Deque;实现List,可以进行队列操作,可以通过索引来随机访问集合元素;实现Deque,也可以当作双端队列,也可以当作栈来使用。

Queue(队列)
Queue内部是队列的数据结构(先进先出),新插入的元素会在尾部;插入之后,慢慢向顶部移动。

PriorityQueue(优先级队列)
除了实现Queue接口,PriorityQueue还对插入的元素进行重新排序

Deque
双端队列,Deque可以从两端来添加,删除元素,因此,Deque可以当作队列使用,也可以当作栈使用

ArrayDeque
给予数组的双端队列,和ArrayList类似,底层都是采用一个动态可分配的Object[]数组

Map(键值对)

可以通过键(key)来找值(value)

  • key:不允许重复
  • vlaue:储存方式类似List(可以重复,根据索引来查找)

Collection

定义了以下常用的方法:

  • boolean add(Object element):向集合中加入一个元素
  • boolean remove(Object element):删除集合中一个元素
  • int size():求集合的大小
  • boolean isEmpty():判断集合是否为空
  • boolean contains(Object element):判断集合是否存在元素某元素
  • Iterator iterator():返回集合的迭代子
  • Ojbect[] toArray():将集合转变为数组
  • void clear():清除集合中的元素
  • boolean addAll(Collection collection):将collection中的元素全部添加到集合里

Collection的实现类能够实现以下功能:

  • 存放一个元素
  • 增加/删除一个元素
  • 查找一个元素是否在此集合中
  • 计算此集合的元素数目

Iterator迭代

不论Collection的实际类型如何,他都支持一个iterator()方法,该方法返回一个迭代子,即对应的Iterator(实现类)对象,使用该迭代子即可逐一访问Collection中的每一个元素。

接口Iterator可实现对集合元素的遍历,有3个方法:

  • boolean hasNext():判断是否还有下一个元素
  • Object next():取得下一个元素
  • void remove():删除元素

使用迭代函数的步骤:

  1. 调用类集的iterator()方法获得迭代子实例
  2. 建立一个调用haxNext()方法的循环,只要hasNext()返回true,就进行循环迭代
  3. 在循环内部,通过调用next()方法来得到每一个元素

一个例子:


迭代

for循环

从J2SE 5.0开始,可以不必使用iterator()了,使用增强的for循环可以直接遍历List所有元素。
就像这样

for循环

List

List接口定义可以重复的元素集合。
List是有序集合,继承了Collection接口并新增了下面一些方法:

  • public Object get(int index):返回指定位置的数组元素
  • public Object set(int index,Object element):设置指定位置的元素
  • public Object remove(int index):删除指定位置的元素
  • public int indexOf(Object o):查找o在List中出现的第一个位置
  • public int lastIndexOf(Object o):查找o在List中出现的最后一个位置
  • public List subList(int formIndex,int toIndex):返回子List
  • public ListIterator listIterator():送回ListIterator迭代子

List接口主要以下实现类:

  • ArrayList
  • LinkedList
  • Vector

List储存结构:

  • 顺序储存:ArrayList
  • 链式储存:LinkedList

MAP接口

HashMap

HashMap类使用哈希算法实现Map接口。
HashMap类允许空key和空value,不保证元素的顺序。另外HashMap是线程不安全的。

构造函数:

  • HashMap():构造一个默认的HashMap
  • HashMap(Map m):用m的元素初始化HashMap
  • HashMap(int capacity):将HashMap的初始容量设置为capacity

常用方法:

  • V get(Object key):根据键得到值
  • V put(K key,V value):将键和值一起放入Map

来个HashMap例子:


HashMap

Map迭代

  • Set keySet():返回此HashMap中包含的键set视图
  • Collection values():返回此HashMap中包含的值的collection视图
  • Set> entrySet():返回此HashMap的键和值的整体(Map.Entry)的set视图

Map.Entry()接口,表示键值对,有两种核心方法:

  • Object getKey():得到键值
  • Object getValue():得到Value值

例子:


大栗子

Hashtable

Dictionary类提供了根据关键字查值的功能。Dictionary是一个abstract的类,因此不直接使用它。直接使用的一般是Hashtable类,Hashtable称为哈希表类,Hashtable也是一个键值对,和HashMap类似。
Hashtable有其独特的迭代方式:
如果要取得并显示哈希表中所有Values,用以下程序:
Enumeration enum = table.elements();
如果要取得并显示哈希表中所有关键字的值,用以下程序:
Enumeration enum1 = table.keys();

示范:


很好的示范

HashtableHashMap的区别:

  • Hashtable不允许null值(key和value都不行),HashMap允许null
  • Hashtable的方法是同步的,HashMap未经同步,所以很多线程场合要手动同步
  • Hashtable除了使用Iterator迭代,还可以使用EnumerationHashMap不能用Enumeration

Properties

Hashtable(哈希表)里存的关键字/值对可以是各种类型。而Properties就相对简单多,因为它只存放字符串对。
PropertiessetProperty()getProperty()方法来处理值,值只能是String
常用方法:

  • load(InputStreaminStream):从流中读取属性列表
  • Enumeration propertyName():返回所有的键
  • public String getProperty(String key):根据键获得值
  • public Object setProperty(String key,String value):将键和值加入Properties

Collections工具类

Collections类中定义了集合操作的相关算法。

排序

List中的对象必须实现Comparator接口,或者显式制定一个比较器。
采用的方法:

  • sort(List list):对List排序,按照自然顺序排
  • sort(List list,Comparatore c):对List进行排序,按照Comparator对象c中定义的规律排

查找

  • binarySearch(List list.Object key)
  • binarySearch(List list,Object key,Comparator c)
    找出集合中的最大值、最小值

你可能感兴趣的:(Java入门:集合)