Collection和Map入门总结

   我们知道最基本的数据结构是数组Array,但是数组由于长度固定、不易读取和修改,所以java集合框架为我们提供了一套功能强大,方面使用的接口和类,在java.util的包中。

下面是对于将常用到的List,Set,Map接口的总结。

整体结构

简单画一下常用的集中集合的结构

 

各接口的区别

Collection:元素无序、不唯一(可能重复);

List:元素不唯一(可能重复),保证顺序(插入顺序);

set:元素不重复,但无序

map:键值对,key—value,key是set集合,不重复。

List

ArrayList与LinkedList

 构造时我一般会指定类型(泛型也可),也可以不指定类型,但是不指定类型默认作为Object(根类),每次读时还要强制转换,且类型放错了编译也不报错。俩这性能并无显著差异,泛型在运行期间会被擦除。

//不指定类型,取出时要强制转换,且运行容易出错
List dog = new ArrayList();
	dog.add("d");
	dog.add(10);
	System.out.println((String)dog.get(0));
	System.out.println(dog.get(1) instanceof Integer);
	for (Object object : dog) {
		System.out.println(object.toString());
	}

List平时常用方法:

boolean add(Object o):在列表末尾顺序添加元素,从0开始

addall(),removeAll

void add(int index,Object o):指定位置添加,不要超出索引范围。

int size(),

Object remove(int index);boolean remove(Object o)

boolean contains(Object o);

object get(int index)

clear()

 

LinkedList是链表实现,有一些特殊常用方法

addFirst、addLast、getFirst、getLast、removeFirst、removeLast

区别

ArrayList 是线性表(数组)
get() 直接读取第几个下标,复杂度 O(1)
add(E) 添加元素,直接在后面添加,复杂度O(1)
add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
remove()删除元素,后面的元素需要逐个移动,复杂度O(n)
 
LinkedList 是链表的操作
get() 获取第几个元素,依次遍历,复杂度O(n)
add(E) 添加到末尾,复杂度O(1)
add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
remove()删除元素,直接指针指向操作,复杂度O(1) 
 

Vector

线程安全,单个元素,效率较低

Set

set保证数据不重复,add重复时会返回false;

TreeSet和HashSet

顺序性

TreeSet有序,HashSet无序

继承

TreeSet实现的是treeMap,hashSet实现的是HashMap,但是因为继承了Set,所以都是单列不重复的元素集合。

底层存储

HashSet用的是哈希表的结构存储的;判断重复时通过重写hashCode()和equals()的方法来实现,hashCode不同则元素不同。

TreeSet是TreeMap的二叉树结构的存储方式,可以对Set集合的元素进行树排序,性能优良;判断重复通过继承自Compareable接口的compareTo方法来保证。

Map

list集合查找元素要先知道数组下标,有时候满足不了一些功能,map提供利用key检索,比较适合于分类统计、数据缓存的一些程序需求。提供了“列表散列”的结构,其实是列表和数组的结合体

常用方法

Object  put(key,value),

Object get(key),

Object remove(key),

int size(),

Set  keySet(),返回键的set集合

Collection values(),返回值的集合

boolean containsKey(key)

HashMap与HashTable的区别

HashMap的key可以为null,且最多一个key是null,多个会覆盖;hashTable不可为null。

HashMap数据不会同步,线程不安全,可以用Collections.synchronizedMap(new HashMap<>())返回一个新的Map来进行线程同步,也可以参考ConcurrentHashMap(1.5后才有的)

HashTable线程同步,线程安全,但同时性能会低。

TreeMap

有序集合,但是没有经过线程同步,实现的是Map接口,但比Hash集合要慢。

TreeMap和TreeSet

相同点:

  1. TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的。
  2. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
  3. 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。

不同点:

  1. 最主要的区别就是TreeSet和TreeMap非别实现Set和Map接口
  2. TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)
  3. TreeSet中不能有重复对象,而TreeMap中可以存在

参考:

http://blog.csdn.net/geduo_83/article/details/20613233

http://blog.csdn.net/x_i_y_u_e/article/details/46372023

http://blog.csdn.net/speedme/article/details/22661671

 

 

posted on 2017-04-21 14:11  过后不思量  阅读(470)  评论(0)    收藏  举报