Java集合基础

1.Collection

Collection是一个接口

Collections是一个类,并提供了一系列静态的方法实现对各种集合的搜索、排序等操作。

Collection的两个子接口为List和Set.

List:元素是有序的,并且允许重复。

Set:无序,不能含有重复的元素。

1)Collection接口的使用

	public static void main(String[] args) {
		Collection c=new ArrayList();//创建一个集合对象
		c.add("1");//添加对象到集合中
		c.add("2");
		c.add("3");
		System.out.println(c);

	}

//输出[1, 2, 3]


2)List

List包括ArrayList和LinkedList

(1)ArrayList

ArrayList实现了collection的list接口,底层采用数组实现,内容有序,允许重复, 存取速度快,插入删除速度慢。

public static void main(String[] args) {
		ArrayList al=new ArrayList();
		al.add(123);//ArrayList存放的是对象,系统将123装箱成Integer类型的对象再存入
		al.add("一");//String类对象
		System.out.println(al);//输出时默认调用对象的toString()方法
		System.out.println(al.get(0));//通过get()方法获取值
		Object[] o=al.toArray();//将ArrayList转换为数组
		System.out.println(o[1]);

	}<pre name="code" class="java">//[123, A]
//123
//A
 

(2)LinkedList

LinkedList实现了collection的list接口内容有序,允许重复,底层使用双向链表实现,所以插入删除速度快,存取速度慢。

public static void main(String[] args) {
		List list=new LinkedList();
		list.add("A");
		list.add("B");
		list.add(1, "C");
		System.out.println(list);

	}
//输出[A, C, B]

3)Vector

使用数组实现,是线程同步的。

(1)stack

常用方法:

push():添加元素

pop():删除栈顶元素

peek():获取栈顶元素

empty():判断栈是否为空

Stack<String> stack = new Stack<String>();  


2)Set

Set包括HashSet和TreeSet,元素无序,不允许元素重复。

(1)HashSet

HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。HashSet按hash算法来存储元素,因此具有很好的存取和查找性能。

特点:

1、不能保证元素的排列顺序,顺序有可能发生变化。

2、HashSet是异步的。

3、集合元素值可以是null。

4、当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来确定该对象在HashSet中存储的位置。

	public static void main(String[] args) {
		Set set=new HashSet();
		set.add("A");
		set.add("C");
		set.add("C");
		System.out.println(set);
	}

//输出[A, C]

来源:http://www.cnblogs.com/wyl-study/archive/2012/01/31/2332440.html


(2)TreeSet

使用红黑树存储,TreeSet可以确保集合元素处于排序状态。

public static void main(String[] args) {
		TreeSet set=new TreeSet();
		set.add(1);
		set.add(5);
		set.add(3);
		set.add(9);
		System.out.println(set.first());//输出第一个元素
		System.out.println(set.headSet(5));//输出小于5的元素的集合
		System.out.println(set.tailSet(5));//输出大于等于5的元素的集合
		System.out.println(set.subSet(1, 9));//输出小于9大于等于1的元素的集合
		System.out.println(set);
	}
1
[1, 3]
[5, 9]
[1, 3, 5]
[1, 3, 5, 9]



2.Map

Map用来存储键值对<Key,Value>的元素。映射中不能包含重复的键,每个键最多只能映射一个值。

1)HashMap

继承AbstractMap,HashMap允许空(null)键值(key,非线程安全。

往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

public static void main(String[] args) {
		Map map=new HashMap();
		map.put("1", "A");
		map.put("2", "B");
		map.put("1", "C");
		map.put("", "D");
		System.out.println(map);
		Iterator iter = map.entrySet().iterator();
		while (iter.hasNext()) {
		    Entry entry = (Entry) iter.next();
		    Object key = entry.getKey();
		    Object val = entry.getValue();
		    System.out.println(key+":"+val);
		}
		
	}
输出:
{=D, 2=B, 1=C}
:D
2:B
1:C

来源:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html

2)TreeMap

基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 

3)HashTable

继承Dictionary,是线程同步的,不能接受null值。



题目:

1.HashMap和HashTable的区别?


HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

  1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

要注意的一些重要术语

1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。

2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。

3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。

我们能否让HashMap同步?

HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);

结论

Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。


来源:http://www.importnew.com/7010.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值