数组与集合
数组为java内置结构,其存入对象数量及类型固定,不可更改。也就是说程序在运行前就已经知道所要创建的对象的数量以及类型,但并非所有程序在运行前就能获知对象类型以及对象数量信息,因此引入了集合。
集合主要用于保存数据,集合中保存的是对象句柄,会将类型信息丢弃,这就是为何在运行中才能得知对象类型。
集合类关系如下:
下面介绍主要的集合:
1.List接口
有序,可以包含重复的元素,能够精确控制每个元素插入位置,使用索引访问list中元素,类似于数组。常用的实现类有下面4个:
1.1ArrayList
可变数组,默认长度为10,默认元素为null,可根据元素个数动态扩展list长度;非同步;顺序存储结构
1.2LinkedList
双向链表结构(每个节点都有前驱和后驱);非同步
1.3Vector
类似于数组,其大小可动态扩展和收缩;同步
1.4Stack
先进后去栈,从Vector继承。
2.Set接口
不允许有相同元素,最多只能有一个null元素,
3.Map接口
提供key到value的映射,key中不能包含重复元素,一个key可以对应多个value;提供三种视图,一种key的set集合,一种value的collection集合,一种key-value的set集合
3.1HashTable
key、value对象要求非空,作为key的对象需要实现hashCode方法和equals方法;通过计算key的散列函数来确定对应的value值。如果俩个对象相同,其hashCode相同;同步
get方法实现:
public synchronized V get(Object key){
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for(Entry<?,?> e = tab[index]; e != null; e = e.next){
if((e.hash == hash) &&e.key.equals(key)){
return (V)e.value;
}
}
return null;
}
3.2HashMap
hashMap与hashTable类似,除了hashMap允许key、value为null,以及非同步
4.Iterator接口
替代了java1.1中的Enumeration,对多元素进行迭代处理。
简单实现:
import java.util.*;
/**
* 初始化未赋值后,存入值为null,实现Map接口的类无法使用Iterator迭代,
* 实现set、list接口的使用iterator迭代更安全
* Created by D on 2017/10/9.
*/
public class test {
public static void main(String[] args){
Map hashMap = new HashMap(15);
Map hashTable = new Hashtable(15);
List vector = new Vector(15);
List arrayList = new ArrayList(15);
List statck = new Stack();
List linkedList = new LinkedList();
Set hashSet = new HashSet(15);
for (int i = 0; i < 15; i++){
hashMap.put(i,i*i);
hashTable.put(i+1,i*5);
vector.add(i);
arrayList.add(i+i);
statck.add(3*i);
linkedList.add(4*i);
hashSet.add(5*i);
}
Iterator itVector = vector.iterator();
Iterator itArrayList = arrayList.iterator();
Iterator itStack = statck.iterator();
Iterator itLinkedList = linkedList.iterator();
Iterator itHashSet = hashSet.iterator();
useIterator(itVector);
}
/**
* 使用iterator迭代数据
* @param it
*/
public static void useIterator(Iterator it){
while (it.hasNext()){
System.out.println("数据:"+it.next());
}
}
}
总结:
1.linkedList:快速删除、插入元素
2.Stack:先进后出堆栈操作
3.arrayList:快速随机查询元素
4.Set:无序,不允许重复
5.单线程,考虑非同步,多线程,使用同步
6.哈希表操作,作为key对象需要重写hashCode以及equals方法
7.除排序情况下使用treeset、treemap,其他考虑hashset、hashmap,效率更高