码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合与框架总结与学习

时间:2015-02-16 22:11:33      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:java   list   set   map   

 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka   
      本文将主要讲解Java中集合的使用与区别,主要讲List、Set、Map的原理、使用方法、注意事项等。

一、Collection与Collectons的区别

    Java集合框架是Java语言的重要组成部分,它包含了系统而完整的集合层次体系,封装了大量的数据结构的实现。深刻理解Java集合框架的组成结构及其中的实现类和算法,能极大提高程序员编码的能力。本章讲述Java集合框架,主要包括集合框架的概念、集合框架接口,以及列表、集合、映射三种结构还有迭代方法、比较方法和较早以前版本的类和接口。下面就让我们一起来学习这些内容。
     集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体。集合被用于存储、获取、操纵和传输聚合的数据。Java集合框架提供了有效的数据结构和算法,因此程序员不需要自己编写代码实现这些功能。而且结合框架对各个接口的实现是可以互换的,因此很容易转换接口。这样就提高了软件的复用性。

注意事项:

(1)Collection是集合类的一个顶级接口,其直接继承接口有List与Set

(2)Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

  二、List、Set、Map三大集合区别与说明

         Java平台提供了一个全新的集合框架。集合框架的核心接口为Collection、List(列表)、Set(集合)和Map(映射)。

技术分享
              图1  集合关系图
    从图1中可以看到,Collection是集合继承树中最顶层的接口,几乎所有的Java集合框架成员都继承实现了Collection接口,或者与其有密切关系。Collection提供了关于集合的通用操作。Set接口和List接口都继承了Collection接口,而Map接口没有继承Collection接口。因此,Set对象和List对象都可以调用Collection接口的方法,而Map对象则不可以。
    下面我们对这三种类型接口的结构加以说明:Set有点类似数学中集合的定义,是无序的、没有重复项目的集合。List是位置性集合,加进清单的元素可以加在清单中特定位置或加到末尾,可以保存重复的元素。Map用于关键字/数值对,其中关键字是数值的惟一标识(不可重复),用户可以按关键字存取数据,数据可重复。具体形式如图2所示:
技术分享
 图2 各集合元素存放示例

   (1)Collection:集合层次中的根接口,JDK 没有提供这个接口直接的实现类。

   (2)Set:不能包含重复的元素。

   (3) List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。

   (4)Map:包含了 key-value 对。Map 不能包含重复的 key。


三、List用法总结

3.1 List接口

   List的主要特征使其元素已先行方式存储,集合中允许存放重复对象。List接口主要的实现类包括:

   (1)ArrayList:代表长度可变的数组。允许对元素进行快速的随机访问,但是向ArrayList中插入与删除元素的速度较慢。

   (2)LinkedList :在实现中采用链表数据结构,元素之间是双链接。对顺序访问进行了优化,向List中插入和删除元素的速度较快,随机访问速度则相对较慢,随机访问是指检索位于特定索引位置元素,当需要快速插入和删除时LinkedList成为List中的不二选择。

   (3)Vector :是ArrayList的线程安全版本,性能比ArrayList要低,现在已经很少使用。


3.2  ArrayList用法

3.2.1、ArrayList是个集合

      集合是可以往里面添东西的,用add(E e)方法往里面加(把E都看做Object

      例子:ArrayList类中的addget方法add方法向集合中添加数据,get方法将集合中指定下标位置的数据取出)

     (1)size()方法,返回集合中的元素个数,类似于数组中的length属性

     (2)clear()方法,将集合中的所有元素都给清除

     (3)isEmpty()方法判断集合是否为空,为空返回true

     (4)remove(int index)方法是删除集合中指定位置的元素,清除的原理是你清除了第一个后,后面的元素往前移,第一个变第0个了,原来第三个元素就没啦

     (5)remove(Object ob)remove的重载,一个是根据索引来删除,一个是根据具体对象来删除,比如remove("Hello");

      (6)indexOf(Obejct ob)判断某个元素在索引的第几个位置上。

在数组中查看数组元素个数,用数组的length属性,在集合中查看集合元素个数,用集合的size()方法。


3.2.2、ArrayList使用范例

import java.awt.List;
import java.util.ArrayList;
import java.util.Iterator;
/**
 * @author 林炳文
 * @time 2015/2/5
 * ArrayList用法示例说明
 * 
 */

public class Main {
	public static void main(String[] args) {
		//ArrayList用法示例
		ArrayList<String> m_ArrayList=new ArrayList<String>();
		m_ArrayList.add("Evankaka");
		m_ArrayList.add("林炳文");
		m_ArrayList.add("德德");
		m_ArrayList.add("Evankaka");
		m_ArrayList.add("小红");
		m_ArrayList.set(2,"文炳林");// 将索引位置为2的对象修改
		m_ArrayList.add(3,"秀秀");// 将对象添加到索引位置为3的位置
		
		//ArrayList遍历方法1
		Iterator<String> it_ArrayList = m_ArrayList.iterator();
		System.out.println("ArrayList遍历方法1");
		while (it_ArrayList.hasNext()) {
		System.out.println(it_ArrayList.next());
		}
		
		//ArrayList遍历方法2
		System.out.println("ArrayList遍历方法2");
		for(Object o:m_ArrayList){
			System.out.println(o);
		}
		
		//ArrayList遍历方法2
		System.out.println("ArrayList遍历方法3");
		for(int i = 0; i<m_ArrayList.size(); i++){
			System.out.println(m_ArrayList.get(i));
			}
		//删除元素
		m_ArrayList.remove("Evankaka");
		it_ArrayList = m_ArrayList.iterator();
		System.out.println("ArrayList删除元素后的遍历");
		while (it_ArrayList.hasNext()) {
			String m_String=it_ArrayList.next();
		 if(m_String.equals("秀秀")){
			 it_ArrayList.remove();
		 }else{
		System.out.println(m_String);
		  }
		}
	}	
}

