Java集合框架的知识总结

来源:互联网 发布:许昌长葛淘宝招聘网 编辑:程序博客网 时间:2024/05/13 11:36

原文:http://www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html

说明:先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析。

 

1、综述

        所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。(数组既可以保存基本类型的数据也可以保存对象)。

       当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型(参见具体泛型的内容)。

 

    Java的集合类主要由两个接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。

 

image

 

Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List。

 

image

 

Map实现类用于保存具有映射关系的数据(key-value)。

 

Set、List和Map可以看做集合的三大类。

     List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。

     Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。

     Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。

 

对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayListHashMap三个实现类。(并发控制的集合类,以后有空研究下)。

 

2、Collection接口

     Collection接口是List、Set和Queue接口的父接口,同时可以操作这三个接口。

Collection接口定义操作集合元素的具体方法大家可以参考API文档,这里通过一个例子来说明Collection的添加元素、删除元素、返回集合中元素的个数以及清空集合元素的方法。

public class TestCollection{    public static void main(String[] args)     {        Collection c = new ArrayList();        //添加元素        c.add("孙悟空");        //虽然集合里不能放基本类型的值,但Java支持自动装箱        c.add(6);        System.out.println("c集合的元素个数为:" + c.size());            //删除指定元素        c.remove(6);            System.out.println("c集合的元素个数为:" + c.size());        //判断是否包含指定字符串        System.out.println("c集合的是否包含孙悟空字符串:" + c.contains("孙悟空"));        c.add("轻量级J2EE企业应用实战");        System.out.println("c集合的元素:" + c);             Collection books = new HashSet();        books.add("轻量级J2EE企业应用实战");        books.add("Struts2权威指南");        System.out.println("c集合是否完全包含books集合?" + c.containsAll(books));        //用c集合减去books集合里的元素        c.removeAll(books);        System.out.println("c集合的元素:" + c);        //删除c集合里所有元素        c.clear();        System.out.println("c集合的元素:" + c);        //books集合里只剩下c集合里也同时包含的元素        books.retainAll(c);        System.out.println("books集合的元素:" + books);    }}



程序输出结果:

c集合的元素个数为:2 
c集合的元素个数为:1 
c集合的是否包含孙悟空字符串:true 
c集合的元素:[孙悟空, 轻量级J2EE企业应用实战] 
c集合是否完全包含books集合?false 
c集合的元素:[孙悟空] 
c集合的元素:[] 
books集合的元素:[]

 

3、两种遍历集合的方法Iterator接口和foreach循环

    1、Iterator接口

 Iterator也是Java集合框架的成员,主要用于遍历(即迭代访问)Collection集合中的元素,也称为迭代器。

提供的三种方法:

boolean hasNext():返回集合里的下一个元素。

Object next():返回集合里下一个元素。

void remove();删除集合里上一次next方法返回的元素。

 

public class TestIterator {     public static void main(String[] args)     {         //创建一个集合         Collection books = new HashSet();         books.add("轻量级J2EE企业应用实战");         books.add("Struts2权威指南");         books.add("基于J2EE的Ajax宝典");         //获取books集合对应的迭代器         Iterator it = books.iterator();         while(it.hasNext())         {        //未使用泛型,需要强制转换            String book = (String)it.next();             System.out.println(book);             if (book.equals("Struts2权威指南"))             {                 it.remove();            //使用Iterator迭代过程中,不可修改集合元素,下面代码引发异常            //books.remove(book);             }             //对book变量赋值,不会改变集合元素本身              book = "测试字符串";         }         System.out.println(books);     } }


 

程序运行结果:

Struts2权威指南 
基于J2EE的Ajax宝典 
轻量级J2EE企业应用实战 
[基于J2EE的Ajax宝典, 轻量级J2EE企业应用实战]

 

说明:

(1)通过语句“book = "测试字符串"; ”对迭代变量book进行赋值时,当我们再次输出books集合时,集合里的元素没有任何变化。即当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给迭代变量,而是把集合元素的值传给了迭代变量。

(2)当使用Iterator来访问Collection集合元素时,只有通过Iterator的remove方法删除(it.remove();)上一次next方法返回的集合元素才可以给集合中添加元素(book = "测试字符串"; )。否则引发java.util.ConcurrentModificationExcption异常。

 

