集合概述

◆如果现在要想保存多个对象,肯定使用对象数组完成,但是对象数组本身有一个最大的问题在于其数据的长度,所以后来使用了链表完成了动态对象数组的开发,可是链表的开发难度实在是很大,而且如果一个链表要想真正去使用,只依靠之前所编写的还不够,还需要进行一些代码的调优。
而JDK1.2之后正式引入了类集的概念,类集是一种动态的对象数组,属于各个数据结构的实现类,在整个类集之中主要的组成是一些核心的操作接口:Collection、List、Set、Map、Iterator.
image.png

Collection

Collection(单值保存的最大父接口)
所谓的单值保存指的是每一次操作只会保存一个对象,就好像之前的链表程序一样,每一次只保存了一个对象,在 Collection接口之中定义了如下的一些操作方法。
image.png

List

List(允许重复的子接口)
List是 Collection的一个最为常用的子接口,首先这个接口的定义如下:

  1. public interface List<E> extends Collection<E>

image.png

ArrayList

ArrayList是List子接口使用最多的一个子类,而这个类的定义如下:

  1. public class ArrayList<E>
  2. extends abstractlist<E>
  3. implements List<E>, RandomAccess, Cloneable, Serializable

使用 ArrayList进行List接口的功能验证

  1. public static void main(String[] args) throws Exception {
  2. //ArrayList<String> all = new ArrayList<String>();也可以这样写
  3. List<String> all = new ArrayList<String>();
  4. all.add("Hello");
  5. all.add("He11o");//内容重复了
  6. all.add("World");
  7. for (int x = 0; x < all.size(); x++) {
  8. String str = all.get(x);// get()方法只有List接口有
  9. System.out.print(str + ",");
  10. }
  11. ArrayList<Integer> integers = new ArrayList<>();
  12. ArrayList<Integer> integers2 = new ArrayList<Integer>();
  13. integers.add(1);
  14. integers.add(2);
  15. integers.add(3);
  16. for (int i=0;i<integers.size();i++){
  17. int n = integers.get(i);
  18. System.out.println(n);
  19. }
  20. }

