zoukankan      html  css  js  c++  java
  • List接口,ArrayList集合,Vector集合,Vector集合(会用即可) , Set接口,哈希表

     List接口

    它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。

    它是一个带有索引的集合通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)

    集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

     

    List接口的常用子类有:

    l  ArrayList集合

    l  LinkedList集合

    1. List接口中常用的方法

    增加元素方法

      add(Object e):向集合末尾处,添加指定的元素

      add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移

    l  删除元素删除

      remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素

      remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素

    l  替换元素方法

      set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素

    l  查询元素方法

      get(int index):获取指定索引处的元素,并返回该元素

    List<String> list = new ArrayList<String>();
    //1,添加元素。
    list.add("小红");
    list.add("小梅");
    list.add("小强");
    //2,插入元素。插入元素前的集合["小红","小梅","小强"]
    list.add(1, "老王"); //插入元素后的集合["小红","老王","小梅","小强"]
    //3,删除元素。
    list.remove(2);// 删除元素后的集合["小红","老王","小强"]
    //4,修改元素。
    list.set(1, "隔壁老王");// 修改元素后的集合["小红","隔壁老王","小强"]
    
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String str = it.next();
        System.out.println(str);
    }
    //由于List集合拥有索引,因此List集合迭代方式除了使用迭代器之外,还可以使用索引进行迭代。
    for (int i = 0; i < list.size(); i++) {
        String str = list.get(i);
        System.out.println(str);            
    }

        Iterator的并发修改异常

    public class IteratorDemo {
    //在list集合迭代元素中,对元素进行判断,一旦条件满足就添加一个新元素
        public static void main(String[] args) {
            //创建List集合
            List<String> list = new ArrayList<String>();
            //给集合中添加元素
            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            list.add("abc4");
            //迭代集合,当有元素为"abc2"时,集合加入新元素"a"
            Iterator<String> it = list.iterator();
            while(it.hasNext()){
                String str = it.next();
                //判断取出的元素是否是"abc2",是就添加一个新元素
                if("abc2".equals(str)){
                    list.add("a");// 该操作会导致程序出错
                }
            }
            //打印容器中的元素
            System.out.println(list);
        }
    }

    并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。

    那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。

       

     List集合存储数据的结构

    数据存储的常用结构有:堆栈、队列、数组、链表。

    堆栈,采用该结构的集合,对元素的存取有如下的特点:

    *  先进后出(即,存进去的元素,要在它后面的元素依次取出后,才能取出该元素)

    *  栈的入口、出口的都是栈的顶端位置

    *  压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

    *  弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

     

    队列,采用该结构的集合,对元素的存取有如下的特点:

    *  先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。

    *队列的入口、出口各占一侧。

     

    数组,采用该结构的集合,对元素的存取有如下的特点:

    *  查找元素快:通过索引,可以快速访问指定位置的元素

    *  增删元素慢:

    *  指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。

    *  指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。

     

    链表采用该结构的集合,对元素的存取有如下的特点:

    *  多个节点之间,通过地址进行连接。

    *  查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

    *  增删元素快:

    *  增加元素:操作如左图,只需要修改连接下个元素的地址即可。

    *  删除元素:操作如右图,只需要修改连接下个元素的地址即可。

     

     ArrayList集合

    ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

     LinkedList集合

    LinkedList集合数据存储的结构是链表结构。

    LinkedList<String> link = new LinkedList<String>();
            //添加元素
            link.addFirst("abc1");
            link.addFirst("abc2");
            link.addFirst("abc3");
            //获取元素
            System.out.println(link.getFirst());
            System.out.println(link.getLast());
            //删除元素
            System.out.println(link.removeFirst());
            System.out.println(link.removeLast());
            
            while(!link.isEmpty()){ //判断集合是否为空
                System.out.println(link.pop()); //弹出集合中的栈顶元素
           }

     Vector集合(会用即可)

    Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。

    Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。

    此接口Enumeration的功能与 Iterator 接口的功能是类似的。

    Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。

    Vector常见的方法:

     

     Enumeration枚举常见的方法

    Vector集合对ArrayList集合使用的对比

     Set接口

    通过元素的equals方法,来判断是否为重复元素

    此类实现Set接口,由哈希表支持(实际上是一个 HashMap集合)。

    HashSet集合不能保证的迭代顺序与元素存储顺序相同。

    HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。

     HashSet集合存储数据的结构(哈希表)

    创建HashSet集合,存储String对象

    public class HashSetDemo {
        public static void main(String[] args) {
            //创建HashSet对象
            HashSet<String> hs = new HashSet<String>();
            //给集合中添加自定义对象
            hs.add("zhangsan");
            hs.add("lisi");
            hs.add("wangwu");
            hs.add("zhangsan");
            //取出集合中的每个元素
            Iterator<String> it = hs.iterator();
            while(it.hasNext()){
                String s = it.next();
                System.out.println(s);
            }
        }
    }

    输出结果如下,说明集合中不能存储重复元素:

    wangwu

    lisi

    zhangsan

     HashSet存储自定义类型元素

    给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

    创建一个Student类

    public class Student {
        private String name;
        private int age;
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if(!(obj instanceof Student)){
                System.out.println("类型错误");
                return false;
            }
            Student other = (Student) obj;
            return this.age ==  other.age && this.name.equals(other.name);
        }
    }

    创建HashSet集合,存储Student对象。

    public class HashSetDemo {
        public static void main(String[] args) {
            //创建HashSet对象
            HashSet hs = new HashSet();
            //给集合中添加自定义对象
            hs.add(new Student("zhangsan",21));
            hs.add(new Student("lisi",22));
            hs.add(new Student("wangwu",23));
            hs.add(new Student("zhangsan",21));
            //取出集合中的每个元素
            Iterator it = hs.iterator();
            while(it.hasNext()){
                Student s = (Student)it.next();
                System.out.println(s);
            }
        }
    }

    输出结果如下,说明集合中不能存储重复元素:

    Student [name=lisi, age=22]

    Student [name=zhangsan, age=21]

    Student [name=wangwu, age=23]

     LinkedHashSet介绍

    在HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。

       

    public class LinkedHashSetDemo {
        public static void main(String[] args) {
            Set<String> set = new LinkedHashSet<String>();
            set.add("bbb");
            set.add("aaa");
            set.add("abc");
            set.add("bbc");
    Iterator it = set.iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }
        }
    }

    输出结果如下,LinkedHashSet集合保证元素的存入和取出的顺序:

    bbb

    aaa

    abc

    bbc

     

     

  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/111wdh/p/13300281.html
Copyright © 2011-2022 走看看