Java <集合> 万字保姆级
目录
ListIterator(extends iterator)列表迭代器介绍
TreeSet集合(implements Set)(间接实现)
TreeSet集合比较器排序示例(实现Comparator)
导语
作为一名非科班出身的无基础java初学者。我会在这里记录我的学习过程及心得分享,希望会对你们想要入行的小伙伴有所帮助,多一个参考的点。
其次希望我的分享能对同样是初学者的你能有所帮助。
同时我也想以此激励自己学习,如果有志同道合的小伙伴就最好啦。大家一起进步!
最后,若您有自己的想法或者觉得我的讲述有问题,需要补充或改正的,欢迎在下方留言互相讨论!!
引言
伟大的成绩和辛勤劳动是成正比例的,有一分劳动就有一分收获,日积月累,从少到多,奇迹就可以创造出来。——鲁迅
我知道,潮汐有升有落,也知道,幸福不能永远停留。可是当它满满呈现面前的时候,我惟一该做的事,就是安静地坐下来,观察它,享受它和感激它。生命的用途并不在长短而在于我们将会怎样利用它。许多人活的日子并不多,却活了很长久。——蒙田
集合是Java中非常重要的内容,大家一定要打起十二分的精神学习,坚持就是胜利!——yueseck(某不知名博主)
集合概述
集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。Java集合类是Java将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。
集合体系结构(Java中)
常用集合体系(本文讲解)
Collection集合
Collection集合概述
♣ 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 ♣ JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
Collection集合基本使用示例
public class CollectionDemo01 { public static void main(String[] args) { //创建Collection集合的对象 Collection<String> c = new ArrayList<String>(); //添加元素:boolean add(E e) c.add("hello"); c.add("world"); c.add("java"); //输出集合对象 System.out.println(c); } }
Collection集合常用方法
方法名 说明 boolean add(E e) 添加元素 boolean remove(Object o) 从集合中移除指定的元素 void clear() 清空集合中的元素 boolean contains(Object o) 判断集合中是否存在指定的元素 boolean isEmpty() 判断集合是否为空 int size() 集合的长度,也就是集合中元素的个数
Collection集合的遍历
Iterator迭代器的介绍
♣迭代器,集合的专用遍历方式
♣Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
♣迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的
迭代器常用方法
方法 说明 E next() 返回迭代中的下一个元素 boolean hasNext() 如果迭代中有下一个元素,则返回(true)
Collection集合的遍历示例
public class IteratorDemo { public static void main(String[] args) { //创建集合对象 Collection<String> c = new ArrayList<>(); //添加元素 c.add("hello"); c.add("world"); c.add("java"); c.add("javaee"); //Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到 Iterator<String> it = c.iterator(); //用while循环改进元素的判断和获取 while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
List集合(extends Collection)
List集合概述
♣有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过 整数索引访问元素,并搜索列表中的元素
♣与Set集合不同,列表通常允许重复的元素
List集合特点
♣有索引
♣可以存储重复元素
♣元素存取有序
List集合的特有方法
方法名 说明 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 删除指定索引处的元素,返回被删除的元素 E set(int index,E element) 修改指定索引处的元素,返回被修改的元素 E get(int index) 返回指定索引处的元素
List集合的遍历
迭代器遍历示例
public class IteratorDemo { public static void main(String[] args) { //创建集合对象 List<String> c = new ArrayList<>(); //添加元素 c.add("hello"); c.add("world"); c.add("java"); c.add("javaee"); //迭代器方式遍历 Iterator<String> it = c.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
for循环遍历示例
public class IteratorDemo { public static void main(String[] args) { //创建集合对象 Collection<String> c = new ArrayList<>(); //添加元素 c.add("hello"); c.add("world"); c.add("java"); c.add("javaee"); //for循环方式 for(int i=0; i<list.size(); i++) { Student s = list.get(i); System.out.println(s.getName() + "," + s.getAge()); } } }
List集合特有迭代器
ListIterator(extends iterator)列表迭代器介绍
♣通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
♣用于允许程序员沿任一方向遍历的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
列表迭代器特有方法
方法名 说明 E previous() 返回迭代中的上一个元素 boolean hasPrevious() 如果迭代中有上一个元素,则返回(true) void add(E e) 将指定的元素插入列表的末尾
ArrayList集合(implements List)
ArrayList集合特点
♣底层数据机构是数组
♣查询快
♣增删慢
♣线程不安全
ArrayList集合常用方法
方法名 说明 boolean add(E e) 将指定的元素追加到此集合的末尾 void add(int index,E element) 在此集合中的指定位置插入元素 boolean remove(Object o) 删除指定元素,返回删除是否成功 E remove(int index) 删除指定索引处的元素,返回被删除的元素 E set(int index,E element) 修改指定索引出的元素,返回被修改的元素 E get(int index) 返回指定索引出的元素 public int size() 返回集合中元素的个数
LinkedList集合(implements List)
LinkedList集合特点
♣底层数据结构是链表
♣查询慢
♣增删快
♣线程不安全
LinkedList特有方法
方法名 说明 void addFirst(E e) 将元素添加到表头 void addLast(E e) 将元素添加到表尾 E getFirst() 返回表头元素 E getLast() 返回表尾元素 E removeFirst() 移除表头元素,返回被移除的元素 E removeLast() 移除表尾元素,返回被移除的元素
Set集合(extends Collection)
Set集合概述
♣无序集合,用户无法精准的控制各个元素
♣与List集合不同,Set集合不允许重复元素
Set集合特点
♣元素存取无序
♣没有索引、只能通过迭代器或增强for循环遍历
♣不能存储重复元素
Set集合常用方法
♦Set集合继承Collection接口,同Collection集合常用方法,这里不做赘述
Set集合的遍历
Set集合的遍历示例
public class IteratorDemo { public static void main(String[] args) { //创建集合对象 Set<String> c = new HashSet<>(); //添加元素 c.add("hello"); c.add("world"); c.add("java"); c.add("javaee"); //迭代器方式遍历 Iterator<String> it = c.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
Hashset集合(implements Set)
HashSet集合特点
♣底层数据结构是哈希表,而哈希表又由(数组+链表)实现
♣对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
♣没有带索引的方法,所以不能使用普通for循环遍历
♣由于是Set集合,所以是不包含重复元素的集合
HashSet集合常用方法
♦HasSet集合实现了Set接口,同Set接口常用方法,这里不做赘述。(Set接口又继承Collection接口,即HashSet集合常用方法同Collection集合常用方法)。
HashSet集合如何保证元素不重复
哈希值
♣哈希值简介:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
♣如何获取哈希值:Object类中的public int hashCode():返回对象的哈希码值
♣哈希值特点:同一个对象多次调用hashCode()方法返回的哈希值是相同的
HashSet集合保证元素唯一性的原理
1.根据对象的哈希值计算存储位置
♣如果当前位置没有元素则直接存入
♣如果当前位置有元素存在,则进入第二步
2.当前元素的元素和已经存在的元素比较哈希值
♣如果哈希值不同,则将当前元素进行存储
♣如果哈希值相同,则进入第三步
3.通过equals()方法比较两个元素的内容
♣如果内容不相同,则将当前元素进行存储
♣如果内容相同,则不存储当前元素
HashSet保证元素唯一性的图解
TreeSet集合(implements Set)(间接实现)
TreeSet集合特点
♣元素有序,可以按照一定的规则进行排序,具体排序方式取决于构造方法
♦(无参构造器)TreeSet():根据其元素的自然排序进行排序
♦(带参构造器)TreeSet(Comparator comparator): 根据指定的比较器进行排序
♣没有带索引的方法,所以不能使用普通for循环遍历
♣由于是Set集合,所以不包含重复元素的集合
TreeSet集合自然排序示例(实现Compareble)
学生类
public class Student implements Comparable<Student> { private String name; private int age; public Student() { } public Student(String name, int age) { 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 int compareTo(Student s) { //return 0; 元素相同 //return 1(正数); 升序 //return -1(负数); 降序 //按照年龄从小到大排序 //升序 int num = this.age - s.age; //降序 int num = s.age - this.age; int num = this.age - s.age; //年龄相同时,按照姓名的字母顺序排序 int num2 = num==0?this.name.compareTo(s.name):num; return num2; } }
测试类
public class TreeSetDemo02 { public static void main(String[] args) { //创建集合对象 TreeSet<Student> ts = new TreeSet<Student>(); //创建学生对象 Student s1 = new Student("xishi", 29); Student s2 = new Student("wangzhaojun", 28); Student s3 = new Student("diaochan", 30); Student s4 = new Student("yangyuhuan", 33); Student s5 = new Student("linqingxia",33); Student s6 = new Student("linqingxia",33); //把学生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); //遍历集合 for (Student s : ts) { System.out.println(s.getName() + "," + s.getAge()); } } }
输出结果(先根据年龄升序,年龄相同再根据姓名字母顺序排序)
wangzhaojun,28
xishi,29
diaochan,30
linqingxia,33
yangyuhuan,33
TreeSet集合比较器排序示例(实现Comparator)
学生类
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { 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; } }
测试类
public class TreeSetDemo { public static void main(String[] args) { //创建集合对象 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //this.age - s.age //s1,s2 int num = s1.getAge() - s2.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; return num2; } }); //创建学生对象 Student s1 = new Student("xishi", 29); Student s2 = new Student("wangzhaojun", 28); Student s3 = new Student("diaochan", 30); Student s4 = new Student("yangyuhuan", 33); Student s5 = new Student("linqingxia",33); Student s6 = new Student("linqingxia",33); //把学生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); //遍历集合 for (Student s : ts) { System.out.println(s.getName() + "," + s.getAge()); } } }
输出结果(先根据年龄升序,年龄相同再根据姓名字母顺序排序)
wangzhaojun,28
xishi,29
diaochan,30
linqingxia,33
yangyuhuan,33
Map集合
Map集合概述
interface Map<K,V> K:键的类型;V:值的类型
Map集合特点
♣键值对映射关系
♣一个键对应一个值
♣键不能重复,值可以重复
♣元素存取无序
Map集合的基本功能
方法名 说明 V put(K key,V value) 添加元素 V remove(Object key) 根据键删除键值对元素 void clear() 移除所有的键值对元素 boolean containsKey(Object key) 判断集合是否包含指定的键 boolean containsValue(Object value) 判断集合是否包含指定的值 boolean isEmpty() 判断集合是否为空 int size() 集合的长度,也就是集合中键值对的个数
Map集合的基本功能示例
public class MapDemo02 { public static void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String,String>(); //V put(K key,V value):添加元素 map.put("张无忌","赵敏"); map.put("郭靖","黄蓉"); map.put("杨过","小龙女"); //V remove(Object key):根据键删除键值对元素 // System.out.println(map.remove("郭靖")); // System.out.println(map.remove("郭襄")); //void clear():移除所有的键值对元素 // map.clear(); //boolean containsKey(Object key):判断集合是否包含指定的键 // System.out.println(map.containsKey("郭靖")); // System.out.println(map.containsKey("郭襄")); //boolean isEmpty():判断集合是否为空 // System.out.println(map.isEmpty()); //int size():集合的长度,也就是集合中键值对的个数 System.out.println(map.size()); //输出集合对象 System.out.println(map); } }
Map集合的获取功能
方法名 说明 V get(Object key) 根据键获取值 Set<K> keySet() 获取所有键的集合 Collection<V> values() 获取所有值的集合 Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
Map集合的获取功能示例
public class MapDemo03 { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("张无忌", "赵敏"); map.put("郭靖", "黄蓉"); map.put("杨过", "小龙女"); //V get(Object key):根据键获取值 // System.out.println(map.get("张无忌")); // System.out.println(map.get("张三丰")); //Set<K> keySet():获取所有键的集合 // Set<String> keySet = map.keySet(); // for(String key : keySet) { // System.out.println(key); // } //Collection<V> values():获取所有值的集合 Collection<String> values = map.values(); for(String value : values) { System.out.println(value); } } }
Map集合的遍历
第一种遍历方式(通过keySet()方法)
步骤分析
获取所有键的集合。用keySet()方法实现
遍历键的集合,获取到每一个键。用增强for实现
根据键去找值。用get(Object key)方法实现
代码示例
public class MapDemo01 { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("张无忌", "赵敏"); map.put("郭靖", "黄蓉"); map.put("杨过", "小龙女"); //获取所有键的集合。用keySet()方法实现 Set<String> keySet = map.keySet(); //遍历键的集合,获取到每一个键。用增强for实现 for (String key : keySet) { //根据键去找值。用get(Object key)方法实现 String value = map.get(key); System.out.println(key + "," + value); } } }
第二种遍历方式(通过entrySet()方法)
步骤分析
获取所有键值对对象的集合。Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
遍历键值对对象的集合,得到每一个键值对对象。用增强for实现
根据键值对对象获取键和值。用getKey()得到键,用getValue()得到值
代码实现:
public class MapDemo02 { public static void main(String[] args) { //创建集合对象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("张无忌", "赵敏"); map.put("郭靖", "黄蓉"); map.put("杨过", "小龙女"); //获取所有键值对对象的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍历键值对对象的集合,得到每一个键值对对象 for (Map.Entry<String, String> me : entrySet) { //根据键值对对象获取键和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); } } }
综合应用
集合嵌套之HashMap嵌套ArrayList
案例需求
♣创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键是 String,值是ArrayList
♣每一个ArrayList的元素是String,并遍历。
代码实现
public class HashMapIncludeArrayListDemo { public static void main(String[] args) { //创建HashMap集合 HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>(); //创建ArrayList集合,并添加元素 ArrayList<String> sgyy = new ArrayList<String>(); sgyy.add("诸葛亮"); sgyy.add("赵云"); //把ArrayList作为元素添加到HashMap集合 hm.put("三国演义",sgyy); ArrayList<String> xyj = new ArrayList<String>(); xyj.add("唐僧"); xyj.add("孙悟空"); //把ArrayList作为元素添加到HashMap集合 hm.put("西游记",xyj); ArrayList<String> shz = new ArrayList<String>(); shz.add("武松"); shz.add("鲁智深"); //把ArrayList作为元素添加到HashMap集合 hm.put("水浒传",shz); //遍历HashMap集合 Set<String> keySet = hm.keySet(); for(String key : keySet) { System.out.println(key); ArrayList<String> value = hm.get(key); for(String s : value) { System.out.println("t" + s); } } } }
集合嵌套之ArrayList嵌套HashMap
案例需求
♣创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap
♣每一个HashMap的键和值都是String,并遍历。
代码实现
public class ArrayListIncludeHashMapDemo { public static void main(String[] args) { //创建ArrayList集合 ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>(); //创建HashMap集合,并添加键值对元素 HashMap<String, String> hm1 = new HashMap<String, String>(); hm1.put("孙策", "大乔"); hm1.put("周瑜", "小乔"); //把HashMap作为元素添加到ArrayList集合 array.add(hm1); HashMap<String, String> hm2 = new HashMap<String, String>(); hm2.put("郭靖", "黄蓉"); hm2.put("杨过", "小龙女"); //把HashMap作为元素添加到ArrayList集合 array.add(hm2); HashMap<String, String> hm3 = new HashMap<String, String>(); hm3.put("令狐冲", "任盈盈"); hm3.put("林平之", "岳灵珊"); //把HashMap作为元素添加到ArrayList集合 array.add(hm3); //遍历ArrayList集合 for (HashMap<String, String> hm : array) { Set<String> keySet = hm.keySet(); for (String key : keySet) { String value = hm.get(key); System.out.println(key + "," + value); } } } }