首页 > 代码库 > 集合相关知识

集合相关知识

一、数组Array和集合的区别:

 
(1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
 
(2)JAVA集合可以存储和操作数目不固定的一组数据。 (3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。
 
联系:使用相应的toArray()和Arrays.asList()方法可以回想转换。
 
二、collection相关函数
 boolean add(E e) 
          确保此 collection 包含指定的元素(可选操作)。
 boolean addAll(Collection<? extends E> c) 
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
 void clear() 
          移除此 collection 中的所有元素(可选操作)。
 boolean contains(Object o) 
          如果此 collection 包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c) 
          如果此 collection 包含指定 collection 中的所有元素,则返回 true
 boolean equals(Object o) 
          比较此 collection 与指定对象是否相等。
 int hashCode() 
          返回此 collection 的哈希码值。
 boolean isEmpty() 
          如果此 collection 不包含元素,则返回 true
 Iterator<E> iterator() 
          返回在此 collection 的元素上进行迭代的迭代器。
 boolean remove(Object o) 
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
 boolean removeAll(Collection<?> c) 
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
 boolean retainAll(Collection<?> c) 
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
 int size() 
          返回此 collection 中的元素数。
 Object[] toArray() 
          返回包含此 collection 中所有元素的数组。
<T> T[]
toArray(T[] a) 
          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
 
三、List、Set、Map是这个集合体系中最主要的三个接口。 List和Set继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。
 
Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set 只能通过游标来取值,并且值是不能重复的。
 
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。 ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的
 
Map 是键值对集合。其中key列就是一个集合,key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是Map的三个主要的实现类。 HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 
 
                                                 通用的目的实现
 
接口      实现
   哈希表    可变数组    树        链表     哈希表+链表
Set HashSet   TreeSet   LinkedHashSet
List   ArrayList   LinkedList  
Map HashMap   TreeMap   LinkedHashMap
四.List和ArrayList  Map与HashMap的区别
 
  1.List是接口,List特性就是有序,会确保以一定的顺序保存元素.
 
  ArrayList是它的实现类,是一个用数组实现的List.
 
  Map是接口,Map特性就是根据一个对象查找对象.
 
  HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
 
  2.一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
 
  比如:List list = new ArrayList();
 
  这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
 
  List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
 
  这样,就不需要修改其它代码,这就是接口编程的优雅之处.
 
  另外的例子就是,在类的方法中,如下声明:
 
  private void doMyAction(List list){}
 
  这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
 
  3.如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
 
五、List和Set的区别
1、List中元素有序可重复,Set中元素无需不可重复,重复添加只会保存第一次添加的元素。
2、List中常用方法中有set(int index,E element),set(int index)和get(int index) ,get(int index,E element)方法能灵活添加获取元素,而Set中没有这些方法(无序)。而且其中的Remove方法各不相同List中Remove(int index) ,Set中Remove(Object element)
3.List有三种遍历方式 (1)foreach遍历 (2)Iterator迭代器遍历 (3)通过size()和get()两种方法配合的一般遍历
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class javaTest2 implements javaTest1 {

public static void main(String[] args) {
    List list=new ArrayList();
    list.add(1);
    list.add(5);
    list.add(‘a‘);
    
    for (Object object : list) {
        System.out.print(object+"  ");
    }
    System.out.println();
    
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i)+"  ");
    }
    System.out.println();
    
    Iterator it=list.iterator();
    while(it.hasNext()){
        System.out.print(it.next()+"  ");
    }
  }
}

运行结果:

1  5  a  
1  5  a  
1  5  a  

Set只有两种遍历方式 (1)foreach遍历 (2)Iterator迭代器遍历 

Set set=new HashSet();
    set.add(1);
    set.add(3);
    set.add(‘b‘);
    
    for (Object object : set) {
        System.out.print(object+" ");
    }
    System.out.println();
    
    Iterator its=set.iterator();
    while(its.hasNext()){
        System.out.print(its.next()+" ");
    }

运行结果:

1 b 3 
1 b 3 

六、集合具体实现化类的区别

1、Set实现:HashSet、TreeSet和LinkedSet区别

HashSet将其元素储存在一个哈希表中,它具有最好的性能实现,然而它不保证迭代的顺序;TreeSet将其元素存储在一个红黑树追踪,按元素的值顺序排列,它本质上比HashSet要慢;LinkedHashSet是作为哈希表实现的,用链表链接这些元素,按元素的插入顺序排列

2、List实现 ArrayList和LinkedList

一般大家都知道ArrayList和LinkedList的大致区别:
(1).ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
(2).对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
(3).对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

3、Map实现: HashMap、TreeMap和LinkedMap区别

他们的行为和执行性能和Set中的实现HashSet、TreeSet和LinkedSet类似。另外Hashtable(哈希表)重新实现了Map

 

技术分享

集合相关知识