Collection是集合接口 |————Set子接口:无序,不允许重复。 |————List子接口:有序,可以有重复元素。
区别:Collections是集合类
Set和List对比: Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set和List具体子类: Set |————HashSet:以哈希表的形式存放元素,插入删除速度很快。
List |————ArrayList:动态数组 |————LinkedList:链表、队列、堆栈。
Array和java.util.Vector Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
Collection是集合接口
Collections是集合类
Set接口继承自Collection集合接口
List接口继承自Collection集合接口
Set接口:是Collection接口的一个子接口,它表示数学意义上的集合概念。Set中不包含重复的元素,即Set中不存两个这样的元素e1和e2,使得e1.equals(e2)为true。
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
package cn.czbk.no7;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class CollectionTest {
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add("abc");
hs.add("abc");
hs.add("ab");
hs.add("ac");
hs.add("ab");
hs.add("ac");
hs.add("abcd");
System.out.println(hs);//
//定义一个接口类型的引用变量来引用实现接口的类的实例
Set treeSet=new TreeSet(hs);
System.out.println(treeSet);
}
}
上述代码执行完毕后的控制台打印出来的数据如下:
List接口:继承了 Collection
接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。
ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
package cn.czbk.no7;
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List l1=new ArrayList();
for(int i=0;i<=9;i++)
{
l1.add("ly"+i);
}
System.out.println("初始化: \n"+l1);
l1.add(4, "ly04");
System.out.println("在下标为4的地方新增里ly04: \n"+l1);
l1.set(8, "ly08");
System.out.println("将下标为8的值改为ly08: \n"+l1);
l1.remove(1);
System.out.println("删除下标为1的值: \n"+l1);
}
}
package cn.czbk.no7;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class TestList1 {
public static void main(String[] args) {
List l1=new LinkedList();
for(int i=0;i<=9;i++){
l1.add("a"+i);
}
System.out.println("初始化\n"+l1);
Collections.shuffle(l1);
System.out.println("乱序之后\n"+l1);
Collections.reverse(l1);
System.out.println("逆序\n"+l1);
Collections.sort(l1);
System.out.println("排序"+l1);
}
}
Map接口:不是 Collection
接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。
HashMap和Hashtable的区别
导读:
1 HashMap不是线程安全的
HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
2 HashTable是线程安全。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差
总结:
hashmap | 线程不安全 | 允许有null的键和值 | 效率高一点、 | 方法不是Synchronize的要提供外同步 | 有containsvalue和containsKey方法 | HashMap 是Java1.2 引进的Map interface 的一个实现 | HashMap是Hashtable的轻量级实现 |
---|---|---|---|---|---|---|---|
hashtable | 线程安全 | 不允许有null的键和值 | 效率稍低、 | 方法是是Synchronize的 | 有contains方法方法 | 、Hashtable 继承于Dictionary 类 | Hashtable 比HashMap 要旧 |