在使用代码的时候可以发现,List集合之中即使存在了重复数据,也可以正常的保存,而且数据保存的顺序就是存入数据的顺序。
eg:

  1. public interface Animal {
  2. public String getName() ;
  3. public int getAge();
  4. }
  1. public class Dog implements Animal {
  2. private String name ;
  3. private int age ;
  4. public Dog(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. @Override
  9. public String getName() {
  10. return name;
  11. }
  12. @Override
  13. public int getAge() {
  14. return age;
  15. }
  16. @Override
  17. public boolean equals(Object obj) {
  18. if (this == obj) {
  19. return true ;
  20. }
  21. if (obj == null) {
  22. return false ;
  23. }
  24. if (!(obj instanceof Dog)) {
  25. return false ;
  26. }
  27. Dog dog = (Dog) obj ;
  28. if (this.name.equals(dog.name)
  29. && this.age == dog.age) {
  30. return true ;
  31. }
  32. return false ;
  33. }
  34. @Override
  35. public String toString() {
  36. return "〖狗的信息〗名字:" + this.name + ",年龄:" + this.age ;
  37. }
  38. }
  1. public class Tiger implements Animal {
  2. private String name ;
  3. private int age ;
  4. public Tiger(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. @Override
  9. public String getName() {
  10. return name;
  11. }
  12. @Override
  13. public int getAge() {
  14. return age;
  15. }
  16. @Override
  17. public boolean equals(Object obj) {
  18. if (this == obj) {
  19. return true ;
  20. }
  21. if (obj == null) {
  22. return false ;
  23. }
  24. if (!(obj instanceof Tiger)) {
  25. return false ;
  26. }
  27. Tiger t = (Tiger) obj ;
  28. if (this.name.equals(t.name)
  29. && this.age == t.age) {
  30. return true ;
  31. }
  32. return false ;
  33. }
  34. @Override
  35. public String toString() {
  36. return "〖老虎的信息〗名字:" + this.name + ",年龄:" + this.age ;
  37. }
  38. }
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Zoo {
  4. private List<Animal> animals = new ArrayList<Animal>(); //多个动物
  5. public void add(Animal ani) { // 增加动物
  6. this.animals.add(ani) ; // 增加动物,this可以省略
  7. }
  8. public void delete(Animal ani) {
  9. this.animals.remove(ani) ; // 需要equals()
  10. }
  11. public List<Animal> search(String keyWord) {
  12. List<Animal> result = new ArrayList<Animal>() ;
  13. for (int x = 0 ; x < this.animals.size() ; x ++) {
  14. Animal ani = this.animals.get(x) ;
  15. if (ani.getName().contains(keyWord)) { // 满足
  16. result.add(ani) ;}
  17. }
  18. return result ;
  19. }
  20. }
  1. public class Main {
  2. public static void main(String[] args) {
  3. Zoo zoo = new Zoo() ; // 动物园
  4. zoo.add(new Dog("花狗",1)) ;
  5. zoo.add(new Dog("黄狗",1)) ;
  6. zoo.add(new Dog("黑狗",1)) ;
  7. zoo.add(new Dog("斑点狗",1)) ;
  8. zoo.add(new Tiger("斑点虎",2)) ;
  9. zoo.add(new Tiger("黑虎",2)) ;
  10. zoo.add(new Tiger("花虎",2)) ;
  11. zoo.delete(new Dog("斑点狗",1)) ; // 删除
  12. List<Animal> result = zoo.search("斑点") ;
  13. for (int x = 0 ; x < result.size() ; x ++) {
  14. System.out.println(result.get(x)) ;
  15. }
  16. }
  17. }

Set

Set是元素无序并且不可以重复的集合,被称为集
HashSet-哈希集,是Set的一个重要实现类
常用方法也是
1.add addAll
3.size
4.remove
5.removeAll

由于是无序的,所以没有get,set的方法

set接口的实现类,HashSet

  1. Set<String> all = new HashSet<String>();
  2. HashSet<String> all2= new HashSet<String>();
  3. all.add("Hello");
  4. all.add("Hello");//内容重复了,不会被添加进去
  5. all.add("World");
  6. System.out.println(all);

Iterator-集合的输出

  1. Set<String> all = new HashSet<String>();
  2. HashSet<String> all2= new HashSet<String>();
  3. all.add("Hello");
  4. all.add("Hello");//内容重复了,不会被添加进去
  5. all.add("World");
  6. //遍历
  7. //获取迭代器
  8. Iterator<String> iter = all.iterator();
  9. //循环
  10. while (iter.hasNext()){//判断是否有下一个元素
  11. String str = iter.next();
  12. System.out.println(str+"、");
  13. }

Map

Map和HashMap

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找 value
Map中的键值对以 Entry类型的对象实例形式存在
键(key值)不可重复,vaue值可以
image.png
Map支持泛型,Map
Map中常用方法,put(key,value)、putA添加元素,get(key)获取元素,remove(key)删除

使用迭代器遍历Map

方法一:

  1. public static void main(String[] args) throws Exception {
  2. Map<Integer,String> map = new HashMap<Integer,String>();
  3. map.put(3,"张三");
  4. map.put(null,"无名氏");
  5. map.put(3,"李四");//key重复,value会被新内容覆盖
  6. map.put(1,"王五");
  7. map.put(0,"赵六");
  8. Set< Integer> set=map.keySet();//取得全部的key
  9. Iterator<Integer>iter = set.iterator();
  10. while(iter.hasNext()) {
  11. Integer key = iter.next();
  12. System.out.println(key + "-->" + map.get(key));
  13. }
  14. }

方法二:
image.png

  1. public static void main(String[] args) throws Exception {
  2. Map<Integer,String> map = new HashMap<Integer,String>();
  3. map.put(3,"张三");
  4. map.put(null,"无名氏");
  5. map.put(3,"李四");//key重复,value会被新内容覆盖
  6. map.put(1,"王五");
  7. map.put(0,"赵六");
  8. Set< Map.Entry<Integer,String>> set=map.entrySet();
  9. Iterator<Map.Entry<Integer,String>> iter = set.iterator();
  10. while(iter.hasNext()){
  11. Map.Entry<Integer,String> me = iter.next();
  12. System.out.println(me.getKey()+","+me.getValue());
  13. }
  14. }

Map和 Collection作用

Collection接口设置完的内容目的是为了输出;
Map接口设置完内容的目的是为了查找。

  1. public static void main(String[] args) throws Exception {
  2. List<String> all = new ArrayList<String>();
  3. Collections.addAll(all,"A","B","C");//把A,B,C都添加到集合all中
  4. System.out.println(all);
  5. Collections.reverse(all);//逆序
  6. System.out.println(all);
  7. }