Java——容器类(集合类)

在编程的过程中,多数据的存储及应用都是比较麻烦的事,以前我就只知道用数组和自己写封装类来解决,但是这两种方法在一些功能中并不适用,比如我们要根据数据库中其中一个表的数据弄一个下拉菜单的内容,这个时候我们需要从数据库获取显示给用户看的内容及对应的id。在这种情况中,因为在数据库中的这种一对的数据一般都是有好几个的,所以封装类并不适用,而数组只能存储单一的一种数据类型,并且只能通过游标获取对应的值,还有最麻烦的是数组在初始化的时候必须初始化长度,所以也数组也不太适用,这个时候我们可以使用java官方提供的容器类集合类)。

  容器类集合类)是java官方提供给我们的存储方式,它扩展了数组使用上的自由度,如:长度可变,可存储多种数据类型的数据等。容器类在java体系中并不仅仅是一个类,而是很多的容器类所构成的一个框架、体系,不同的容器类具有不同的存储方式,因为容器类太多,所以java官方制定了一系列接口,所有的容器类都得已实现。

  常用的容器类大致可分为三大类:List、Set、Map

  首先介绍一下List:

  List是有顺序的,其中常用的主要有Vector、ArrayList、LinkedList三个容器类List的主要使用方法如下:

  

        //ArrayList ls=new ArrayList();
        //更多情况是如下定义
        List ls=new ArrayList();

        //问题: 为什么要这样定义?
        //某些情况下面,可能需要切换实现类
        //LinkedList ls=new LinkedList();//改变太大,如果,下面有人调用到List接口没有方法
        //List ls=new LinkedList();//不管换什么实现类,都没问题,因为接口没变

        //-----------------------------------------------------------------------------------

        //List 可以存放任意类型的数据
        //其实,所有类都是Object类的子类,存入的时候,将所有类型都打散成为Object
        //因此,拿出来的时候,肯定需要转换
        String a="a";
        int i=10;
        double d=1000.0;

        ls.add(a);
        ls.add(i);
        ls.add(d);

        //有顺序,可以根据元素的索引/游标访问元素
        String a2=(String)ls.get(0);
        //int i2=(int)ls.get(1);//int 是基本数据类型,不是封装类,没法直接转换
        int i2=(Integer)ls.get(1);
        double d2=(Double)ls.get(2);

        //如果是jdk1.5以上,可以使用泛型
        //泛型:限制只能存储某一类型
        List<String> ls2=new ArrayList<String>();
        ls2.add("a");
        ls2.add("b");
        ls2.add("c");

        String s=ls2.get(0);//无须再转换

        //-----------------------------------------------------------------------------------

        //你接到一个别人发过来的List,如何取出里面所有数据
        for(int j=0;j<ls2.size();j++){
            System.out.println(ls2.get(j));
        }

        //或者转换成迭代器遍历出来
        Iterator it=ls2.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        } 

  而在上面提到的三个常用的List容器类中,ArrayList和Vector都是使用数组方式存储数据,这两个容器类都是通过使用数组实现的,所以索引数据速度快,但是由于插入数据时涉及数组元素移动内存操作,所以插入数据速度较慢,而由于Vector中的方法都是线程安全的,即所有方法都添加了同步锁synchronized,所以性能上要比ArrayList要差。

  LinkedList是使用双向链表实现存储的,在索引数据时需要进行向前或向后的遍历,但是在插入数据时只需记录本项的前后项即可,所以其索引数据慢插入数据快

   Set是无序的,其中是不能包含重复元素的,其中常用的主要有:HashSet、TreeSetSet的主要使用方法如下:

  

     Set hs=new HashSet();//不能插入重复数据
        //List hs = new ArrayList();//可以插入重复数据

        Student s=new Student(1,"zhangsan");
        hs.add(s);
        s.name="edit";

        boolean isAdded = hs.add(s); //重复数据,不能再插入
        System.out.println(isAdded); //false

        hs.add(new Student(2,"lisi"));
        hs.add(new Student(3,"wangwu"));
        hs.add(new Student(1,"zhangsan"));//这不是重复数据,是一个新的对象 

        //-----------------------------------------------------------------------------------

        //无顺序,只能迭代取值,顺序会有不一定的情况。
        Iterator it=hs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        } 

  HashSet是无顺序的,而TreeSet是有顺序的,但是TreeSet的顺序与List那样按插入的先后排序不同,它是按照元素对象自己定义的排序规则进行排序的,因此前者允许放入null,且效率较高,而后者不允许放入null,且效率较低。

  Map是以键值对的方式存储数据的一种容器类,其中常用的主要有:HashMap、HashTable、TreeMapMap的主要使用方法如下:

  

       HashMap hm=new HashMap();
        //HashMap<String,String> hm=new HashMap<String,String>();  

        String a="a";
        int i=10;
        double d=1000.0;
        //put(键,值)
        hm.put("zfc",a);
        hm.put("zx",i);
        hm.put(3,d);
        //hm.put(3,12.0);    //key相同,覆盖已有value

        String a2=(String)hm.get("zfc");
        int i2=(Integer)hm.get("zx");
        double d2=(Double)hm.get(3);
        System.out.println(a2+"  "+i2+"  "+d2);

        //遍历方式1:建议方式,效率高一些
        Iterator iterator = hm.keySet().iterator();//Iterator迭代器,按key来迭代遍历
        while(iterator.hasNext()) {
            System.out.println(hm.get(iterator.next()));
        }

        //遍历方式2
        Iterator it = hm.entrySet().iterator();//Iterator迭代器,按entry来迭代遍历
        while(it.hasNext()){
            java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
            // entry.getKey() 返回与此项对应的键
            // entry.getValue() 返回与此项对应的值
            System.out.println(entry.getValue());
        } 

  HashMap允许有空键(null)与空值(null),非线程安全,效率较高。

  HashTable不允许有空键(null)与空值(null),线程安全,效率较低。

  TreeMap能把其保存的记录根据key排序(类似TreeSet),默认是按照key的默认排序,但也可指定排序的比较器,在用迭代器迭代遍历时,得到的记录是排序以后的,TreeMap不允许有空键(null)但可以有空值(null)。

