一、数组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 中所有元素的数组。 |
|
|
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