集合(未完结)

集合的理解和好处(出自韩顺平老师视频,变学边做的笔记)

(1)可以动态保存任意多个对象,使用比较方便!
(2)提供了一系列方便的操作对象的方法:add、remove、set、get等
(3)使用集合添加、删除新元素的示意代码

集合的框架体系 (最好背下来)

集合主要是两组(单列集合 , 双列集合)

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

集合(未完结)
Map 接口的实现子类 是双列集合,存放的 K-V(键值对)
集合(未完结)

Collection接口和常用方法

Collection 接口常用方法,以实现子类ArraryList来演示

package com.hspedu.collection_;

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

public class CollectionMethod {
    public static void main(String[] args) {
        List list = new ArrayList();
        //  add: 添加单个元素
        list.add("jack");
        list.add(10); //这里add都是对象了   list.add(new Integer(10))
        list.add(true);
        System.out.println("list="+list);

        //  remove:删除指定元素   这里的remove经过重载,可以指定下标删除  也可以指定元素删除
        //list.remove(0); 删除第一个元素
        list.remove(true);//指定删除某个元素
        System.out.println("list=" + list);

        //contains: 查找元素是否存在
        System.out.println(list.contains("jack"));

        //size:获取元素个数
        System.out.println(list.size());

        //isEmpty: 判断是否为空
        System.out.println(list.isEmpty());

        //clear: 清空
        list.clear();
        System.out.println("list="+list);

        // addAll: 添加多个元素   实则就是添加一个collection的集合
        List list2 = new ArrayList();
        list2.add("红楼梦");
        list2.add("三国演义");
        list.addAll(list2);
        System.out.println("list="+list);

        //containsAll: 查找多个元素是否都存在
        System.out.println(list.containsAll(list2));

        //removeAll: 删除多个元素
        list.add("聊斋");
        list.removeAll(list2);
        System.out.println("list=" + list);


    }
}

collection接口遍历元素方式1-使用literator(迭代器)

(1)Iterator对象成为迭代器,主要用于遍历Collection集合中的元素
(2)所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,既可以返回一个迭代器。
(3)Iterator 仅用于遍历集合,Iterator本身并不存放对象

迭代器的执行原理

Iterator iterator = coll.iterator(); //得到一个集合的迭代器
//hasNext() 判断是否还有下一个元素
while(iterator.hasNext()){
//next()作用: 1.下移 2.将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}

package com.hspedu.collection_;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionIterator {
    public static void main(String args[]){
        Collection col = new ArrayList();

        col.add( new Book("三国演义","罗贯中",10) );
        col.add( new Book("小李飞刀","古龙",5) );
        col.add( new Book("红楼梦","曹雪芹",34) );

        //System.out.println("col="+col);

        //遍历 col集合
        //1. 先得到 col 对应的 迭代器
        Iterator iterator = col.iterator();

        //2. 使用while循环遍历
        while(iterator.hasNext()){
            //返回下一个元素就是 Object  需要记得的是 编译类型是Object 但运行类型是你上面自己输入的类型  也就是Book类型
            Object obj = iterator.next();
            System.out.println("obj="+obj);
        }

        //3.当退出while循环后,这时iterator迭代器,指向最后的元素
        //iterator.next(); // 这时还往下走,会抛出NoSuchElementException
        //4.如果希望再次遍历,需要重置我们的迭代器
        iterator = col.iterator();
        System.out.println("====第二次遍历====");
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);

        }

        //然后这边有个iterator遍历的快捷键 itit      while => itit
        //显示所有的快捷键   ctrl + j




    }
}

class Book{
    String name;
    String author;
    int year;

    public Book(String name, String author, int year) {
        this.name = name;
        this.author = author;
        this.year = year;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    @Override    //该对象的输出形式
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", year=" + year +
                '}';
    }
}

collection接口遍历元素方式2-增强for循环

增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组

  • 基本语法
    for(元素类型 元素吗 : 集合名或数组名){
    访问元素
    }

1.使用增强 for,在Collection集合
2.增强for, 底层仍然是迭代器(可以用断点一步一步看)
3.增强for可以理解成就是简化版本的 迭代器遍历
4.快捷键方式 I

for (Object book : col){
System.out.println(“book=” + o)
}

List接口和常用方法

package com.hspedu.list_;

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

public class ListMethod {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("张三丰");
        list.add("贾宝玉");

        //void add(int index, Object ele):在index位置插入ele元素
        //在index = 1 的位置插入一个对象
        list.add(1,"韩顺平");
        System.out.println("list="+list);

        //boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
        List list2 = new ArrayList();
        list2.add("jack");
        list2.add("tom");

        list.addAll(1,list2);
        System.out.println("list="+list);

        //Object get(int index):获取指定index位置的元素    之前有讲过

        //int indexOf(Object obj):返回obj在集合中首次出现的位置
        System.out.println(list.indexOf("tom"));

        //int lastIndexOf(Objec obj):返回obj在当前集合中末次出现的位置
        //Object remove(int index): 移除指定index位置的元素,并返回此元素
        System.out.println(list.remove(0));
        System.out.println(list);

        //Object set(int index, Object ele):设置指定index位置的元素为ele,相当于是替换
        list.set(0,"陈荣哲");
        System.out.println(list);

        //List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
        System.out.println(list.subList(0,2));

    }
}

ArrayList底层结构和源码分析

(1)ArraryList中维护了一个Obejct类型的数组elementData.//存储的值是放在elementData数组的
transient Object[] elementData; //transient 表示瞬间,短暂的,表示该属性不会被序列化
(2)当创建ArraryList对象时,如果使用的时无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍
(3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍

让我们通过这段代码进入ArrayList的底层一起去看看吧

package com.hspedu.list_;

import java.util.ArrayList;

public class ArrayListSource {
    public static void main(String[] args) {

        ArrayList list = new ArrayList();
        for(int i = 1; i <= 10; i++){
            list.add(i);
        }
        for(int i=11;i<=15;i++){
            list.add(i);
        }
        list.add(100);
        list.add(200);
        list.add(null);

    }
}

集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)

LinkedList底层结构

(1)LinkedList底层维护了一个双向链表
(2)LinkedList中维护了两个属性first和last分别指向 首节点和尾节点
(3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表
(4)所有LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。

LinkedList的底层代码刨析(add添加值)
集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)
集合(未完结)
LinkedList的底层代码刨析(remove)
集合(未完结)
集合(未完结)
集合(未完结)

集合(未完结)

Set接口基本介绍

(1)无序 (添加和取出的顺序不一致),没有索引
(2)不允许重复元素,所以最多包含一个null

Set接口和常用方法

和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样

同Collection的遍历方式一样

Set接口实现类-HashSet

HashSet的全面说明
(1)HashSet实现了Set接口
(2)HashSet实际上是HashMap

public HashSet(){
      map = new HashMap<>();
}

(3)可以存放null值,但是只能有一个null
(4)HashSet不保证元素是有序的,取决于hash后,再确定索引的结果。
(5)不能有重复元素/对象。在前面Set 接口使用已经讲过
集合(未完结)
集合(未完结)

Map

集合(未完结)

Map接口和常用方法

put 添加
remove 根据键删除映射关系
get 根据键获取值
size 获取元素个数
isEmpty:判断个数是否为0
clear:清楚
containsKey:查找键是否存在
集合(未完结)

遍历 与之前的collection 类似

集合(未完结)

上一篇:【java细节】for循环,for-each(增强for循环),forEach以及Iterator迭代器对比


下一篇:2021-12-1 set 、multiset 深度探索