Java集合框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

2022-08-24学习笔记


一、集合框架的简介

集合框架是一种存储数据的容器;集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

特点:

  • 对象封装数据,对象多了也需要存储。集合用于存储对象。

  • 对象的个数确定可以使用数组,对象的个数不确定的可以用集合。因为集合是可变长度的。

使用集合框架的好处

  1. 容量自增长;
  2. 提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;
  3. 允许不同 API 之间的互操作,API之间可以来回传递集合;
  4. 可以方便地扩展或改写集合,提高代码复用性和可操作性。
  5. 通过使用JDK自带的集合类,可以降低代码维护和学习新API成本

二、List集合

1.概述

List是元素有序并且可以重复的集合。

List的主要实现:ArrayListLinkedList, Vector。

ArrayList基本等同于Vector,ArrayList是线程不安全的,在多线程的情况下不建议用ArrayList。

ArrayList扩容:element在无设置值的时候0→10→1.5倍……

                         有设置值时按1.5倍扩容。

transient表示该属性不会被序列化。

2.List常用方法:

增:add(index,element);//在index的位置添加element,注意索引index要存在,index<=size;

addAll(index,Collection);

删:remove(index);removeAll(Collection);clear();//通过索引删除元素,并将被删除的元素返回;

改:set(index,element);

获取:get(index);subList(fromIndex,toIndex:返回的是两个索引之间的内容);listterator;indexOf(value)---第一次出现"value"的索引位置;lastIndexOf(value)--最后出现"value"的索引位置;size;

判断:isEmpty;contains(Collection);

import java.util.ArrayList;
import java.util.List;

public class Test10 {
    public static void main(String[] args) {
        List list = new ArrayList<>();
        //只有一个内容时默认为元素
        list.add(111);
        list.add(222);
        list.add(333);
        list.add(444);
        list.add(555);
        list.add(666);
        list.add(777);
        list.set(3,"tttt");//更改
        //list.remove(111);此时运行会报错,remove后如果为整数则默认为索引;
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

 LinkedList不会出现扩容的问题;比较适合随机位置增删;因为是基于链表实现,所以在定位查询时效率较低;

ArrayList基于数组实现,当在末尾增加或删除会较为方便,但随即增删是效率较低;同时随即查询数据时会有更好的性能。

3.迭代器的执行原理

Iterator iterator = col.iterator();//先获取一个集合的迭代器!!!!!
//hasNext();判断是否还有下一个元素
while(iterator.hasNext()){
//next();①指针下移②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}

在调用it.next();之前必须要调用hasNext();方法进行检测,如果没有,且下一条记录无效,则会抛出异常。

4.增强for

public class Demo02 {
    public static void main(String[] args) {
        List list = new ArrayList();


        list.add(new Student("张三", 21));
        list.add(new Student("李四", 22));
        list.add(new Student("王五", 23));
        list.add(new Student("小二", 24));
        //增强for底层仍然是迭代器
        //增强for,不仅可以用在集合,也可以直接用在数组
        for (Object Student:list){
            System.out.println(Student);
        }
        //数组
         int[] nums = {1,2,3,4,5}
         for(int i :nums){
         System.out.println(i);
         }
    }
}

三、Set集合

Set集合元素无序(存入和取出的顺序不一定一致),并且没有重复对象。
Set的主要实现类:HashSet, TreeSet。

Set与List方法类似,二者都属于Collection接口,Set与List的区别:

  • List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引,元素可以重复。

  • Set:无序(存入和取出顺序有可能不一致),没有索引不可以存储重复元素。必须保证元素唯一性。

Set接口遍历方式:①迭代器②增强for       注:不能使用索引的方式获取

四、Map接口

键对象和值对象映射,每个元素包含一对键对象和值对象;

Map不继承与Collection接口;常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap;

Map与Collection并列存在,用于保存具有映射关系的数据:Key-Value,key不可以重复,value可以重复;

Map常用方法:

增:put(Object key,Object values);putAll;

删:remove(Object key);clear();

获取:get;size;entrySet;keySet;values;

判断:isEmpty;containsValue;containsKey;

重写:equals;hashCode;用来判断是否相等;

public class Map01 {
    public static void main(String[] args) {
        //双列元素:key-value
        //常用String做key
        //key与value一一对应,通过指定的key总能找到value
        HashMap map = new HashMap();
        map.put("num1","666");//k-v
        map.put("num2","777");
        map.put("no1","tjh");
        map.put("num44","tjh");
        map.put("no1","afafasx");//key不能重复,相同的key会把原来的tjh替换为afafasx
        map.put(null,null);
        map.put(null,"abc");//key和value都可以为null,但是key为null只能有一个,key重复会发生替换
        System.out.println(map);
    }
}

HashMap:基于哈希表实现(数组+链表);

LinkedHashMap:双向链表维护元素的顺序,顺序为插入顺序或者最近最少使用的顺序;

Map接口遍历方法:①containsKey查找键是否存在

                                ②keySet获取所有键

                                ③entrySet获取所有关系

                                ④values获取所有的值

public class MapFor {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("Zzitai","儿姿");
        map.put("Letme","少爷");
        map.put("Krystal","刚子");
        map.put("AmaziJ","御剑蛤蟆");

        //1---------keySet();取出所有的键,通过key取出对应的value
        Set keyset = map.keySet();
        for (Object key : keyset) {
            System.out.println(key+"-----"+map.get(key));
        }
        System.out.println("-------------------------------------");
        //2---------通过迭代器
        Iterator iterator = keyset.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println(key+"-----"+map.get(key));
        }
        //3---------values();取出所有的values
        System.out.println("-------------------------------------");
        Collection values = map.values();
        for (Object obj :values) {
            System.out.println(obj);
        }

        System.out.println("-------------------------------------");
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()) {
            Object next =  iterator1.next();
            System.out.println(next);
        }
        //4----------通过entrySet();获取
        Set set = map.entrySet();//EntrySet<Map.Entry<K,V>>
        for (Object entry : set) {
            //将entry转成Map.Entry
            Map.Entry e = (Map.Entry) entry;//object强转map,之后才能调用map的方法
            System.out.println(e.getKey()+"-------------"+e.getValue());
        }

        //5--------------entrySet迭代器
        System.out.println("-------------------------------------");
        Iterator iterator2 = set.iterator();
        while (iterator2.hasNext()) {
            Object next1 =  iterator2.next();//Node类型
            //向下转型Map.Entry
            Map.Entry m = (Map.Entry) next1;
            System.out.println(m.getKey()+"***"+m.getValue());
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值