集合
所谓集合,就是来保存,装数据,也可称为容器类。
集合中的类在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()
:删除元素
使用迭代函数的步骤:
- 调用类集的
iterator()
方法获得迭代子实例 - 建立一个调用
haxNext()
方法的循环,只要hasNext()
返回true
,就进行循环迭代 - 在循环内部,通过调用
next()
方法来得到每一个元素
一个例子:
迭代
for循环
从J2SE 5.0开始,可以不必使用iterator()
了,使用增强的for循环可以直接遍历List所有元素。
就像这样
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<K> keySet()
:返回此HashMap
中包含的键set视图 -
Collection<V> values()
:返回此HashMap
中包含的值的collection视图 -
Set<Map.Entry<K,V>> 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();
示范:
很好的示范
Hashtable
和HashMap
的区别:
-
Hashtable
不允许null
值(key和value都不行),HashMap
允许null
值 -
Hashtable
的方法是同步的,HashMap
未经同步,所以很多线程场合要手动同步 -
Hashtable
除了使用Iterator
迭代,还可以使用Enumeration
。HashMap
不能用Enumeration
Properties
Hashtable(哈希表)里存的关键字/值对可以是各种类型。而Properties
就相对简单多,因为它只存放字符串对。
Properties
用setProperty()
和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)
找出集合中的最大值、最小值
网友评论