栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

第十四章 集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第十四章 集合

集合的好处

(1)可以动态保存任意多个对象,使用比较简单

(2)提供了一系列方便的操作对象的方法:add、remove、set、get等

(3)使用集合添加,删除新元素的示意代码—简洁明了

集合的分类

(1)集合主要是两类:单列集合,双列集合

(2)Collection接口有两个重要的子接口,List Set,他们的实现子类都是单列集合

(3)Map接口的实现子类 是双列集合,存放K-V

Collection

(1)collection实现子类可以存放多个元素,每个元素可以是Object

(2)有些Collection的实现类,有些事有序的(List),有些是无序的(Set)

(3)Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的

Collection接口遍历元素方式1 --使用Iterator

(1)Iterator对象称为迭代器,主要用于遍历Collection集合中的元素

(2)所有实现了Collection接口的集合类都有一个iterator()方法,用已返回一个实现了一个Iterator接口的对象,即都可以返回一个迭代器

(3)Iterator仅用于遍历集合,本身并不存放数据

public class B {
    public static void main(String[] args){
        Collection col = new ArrayList();
        col.add("三国演义");
        col.add("红楼梦");
        col.add("水浒传");
        Iterator interator = col.iterator();
        while (interator.hasNext()){
            Object next = interator.next();
            System.out.println(next);
        }
        //当退出循环后,iterator指向最后一个元素,如果想要再次遍历,则需重置迭代器
        //iterator = col.iterator
    }
}
list接口

(1)List集合类中元素有序且可重复

(2)List集合中的每个元素都有其对话赢的顺序索引,即支持索引

list接口小方法:

public class B {
    @SuppressWarnings({"all"})
    public static void main(String[] args){
       List list = new ArrayList();
       for (int i = 0; i < 13;i++){
           list.add(i + "真大师");
       }
        System.out.println(list);
       //在第二个位置增加一个元素
        list.add(1,"真正的大师");
        System.out.println(list);
        //获取第四个位置的元素
        System.out.println(list.get(3));
        //删除第五个元素
        System.out.println( list.remove(4));
        System.out.println(list.set(7,"你真好看"));
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }
} 

ArrayList的细节和注意事项:

(1)add方法中,可将null加入集合中,其他同理

(2)ArrayList是由数组来实现数据存储的

(3)ArrayList基本等同于Vector,不过ArrayList是线程不安全的

ArrayList vs Vector

ArrayList vs Vector

底层结构版本线程安全扩容倍数
ArrayList可变数组jdk1.2不安全,效率高如果是无参构造器,第一次分配10,以后每次1.5;如果是有参,则每次扩容1.5
Vector可变数组Objectjdk1.0安全,效率不高如果是无参,默认10,以后按2倍扩容;如果是有参,则每次按2倍扩容

ArrayList VS linkedList

底层结构增删的效率改查的效率
ArrayList可变数组较低,相当于数组扩容较高
linkedList双向链表较高,通过链表追加较低
set接口

基本介绍

(1)无序(添加和取出的顺序不一致),没有索引

(2)不允许重复元素,最多包含一个null

(3)set接口对象不能使用普通for循环遍历,可用增强for循环,或iteator

HashSet:

(1)可以存放null值,但只能有一个null

(2)不保证元素是有序的

(3)不能有重复的元素

(4)实现了Set接口,满足set的要求

HashSet添加元素的步骤

(1)添加一个元素时,先得到hash值,然后会转成-->索引值

(2)找到存储数据表table,看这个索引位置是否已经存放这个元素

(3)如果没有,直接加入

(4)如果有,调用equals比较,如果相同,就放弃添加,若果不相同则添加到最后

(5)如果一条链表的元素个数到达8时,链表会自动进行树化

HashSet扩容机制

(1)第一次添加时,table数组扩容到16,临界值 = 16 * 加载因子,加载因子为0.75

(2)如果table数组使用到了临界值,就会扩容到16 * 2,临界值为32 * 0.75,以此类推

(3)如果一条链表的元素个数到达8,而且table数组的大小>=64,就会由链表变成红黑树

Map接口和常用方法

map接口实现类的特点:

(1)Map与Collection并列存在,用于保存具有映射关系的数据Key - Value

(2)Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node中

(3)Map中的键值不允许重复

(4)Map中的value可以重复

(5)Map的key可以为null,value也可以为null,注意只允许有一个key为null,value可以有多个null

(6)常用String类作为Map的key

(7)key和value之间存在单一向一对一关系,即通过指定的key总能找到对应的value

小练习:

将员工类中工资大于18000的人的信息输出

 

public class B {
    @SuppressWarnings({"all"})
    public static void main(String[] args){
        Map map = new HashMap();
        map.put("no1",new Employee("小红",20000,1));
        map.put("no2",new Employee("小黑",17000,2));
        map.put("no3",new Employee("小黄",18001,3));

        Set keyset1 = map.entrySet();
        Iterator iterator = keyset1.iterator();
        while (iterator.hasNext()) {
            Map.Entry entry =  (Map.Entry)iterator.next();
            Employee em2 = (Employee)entry.getValue();
            if(em2.getSalary() > 18000){
                System.out.println(em2);
            }
        }


        Set keyset = map.keySet();
        for(Object key : keyset){
            Employee em = (Employee)map.get(key);
            if(em.getSalary() > 18000){
                System.out.println(em);
            }
        }

    }
}
class Employee{
    private String name;
    private double salary;
    private int id;

    public Employee(String name, double salary, int id) {
        this.name = name;
        this.salary = salary;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + ''' +
                ", salary=" + salary +
                ", id=" + id +
                '}';
    }
}

Hashtable接口实现类

(1)存放的元素是键值对:即k-v

(2)hashtable的键和值都不能为null,否则会空指针异常

(3)hashTable使用方法基本上和hashMap一样

(4)hashTable是线程安全的

(5)扩容大小为*2+1

实际开发中应该如何选择集合实现类

(1)先判断存储的类型(一组对象【单列】或一组键值对【双列】)

(2)一组对象【单列】:Collection接口

允许重复:List

增删多:linkedList【底层维护了一个双向链表】

改查多:ArrayList

不允许重复:Set:

无序:HashSet【底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)】

插入和取出顺序一致:linkedHashSet,维护数组+双向链表

(3)一组键值对【双列】:Map

键无序:HashMap

键排序:TreeMap

键插入和取出顺序一致:linkedHashMap

读取文件:Properties

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/709961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号