输出结果:

ArrayList遍历方法1
Evankaka
林炳文
文炳林
秀秀
Evankaka
小红
ArrayList遍历方法2
Evankaka
林炳文
文炳林
秀秀
Evankaka
小红
ArrayList遍历方法3
Evankaka
林炳文
文炳林
秀秀
Evankaka
小红
ArrayList删除元素后的遍历
林炳文
文炳林
Evankaka
小红

3.2.3、ArrayList注意

(1)使用Iterator迭代集合过程中,不可修改集合元素,否则会引发异常。并且Iterator只能向后迭代 

(2)如果你想在循环过程中去掉某个元素,只能调用it.remove方法,    不能使用list.remove方法,    否则一定出并发访问的错误.  

3.3  LinkedList用法

        LinkedList类是链表节点各种操作的实现,LinkedList类实现了一个带有头尾引用的通用型双向链表。注意,此实现不是同步的。如果多个线程同时访问列表,而其中至少一个线程从结构上修改了该列表,则它必须保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法来“包装”该列表。最好在创建时完成这一操作,以防止对列表进行意外的不同步访问。


四、set接口

       set集合中多个对象之间没有明显的顺序,set与Collection的结构基本上完全一样,不同在于set不能包含重复元素。Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说主要两个对象用equals方法比较返回true,Set就不会接受这两个对象。 HashSet是Set接口的典型实现,大多数时候使用Set集合就是使用这个类。

4.1   HashSet说明与范例

      HashSet按hash算法来存储集合中的元素,因此具有很好的存储和查找性能。 
      HaseSet具有以下特点: 
     ● 不能保证元素的排列顺序,顺序有可能发生变化 
    ● HashSet不是同步的,如果多个线程访问同一个HashSet,要注意线程安全问题 
    ● 集合元素值可以为null 
      当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该值来决定该对象在HashSet中的存储位置。如果有两个元素通过equals方法比较返回true,但它们的hashCode方法返回值不相等,HashSet将会把它们存储在不同的位置。也就是说HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值也相等。

使用范例:

package com.collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
public class Main
{
    public static void main(String [] args)
    {
       HashSet h=new HashSet();
       h.add("1st");
       h.add("2nd");
       h.add(new Integer(3));
       h.add(new Double(4.0));
       h.add("2nd");            //重复元素,未被添加
       h.add(new Integer(3));      //重复元素,未被添加
       h.add(new Date());
       System.out.println("开始:size="+h.size());
       Iterator it=h.iterator();
       while(it.hasNext())
       {
           Object o=it.next();
           System.out.println(o);
       }
       h.remove("2nd");
       System.out.println("移除元素后:size="+h.size());
       System.out.println(h);
    }
}
结果:

开始:size=5
4.0
1st
3
2nd
Mon Feb 16 20:52:17 CST 2015
移除元素后:size=4
[4.0, 1st, 3, Mon Feb 16 20:52:17 CST 2015]

4.2 TreeSet

       TreeSet描述的是Set的一种变体——可以实现排序等功能的集合,它在将对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成时刻按照“升序”排列。

使用范例:

package com.collection;
import java.util.TreeSet;
import java.util.Iterator;
public class Main
{
    public static void main(String [] args)
    {
       TreeSet ts=new TreeSet();
       ts.add("orange");
       ts.add("apple");
       ts.add("banana");
       ts.add("grape");
       Iterator it=ts.iterator();
       while(it.hasNext())
       {
           String fruit=(String)it.next();
           System.out.println(fruit);
      }
    }
}

结果:

apple
banana
grape
orange

 4.3 Set总结

     (1) HashSet和TreeSet是Set的两个典型实现。HashSet的性能总是比TreeSet好(特别是常用的添加、查询等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保存排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。
      (2)  LinkedHashSet是HashSet的子类,该集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,又因为链表的存在,遍历LinkedHashSet会更快。
     (3)TreeSet是SortedSet接口的实现,TreeSet可以确保集合元素处于排序状态,TreeSet并不是根据元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。     
     (4)EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。
     (5)必须指出的是Set的三个实现类HashSet、TreeSet和EnumSet都是线程不安全的,如果有多条线程同时访问一个Set集合,并有超过一条线程修改了该Set集合,则必须手动保证该Set集合的同步性。通常可以通过Collections工具类的synchronizedSortedSet方法来包装该Set集合。此操作最好在创建时进行。


五 Map接口

待续~


Java集合与框架总结与学习

标签:java   list   set   map   

原文地址:http://blog.csdn.net/evankaka/article/details/43410013

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!