时间: 2024-10-12 17:09:25

Java——容器类(集合类)的相关文章

【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别. 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashSet.ArrayList,因为分不清楚它们之间的关系,所以在使用时经常会混淆,以至于不知道从何下手.在这儿作了一个小例

Java容器类的深入理解

Java容器类包含List.ArrayList.Vector及map.HashTable.HashMap ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的.因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap. Collection ├List       接口 │├LinkedList      

java容器类---概述

1.容器类关系图 虚线框表示接口. 实线框表示实体类. 粗线框表示最经常使用的实体类. 点线的箭头表示实现了这个接口. 实线箭头表示类能够制造箭头所指的那个类的对象. Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). 从上图中能够看出,集合

java容器类总结

java容器类只有两个主要类型:Collection和Map. Collection容器每个槽只有一个元素. Map中持有键值对关联. Collection子接口有List和Set. List:以特定次序存储元素.之类有ArrayList和LinkedList ArrayList:擅长随机访问. LinkedList:擅长插入.删除和移动元素. Vector:同步,安全,性能较低.其余基本和ArrayList一样. Set:不含重复元素. HashSet:使用散列函数. TreeSet:使用红黑

Java:集合类的区别详解

Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可变 List: 有顺序的,元素可以重复 遍历:for .迭代 排序:Comparable Comparator Collections.sort() ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的Lis

Java容器类基础

Java容器类基础 Java实用类库提供了一套相当完善的容器类,基本类型为List,Set,Map,Queue.它们都有一些特性,例如Set对于每一个值都只保存一个对象,Map允许你将对象和对象关联起来.此外,Java容器类都可以自动调节尺寸.因此,与数组不同,你可以放置任意数量的对象到容器中而不用担心容器应该设置为多大. Java容器类有4个接口,它们分别上面提到过的List,Set,Map,Queue:在理想情况下,你编写的代码大多数情况是在和这些接口打交道,并且你唯一需要指定所要使用精确类

Java容器类概述

1.简介 容器是一种在一个单元里处理一组复杂元素的对象.使用集合框架理论上能够减少编程工作量,提高程序的速度和质量,毕竟类库帮我们实现的集合在一定程度上时最优的.在Java中通过java.util为用户实现了一个Collection Framework,这个集合框架用统一的架构来表示和操作所有的集合,具体包含以下内容: interface:表示集合的抽象数据类型,它将容器的具体实现与提供的接口分离: implement:表示集合接口的具体实现: algorithms:对集合中的元素提供的一些泛型

Java容器类接口的选择

我们知道Java容器类实际提供了四类接口:Map,List,Set和Queue,如下图所示,每种接口都有不止一个版本的实现,如果在实际编写程序时需要使用某种接口时该如何选择. 从Oracle的Java Language Best Practices 中的说明可以看到建议不要在新程序中使用HashTable,Vector,Stack使用HashMap,ArrayList和LinkedList来替换. ArrayList和LinkedList都实现了List接口,当ArrayList底层由数组实现,

java容器类的继承结构

摘要: java容器类的继承结构 Java容器类库定义了两个不同概念的容器,Collection和Map Collection 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素.Set不能有重复元素.Queue按照排队规则来确定对象产生的顺序. (文中Jdk源码版本无特殊说明均为jdk1.8.0_101) public interface Collection<E> extends Iterable<E> { 可以看到,java定义了Collec

Java容器类类库基本概念详解

  Java容器类类库的用途是"保存对象",并将其划分为两个不同的概念: Collection.一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,而Set不能有重复元素.Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同). Map.一组成对的"键值对"对象,允许你使用键来查找值.ArrayList允许你使用数字来查找值,因此在某种意义上讲,他将数字与对象关联在了一起.映射表允许我们使用另一个对象来查找某个对象