Java–Collection,ArrayList,HashMap,HashSet

Javacollect

 

 

HashSet,ArrayList,HashMap等都是在Java中常用的数据结构,简单进行归纳分析。上图从网上搜索而来,简单来说,有如下拓扑结构

java.util.Collection [I]
+–java.util.List [I]
+–java.util.ArrayList [C]
+–java.util.LinkedList [C]
+–java.util.Vector [C]
+–java.util.Stack [C]
+–java.util.Set [I]
+–java.util.HashSet [C]
+–java.util.SortedSet [I]
+–java.util.TreeSet [C]

java.util.Map [I]
+–java.util.SortedMap [I]
+–java.util.TreeMap [C]
+–java.util.Hashtable [C]
+–java.util.HashMap [C]
+–java.util.LinkedHashMap [C]
+–java.util.WeakHashMap [C]
[I]:接口
[C]:类
根据使用经验和网上搜索的信息总结:

Collection接口

查看其声明

public interface Collection extends Iterable

发现其中继承了Iterable类,继续跟踪,./Java/laung/Iterable.java

public interface Iterable{
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator iterator();
}

因此,我们可以发现,之所以Collection都可以实现一个Iterator类,是因为其都继承了接口Interalbe<T>,于是,我们再使用的时候,可以使用

Collection c = new ArrayList();
Iterator it=c.iterator();
while(it.hasNext())
{
...
}

当然,对于Collection我们其实还可以使用foreach来遍历其中的每一个元素

Collection c=new ArrayList();
for(Object ob:c)
{
...
}

List类

查看定义可得

public interface List extends Collection

List与Set的主要区别在于List中的元素可以重复,且List中的元素位置是确定的,可以类比与Java中打数组来理解,在List中提供了

boolean equals(Obect o)

来判断List中的两个元素是否相等。
此外在List中除了Iterator方法之外,还提供了一个ListIterator,在Iterator基础上增加了如下方法

boolean hasrevious();
Object previous();
void add();

在使用List中需要使用迭代器Iterator的时候,使用Iterator更为方便。

ArrayList和Vector类

ArrayList和Vector类是List类打两个典型的实现,而这两个类是使用Obect[]来实现的,capacity为其大小,无参实例化的时候,默认的ArrayList的大小为10;当向其中添加元素的时候,capacity为自动增加,因此,当我们明确元素数量会比较大的时候,我们可以使用new ArrayList(int capactiy)构造函数,使其初始化为比较大的空间。除此之外,ArrayList和Vector还提供了两个方法来操作capacity属性:

void ensureCapacity(int minCapacity): Increase the capacity
void trimTosize(); Trim to the min size

相对于ArrayList而言,Vector是一个相对比较老的类,同时,两者另外一个比较重要的区别在于,ArrayList的线程是不安全的,而Vector的线程是安全的,因此可以理解的是Vector的性能比ArrayList要低,但我们可以使用Collections的工具,将ArrayList变成线程安全。

Stack类

Stack类是Vector的一个子类,可以实现堆栈这种数据结构,此处不再赘述。其中主要有3个方法

Object peek();
Object pop();
void push(Object item);
其中peek和pop是将元素弹出堆栈,其区别在于peek只弹出,不删除其中元素,而pop弹出后会删除元素。

固定长度List

对于数组来说,有一个工具类:Arrays,该工具类提供了一个asList(Object… a)打方法,可以将一个数组或指定个数打对象转换成一个List集合,要注意的是,该List的集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays打内部类ArrayList的实例。 Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合中的元素,不可以增加、删除。

Queue接口

该接口主要用于模拟队列数据结构,FIFO,主要有下面的方法

void add(Object e):加入元素
Object element():获取队列头部元素,但不删除
boolean offer(Object e):将指定元素加入队列,当队列容量有限打时候,该方法要优于add
Object peek():获取头部元素,但不删除
Object poll():获取头部元素,且删除
Object remove();获取头部元素,并删除

对于该接口而言,主要有两个实现类LinkedList和PriorityQueue

LinkedList类

该类继承于List并实现了Queue接口,
与ArrayList、Vector区别:
实现原理不同,ArrayList和Vector都是使用数组实现,而LinkedList则是使用链表来实现(Linked),因此可以这样理解,在效率上,当使用随机访问时:ArrayList和Vector要比LinkedList更好,而当数据插入删除比较频繁打时候,使用LinkedList的效率要远远高于ArrayList和Vector。同时要注意的问题是,Vector由于实现了线程保护,因此,其最终打效率仍然是比较低的。

PriorityQueue类

该类是一个队列,但并不完全满足队列打要求,因为该类主要内部的排列顺序为按照大小来排序

Map

Map保存的数据具有映射关系,在Map的集合中保存有两组值,Key+Value,其中Key和Value都可以为任意类型,但Key不可以重复,而Value可以重复。Key和Value之间存在有意义对应的关系。因此可以理解Key放在一起,组成了一个Set集合。

在类的名字上,我们可以发现

Set: ? ? ? ? ? ? ? HashSet、LinkedHashSet、SortedSet(Interface)、TreeSet、EnumSet

HashMap: ? HashMap、LinkedHashMap、SortedMap(Interface)、Treemap、EnumMap

实际上,HashSet的实际实现方法就是依赖于HashMap来实现的。

在Java中有一个Hashtable类,HashMap与Hashtable类的关系与HashSet和Vector类似。

Properities类

该类为Hashtable类的一个子类,该类可以利用Map的特点,将属性保存在配置文件中,有如下代码

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class TestProperties {
	public static void main(String[] args) throws FileNotFoundException, IOException
	{
		Properties prop=new Properties();
		prop.setProperty("Name", "This is name");
		prop.setProperty("Password", "This is password");
		prop.store(new FileOutputStream("tmp"),"This is comments line");
		Properties prop_1=new Properties();
		prop_1.load(new FileInputStream("tmp"));
		System.out.println(prop_1);
	}
}

该程序运行结果为:

{Name=This is name, Password=This is password}

同时在工作目录下还生成文件tmp,内容为:

#This is comments line
#Tue Feb 26 19:32:48 CST 2013
Name=This is name
Password=This is password

操作集合工具类:Collections

该类提供了可以对Set、List、Map等方便操作的类:Collections,功能简介:

1、排序

static void reverse(List list);反转所有集合顺序
static viod shuffle(List list):对List集合随机排序
static void sort(List list):排序,升序
static void sort(List list,Comparator c):根据Comparator顺序进行排序
static void swap(List list,int i,int j):将List中i和j位置交换
static void rotate(List list,int distance):

2、查找、替换

3、同步控制
Vector和Hashtable分别比HashSet和HashMap的优点就在于其线程是安全的,在Collection中提供了synchronizedXxx方法,用来解决多线程访问的时候的并发问题
代码为

Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());

About: happyhls


发表评论

电子邮件地址不会被公开。 必填项已用*标注