IE盒子

搜索
查看: 113|回复: 0

java集合-韩顺平课程笔记

[复制链接]

4

主题

9

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-2-10 18:16:21 | 显示全部楼层 |阅读模式


来自网络

一、为何需要集合?

原来的数组不能够满足需求,存在以下问题:
1)长度开始时必须指定,而且一旦指定,不能更改
2)保存的必须为同一类型的元素
3)使用数组进行增加/删除元素时(扩容时)比较麻烦
二、集合的好处
1)可以动态保存任意多个对象,使用比较方便!
2)提供了一系列方便的操作对象的方法:add、remove、set、get等
3)使用集合添加,删除新元素的示意代码-简洁了




List&Set,他们的实现子类都是单列集合,用add添加元素



Map接口的实现子类是双列集合,存放的K-V,用put添加元素

//1.集合主要是两组(单列集合,双列集合)
//2. Collection 接口有两个重要的子接口 List Set,他们的实现子类都是单列集合
//3. Map接口的实现子类是双列集合,存放的K-V
代码示例
                ArrayList al=new ArrayList();
                al.add("andy");
                al.add("boy");
               
                HashMap hm=new HashMap();
                hm.put("andy", 15);
                hm.put("boy", 18);-------------------------------------------------分割线---------------------------------------------
Collection接口和常用方法

public interface Collection<E> extends Iterable<E>
Collection接口实现类的特点
1)collection实现子类可以存放多个元素,每个元素可以是Object
2)有些Collection的实现类,可以存放重复的元素,有些不可以
3)有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
4) Collection接口没有直接的实现子类,是通过它的子接口Set 和 List 来实现的



//演示Collection接口中存在的方法,需要用其实现类演示。说明:以ArrayList实现类来演示
public class CollectionMethods {
        public static void main(String[] args) {               
                List list=new ArrayList();
                //add :添加单个元素       
                list.add("andy");
                list.add(16);
                list.add(true);
                System.out.println("list="+list);//list=[andy, 16, true]
                //remove:删除指定元素               
                String str=(String)list.remove(0);//按下标删除元素,删除了"andy"
                System.out.println(str);               
                list.remove(true);               
                System.out.println("list="+list);
                //contains:查找元素是否存在       
                list.add("first");
                System.out.println(list.contains("first"));//true
                //size:获取元素个数       
                System.out.println(list.size());//2
                //isEmpty:判断是否为空       
                System.out.println(list.isEmpty());//false
                //clear:清空       
//                list.clear();
//                System.out.println("list="+list);
                //addAll:添加多个元素               
                List myList=new ArrayList();
                myList.add("apple");
                myList.add("google");
                myList.add("pdd");
                list.addAll(myList);
                System.out.println("list="+list);//list=[16, first, apple, google, pdd]
                //containsALl:查找多个元素是否都存在
                System.out.println(list.containsAll(myList));//true
                //removeAll:删除多个元素
                list.removeAll(myList);
                System.out.println("list="+list);//list=[16, first]

                Iterator iterator=list.iterator();
                while(iterator.hasNext()) {
                        System.out.println(iterator.next());//逐个元素遍历
                }
        }
}
迭代器遍历

因为Collection接口继承了Iterable接口,而该接口中存在迭代器实例,Iterator,在遍历实现了Collection接口的集合类元素时,可以获取该迭代器。


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


                Iterator iterator=list.iterator();
                while(iterator.hasNext()) {
                        System.out.println(iterator.next());//逐个元素遍历
                }增强for循环底层是调用迭代器,是一种简化写法:
                //增强for循环,可以用到集合上,底层仍然是迭代器
                //增强for循环可以理解成简化版的迭代器
                for(Object book:arrayList) {
                        System.out.println("book="+book);
                }
                //增强for循环也可以用在打印数组元素上
                int[] arr={1,2,3,4,5};
                for(int i:arr) {
                        System.out.println(i);
                }迭代器遍历集合元素的方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectioonIterator {
        public static void main(String[] args) {
                Collection arrayList = new ArrayList();
                arrayList.add(new Book("三国", "罗贯中", 23.4));
                arrayList.add(new Book("水浒", "施耐庵", 20.4));
                arrayList.add(new Book("西游记", "吴承恩", 21.4));
                arrayList.add(new Book("石头记", "曹雪芹", 22.4));               
                System.out.println("集合:"+arrayList);//会打印集合中三个元素的地址,而不是值               
                Iterator iterator=arrayList.iterator();
                while(iterator.hasNext()) {
                        System.out.println(iterator.next());
                }
                //增强for循环,可以用到集合上,底层仍然是迭代器
                //增强for循环可以理解成简化版的迭代器
                for(Object book:arrayList) {
                        System.out.println("book="+book);
                }
                //增强for循环也可以用在打印数组元素上
                int[] arr={1,2,3,4,5};
                for(int i:arr) {
                        System.out.println(i);
                }               
        }
}