    2、使用foreach循环遍历集合元素。

格式:for(元素类型 t  元素变量 x : 遍历对象A) {

                     // 程序块

}

说明:

(1)foreach简化了对数组和集合的遍历,如果不希望遍历整个集合,或者在循环内部需要操作下标值就需要使用传统的for循环。

(2)简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。

(3)foreach一般结合泛型使用

实例应用:

public class TestArray {    public static void main(String args[]) {        TestArray test = new TestArray();        test.test1();        test.listToArray();        test.testArray3();    }    /**     * foreach语句输出一维数组     */    public void test1() {        // 定义并初始化一个数组        int arr[] = { 2, 3, 1 };        System.out.println("----1----排序前的一维数组");        for (int x : arr) {            System.out.println(x); // 逐个输出数组元素的值        }        // 对数组排序        Arrays.sort(arr);        // 利用java新特性for each循环输出数组        System.out.println("----1----排序后的一维数组");        for (int x : arr) {            System.out.println(x); // 逐个输出数组元素的值        }    }    /**     * 集合转换为一维数组     */    public void listToArray() {        // 创建List并添加元素        List<String> list = new ArrayList<String>();        list.add("1");        list.add("3");        list.add("4");        // 利用froeach语句输出集合元素        System.out.println("----2----froeach语句输出集合元素");        for (String x : list) {            System.out.println(x);        }        // 将ArrayList转换为数组        Object s[] = list.toArray();        // 利用froeach语句输出集合元素        System.out.println("----2----froeach语句输出集合转换而来的数组元素");        for (Object x : s) {            System.out.println(x.toString()); // 逐个输出数组元素的值        }    }    /**     * foreach输出二维数组测试     */    public void testArray2() {        int arr2[][] = { { 4, 3 }, { 1, 2 } };        System.out.println("----3----foreach输出二维数组测试");        for (int x[] : arr2) {            for (int e : x) {                System.out.println(e); // 逐个输出数组元素的值            }        }    }    /**     * foreach输出三维数组     */    public void testArray3() {        int arr[][][] = { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };        System.out.println("----4----foreach输出三维数组测试");        for (int[][] a2 : arr) {            for (int[] a1 : a2) {                for (int x : a1) {                    System.out.println(x);                }            }        }    }}




程序运行结果:

----1----排序前的一维数组 



----1----排序后的一维数组 



----2----froeach语句输出集合元素 



----2----froeach语句输出集合转换而来的数组元素 



----4----foreach输出三维数组测试 







8

感想:

这篇先写到这里,后续文章将会介绍其余集合接口和类的详细知识。

这是自己写博客的第一篇文章,虽然很多内容都是借鉴高手的,但是从他们的字里行间可以看出他们对技术的痴迷和研究的深入。

我从接触Java到现在也就一年多时间,我深深被Java的一些程序表达方式所吸引。感觉它的语言风格更接近我们自然语言的表述。

在程序中表达自己的思想何尝不是一件畅事。

虽然断断续续的自学了一些Java知识,现在也可以看懂Java的大部分代码,但是要是自己去写出那些高深的代码,感觉还是有些棘手。

听大师说,语言是用来思考的。

要是学会了用Java语言进行思考,那么一定可以小有所成。

现在给自己制定了一个计划,就是从写博客来提高自己学习Java的积极性。

首先是一些基础知识的总结,结合一些实例表明知识的应用。

我想这会持续很久,也是考验自己,提高自己的好机会。

正如我的博客标题,用代码阐释人生的哲学,从代码中领悟人生,看清世事。

祝福每个奋斗在Java中的人们都可以找到最真的自己。

文章中代码和部分内容来源于《疯狂Java讲义》,如需转载,请注明出处。谢谢。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小腿酸痛乏力肌肉萎缩怎么办 搬重物后手臂疼怎么办 和尚鹦鹉吃了盐怎么办 刚买鹦鹉不上手怎么办 word的文件时间改了怎么办 图强gps编码丢失怎么办 武统台湾后岛民怎么办 没有你我怎么办是什么歌 ios 12软件闪退怎么办 来大姨妈想吐怎么办 3岁宝宝体重轻怎么办 硕士延期毕业考上博士怎么办 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办 电脑分辨率调错了怎么办 猎豹sc9打不开门怎么办 苹果手机卡顿反应慢怎么办 金立手机卡顿反应慢怎么办 20天宝宝黄疸219怎么办? 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办 房产权40年以后怎么办 面试回答不了考官的问题怎么办