• java基础之集合(List,Set,Map)


    集合

    • List和Set接口
    • Map接口

    集合有什么作用?

    Java中有哪几种集合?

     

    在之前我们学习过数组,但是发现数组有两个缺点:

    •          ·数组的大小不能够随意的更改
    •          ·数组中存放的元素必须是相同的数据类型

    集合是一个可以改变大小,可以保存不同对象,没有基本数据类型的存储的概念,在开发中并不建议在同一个集合中存放不同的类型对象。

    集合的划分:Collection是集合最高的父接口,常用的子接口或者实现类有以下几种:

    • List
    • Set
    • Vector
    • 键值对:map

    List接口

    List接口在开发中常用的实现类有两种:

    •          ·ArrayList:是动态数组的数据结构
    •          ·LinkedList:是链表数据结构

    两种实现类操作方法类似:

             ·boolean add(E e):添加元素

             ·void add(int index,  E element):在指定位置添加元素

             ·boolean addAll(Collection<? extends E> c):将一个集合中的所有元素添加到集合

             ·void clear():清除集合中所有的元素

             ·E get(int index):取得指定位置的元素

             ·int indexOf(Object o):查找是否有指定元素存在,存在返回下表,不存在返回-1

             ·Iterator<E> iterator():返回一个迭代器对象

             ·boolean isEmpty():判断集合是否为空

             ·E remove(int index):移除指定位置的元素

             ·boolean remove(Object o):移除指定元素

             ·boolean removeAll(Collection<?> c):从集合中移除一个集合

             ·E set(int index, E element):将指定位置设置为指定元素

             ·int size():返回集合长度

    当然还有一个问题,在开发中,定义集合的时候,最好能够定义泛型,表示此集合只能存放此种类型的对象。

    package com.wanczy.collection;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class CollectionDemo01 {
        public static void main(String[] args) {
            List<Computer> list = new ArrayList<Computer>();//定义泛型合计
    //        Person p1 = new Person("张三");
    //        Person p2 = new Person("李四");
    //        Person p3 = new Person("王五");
    //        Person p4 = new Person("赵六");
            
            Computer c1 = new Computer("I3");
            Computer c2 = new Computer("I3");
            Computer c3 = new Computer("I3");
    //        list.add(p1);
    //        list.add(p2);
    //        list.add(p3);
    //        list.add(p4);
            list.add(c1);
            list.add(c2);
            list.add(c3);
            
        }
    }

    list集合中,是可以存放相同元素的。

     

    List集合的输出:

    •          ·使用for循环
    •          ·使用迭代器
    • 使用增强型for循环
        List<Day03> list = new ArrayList<Day03>();//定义泛型
            Day03 d= new Day03("吴");
            Day03 d1=new Day03("11");
            Day03 d2=new Day03("22");
            list.add(d);
            list.add(d1);
            list.add(d2);
            list.add(d);
            list.add(d1);
            list.add(d2);
            list.add(d);
            list.add(d1);
            list.add(d2);list.add(d);
            list.add(d1);
            list.add(d2);
            /*System.out.println("普通for循环");
            for (int i = 0; i < list.size(); i++) {
                Day03 dd=list.get(i);//取得指定位置的元素
                System.out.print(dd.getNameT()+" ");
            }*/
            System.out.println("增强型for循环");
            for (Day03 dd : list) {
                System.out.print(dd.getNameT()+" ");
            }
            System.out.println("迭代器");
            Iterator< Day03> it = list.iterator();//取得迭代器对象
            while(it.hasNext()){
                Day03 dd = it.next();//取得元素
                System.out.println(dd.getNameT()+" ");
            }

    我们在开发中,优先使用迭代进行集合输出,因为迭代器的效率更高。在开发过程中,还会遇到一个问题,就是判断集合是否存在元素:

                       ·isEmpty()

                       ·size() == 0

    List集合的两个常用的实现类的区别:

    •          ·ArrayList:是实现了基于动态数组的数据结构,对于随机的添加和删除元素来说,需要移动数据
    •          ·LinkedList:对于新增和删除来说,比较占优势,但是对于访问来说,ArrayList比较占优势,因为LinkedList需要链表开头开始。

    SET集合

    在开发中实际上不经常使用,但是我们在JDBC操作数据库的时候,对于查询来说,ResultSet接口是用来接收查询的结果集的,而ResultSet实际上也是一种Set集合。而且在后期我们讲道框架的时候,也是会使用到Set集合的。

    Set 集合的操作基本上List集合是一致的,我们知道List集合常用的两个实现类是ArrayList和LinkedList,那么对于Set集合来说,也有两个常用的实现类:

             ·HashSet

             ·TreeSet

    Set集合和List集合的区别在于,Set集合不允许放置相同的元素,如果有相同元素加入的话,后面加入的会把前面加入的给覆盖。

    通过程序,我们可以发现,除了不能放置重复的元素外,HashSet集合还是散列存储的,也就是说无序存储的。

    对于TreeSet来说,相比HashSet,主要区别就是TreeSet是有序存储的,是升序存储的。

    Set<String> set = new TreeSet<String>();//定义泛型合计
            set.add("b");
            set.add("e");
            set.add("h");
            set.add("d");
            set.add("a");
            set.add("c");
            System.out.println();
            System.out.println("-------------增强型for循环------------------");
            for (String c:set) {
                System.out.print(c+"	");
            }
            System.out.println();
            System.out.println("-------------使用迭代器------------------");
            Iterator<String> it = set.iterator();//取得迭代器对象
            while(it.hasNext()){//判断是否还有元素
                System.out.print(it.next()+"	");
            }
            

    Vector集合

    Vector本身就是一个类,是Collection接口的实现类,是比较早出现的集合,在List集合出现之前就已经出现,而且现在也基本上淘汰了,是一个同步的集合,允许速度相比List集合而言,会比较慢。

    可以得出List和Vector的区别

    序号

    List

    Vector

    1

    异步

    同步

    2

    可以使用Iterator

    使用Enumeration

    3

    出现比较晚,使用较多

    出现比较早,使用较少

    4

    增加元素,长度增加1.5

    增加元素,长度增加2

    Map集合

    我们有一种类似于电话本的存储方式:

              键       值

             张三----133241243

             李四----14321243

             王五----1234214312

    主要功能就是完成查找,而不是作为输出使用,在开发中,键是不能重复的,键的内容一般为字符串类型。Map接口常用的两个实现类:

             ·HashMap:

             ·TreeMap:按照键升序排列

    常用的操作方法:

             ·void clear():清楚所有的键值对

             ·Set<K> keySet():将所有的键放到一个Set集合中

             ·V get(Object key):通过键取得值

             ·boolean isEmpty():判断是否为空

             ·V put(K key, V value):添加元素

             ·V remove(Object key):通过键删除元素

             ·void putAll(Map<? extends K,? extends V> m):将一个Map中所有元素加入

             ·int size():取得Map集合的长度

    基本上常用的操作方法都是基于键的。

    Map<String,String> tel = new HashMap<String,String>();
            tel.put("张三", "12341243");
            tel.put("李四", "243587");
            
            String telS = tel.get("李四");
            
            System.out.println(telS);
            

    我们说过,Map集合的主要的操作是基于键的,而且主要功能是查找,如果说非要对Map集合进行输出呢?

        public static void main(String[] args) {
            Map<String,String> tel = new HashMap<String,String>();
            tel.put("张三", "12341243");
            tel.put("李四", "243587");
            
            String telS = tel.get("李四");//通过键取值
            
            //System.out.println(telS);
            
            Set<String> set = tel.keySet();//转换成Set集合
            Iterator<String> it = set.iterator();
            while(it.hasNext()){
                String s = it.next();
                System.out.println(s + "============" + tel.get(s));
            }
            

    对于TreeSet而言,区别就在于通过键进行了升序排列:

    总结

    ·掌握List接口下常用的ArrayList、LinkList类

     ·掌握Set接口下常用的HashSet类

    ·掌握Map复合类集的用法

  • 相关阅读:
    Scalding初探之番外篇:Mac OS下的安装
    Scalding初探之二:动手来做做小实验
    没有好看的 Terminal 怎么能够快乐地写代码
    Scalding初探之一:基于Scala的Hadoop利器
    Scala初探:新潮的函数式面向对象语言
    【题解】【数组】【Prefix Sums】【Codility】Genomic Range Query
    【题解】【数组】【Prefix Sums】【Codility】Passing Cars
    hibernate基于注解实现映射关系的配置
    decimalFormat
    我对shiro的初步认识
  • 原文地址:https://www.cnblogs.com/wusha/p/7161115.html
Copyright © 2020-2023  润新知