class Book{
        private String name;
        private String author;
        private double price;               
        public Book(String name, String author, double price) {
                this.name = name;
                this.author = author;
                this.price = price;
   }
        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 double getPrice() {
                return price;
        }
        public void setPrice(double price) {
                this.price = price;
        }       
        @Override
        public String toString() {
                return "书名:"+name+"作者:"+author+"价格:"+price;
        }       
}----------------------------------------------分割线----------------------------------------------------
上面是Collection接口的方法,是List和Set的共有方法,下面分别介绍List和Set的特有方法。



List

List集合类(Vector(已过时、线程安全集合)、ArrayList、LinkedList)中元素有序,即添加顺序和取出顺序一致,且可以重复。
public class ListDemo {
        public static void main(String[] args) {
                List list=new ArrayList();
                list.add("andy");
                list.add("boy");
                list.add("cat");
                list.add("dog");
                System.out.println("结果:"+list);//和添加顺序一致,结果:[andy, boy, cat, dog]
                //list集合中的每个元素都有其对应的顺序索引,索引从0开始
                System.out.println(list.get(3));//dog                       
        }
}


代码示例:
import java.util.List;
import java.util.ArrayList;

public class ListDemo {
        public static void main(String[] args) {
                List list=new ArrayList();
                list.add("andy");
                list.add("boy");
                list.add("cat");
                list.add("dog");
                System.out.println("结果:"+list);//和添加顺序一致,结果:[andy, boy, cat, dog]
                //list集合中的每个元素都有其对应的顺序索引,索引从0开始
                System.out.println(list.get(3));//dog               
                //如果没有指定下标,默认插入在最后
                list.add(1,"zoom");//
                System.out.println("结果:"+list);
               
                List list2=new ArrayList();
                list2.add("apple");
                list2.add("ibm");
                list2.add("ebay");
                list2.addAll(list2);//如果没有指定下标,默认插入在最后
                System.out.println("结果:"+list);
               
                List list3=new ArrayList();
                list3.add("mask");
                list3.add("pony");
                list3.add("robin");
                list.addAll(1,list3);//在指定下标添加一个集合的元素
                System.out.println("结果:"+list);               
                System.out.println(list.get(3));               
                System.out.println(list.remove(4));//删除指定下标的元素并返回
                list.set(0, "mary");//替换下标元素,下标需要存在,否则报错
                System.out.println("结果:"+list);
                List sub =list.subList(0, 3);
                System.out.println("结果:"+sub);
        }
}List接口实现类的遍历方式


ArrayList的底层结构和源码分析

(1)可以存放null
(2)底层用数组实现存储,类似于“数据结构之动态泛型数组”中的那样,链接
渔舟唱晚:数据结构之动态泛型数组(java实现)
(3)ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高).在多线程情况下,不建议使用ArrayList,可以考虑使用Vector
ArrayList的源码分析



Vector介绍



Vector和ArrayList的底层区别



LinkedList的介绍

LinkedList的全面说明
1)LinkedList底层实现了双向链表和双端队列特点
2)可以添加任意元素(元素可以重复),包括null
3)线程不安全,没有实现同步


LinkedList源码分析

ArrayList和LinkedList比较


---------------------------分割线----------------------------
Set接口介绍

(1)无序(添加元素和取出的顺序不一致,但每次打印出的结果是固定的,虽然和添加顺序不一致),不能通过索引取数据
(2)集合中不存在重复元素,所以最多包含一个null
(3)JDK API中Set接口的实现类有:HashSet、TreeSet、LinkedHashSet


常用方法


代码演示


常用方法:


--------------------------------------------------分割线-------------------------------------
HashSet介绍




------------------------------------------------------------分割线------------------------------------
LinkedHashSet介绍



未完待续。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表