14_集合框架

百知教育 - 孙帅 - 14_集合框架

01_集合的概念

  • 集合:
    是一种工具类,是对象的容器,可以用于存储数量不等的多个对象的对象,代替数组
  • 所有集合的接口和相关实现类都在java.util包
  • 底层结构:
    数组
  • 代码:
    package day15;
    import java.util.Arrays;
    public class TestMyList{
     public static void main(String[] args){
      MyList list = new MyList();
      list.add("ABC");
      list.add("XYZ");
      list.add("123");
      list.add("AAA");
      
      System.out.println(list.get(0));
      
      for(int i = 0; i < list.size(); i++){
       System.out.println(list.get(i));
      }
     }
    }
    class MyList{
     private Object[] os = new Object[10];
     private int index;  //记录数组中真正存储了几个元素
     
     public void add(Object o){
      if(index == os.length){
       os = Arrays.copyOf(os, os.length*2);
      }
      os[index] = o;
      index++;
     }
     
     public void add(int pos, Object o){
      //xxxxxxxx
     }
     public int size(){
      return index;
     }
     public Object get(int i){
      return os[i];
     }
    }
  • 运行结果:
    在这里插入图片描述

02_Collection

  • 概念:
    Collection接口List接口Set接口父接口
  • 特点:
    元素是Object
  • 常用方法:
    1. add(Object) 把元素添加到集合中
    2. addAll(Collection c) 把c集合中的所有元素添加到集合中
    3. clear() 清空集合
    4. contains(Object o) 判断o元素在集合中是否存在
    5. remove(Object o) 从集合中删除元素o
    6. size() 返回集合的长度
    7. toArray() 将集合转化为数组
    8. isEmpty() 判断集合是否为空
  • List特点
    • 元素按顺序存储(下标)
    • 元素 可以重复
  • Set特点
    • 元素无顺序
    • 元素内容 不可重复

03_List常用方法

  • add(int pos, Object o) 将元素插入到指定位置

  • remove(int pos) 删除指定位置的元素

  • get(int pos) 获得指定位置的元素

  • indexOf(Object o) 获得o元素的首下标

  • lastIndexOf(Object o) 获得o元素的尾下标

  • set(int pos, Object o) 将o元素设置到pos位置,覆盖原有的元素

  • subList(int start, int end) 获得某段位置的子集合(包含start,不包含end)

  • 代码:
    package day15;
    import java.util.*;
    public class TestList{
     public static void main(String[] args){
      List list = new ArrayList();
      list.add("YKY");
      list.add("LYH");
      list.add("HHH");
      list.add("ZYK");
      list.add("YXM");
      list.add("WKY");
      list.add("YKY");
      System.out.println(list.size());
      System.out.println(list.indexOf("YKY"));
      System.out.println(list.lastIndexOf("YKY"));
      list.remove(0);
      System.out.println(list.get(0));
     }
     
     static Object[] findAllDogs(Object[] as){
      List list = new ArrayList();
      for(int i = 0; i < list.size(); i++){
       if(as[i] instanceof Dog){
        list.add(as[i]);
       }
      }
      return list.toArray();
     }
    }
    class Animal{}
    class Dog extends Animal{}
    class Cat extends Animal{}
  • 运行结果:

    在这里插入图片描述

04_List的遍历

  • 遍历
    1. 下标遍历
    2. 迭代器遍历
  • 代码
    package day15;
    import java.util.*;
    public class TestIterator{
     public static void main(String[] args){
      List list = new ArrayList();
      list.add("YKY");
      list.add("LYH");
      list.add("HHH");
      list.add("ZYK");
      list.add("YXM");
      list.add("WKY");
      list.add("YKY");
      
      print1(list);
      System.out.println();
      print2(list);
     }
     static void print1(List list){
      for(int i = 0; i < list.size(); i++){
       Object o = list.get(i);
       String s = (String)o;
       if("ZYK".equals(s)){
        list.remove(i);
        continue;
       }
       System.out.println(s.toUpperCase());
      }
     }
     static void print2(Collection con){
      Iterator it = con.iterator();  
      while(it.hasNext()){
       String s = (String)it.next();
       if("ZYK".equals(s)){
        it.remove();
       }
       System.out.println(s.toUpperCase());
      }
     }
    }
  • 运行结果:
    在这里插入图片描述

05_在JDK5中的集合遍历

  • for-each遍历特点:
    遍历时不能对原集合进行更改
  • for-each遍历代码:
    static void print3(Collection con){
    	for(Object o : con){
    		String s = (String)o;
    		System.out.println(s.toUpperCase());
    	}
    }	

06_JDK8中的集合遍历

  • forEach()方法特点:
    需要实现 java.util.function.Consumer接口
  • forEach()遍历代码:
    package day15;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.function.Consumer;
    public class TestConsumerAccept{
     public static void main(String[] args){
      List list = new ArrayList();
      list.add("YKY");
      list.add("LYH");
      list.add("HHH");
      list.add("ZYK");
      list.add("YXM");
      list.add("WKY");
      list.add("YKY");
      
      print4(list);
      System.out.println();
      print5(list);
     }
     static void print4(Collection con){
      con.forEach(new Consumer(){
       public void accept(Object o){
        String s = (String)o;
        System.out.println(s.toUpperCase());
       }
      });
     }
     /*  from Collection
     public void forEach(Consumer c){
      Iterator it = this.iterator();
      while(it.hasNext()){
       Object o = it.next();
       c.accept(o);
      }
     }
     */
     static void print5(Collection con){
      con.forEach(System.out::println);  
     }
    }
  • 运行结果:
    在这里插入图片描述

07_List的实现类

  • ArrayList特点:
    数组实现、查询快、增删慢、线程不安全、并发效率高、JDK1.2推出
  • Vector特点:
    数组实现、查询快、增删慢、线程安全、并发效率低、JDK1.0推出
  • LinkedList特点:
    链表实现、查询慢、增删快
  • ArrayList代码:
    package day15;
    import java.util.LinkedList;
    public class TestLinkedList{
     public static void main(String[] args){
      LinkedList list = new LinkedList();
      list.add("YKY");
      list.add("LYH");
      list.add("HHH");
      list.add("YXM");
      list.add("ZYK");
      list.addFirst("WKY");
      list.removeLast();
      
      for(Object o : list){
       System.out.println(o);
      }
     }
    }
  • 运行结果:
    在这里插入图片描述

08_集合中的泛型 < E >

  • 泛型技术来源:
    JDK5
  • 作用:
    约束 集合元素的类型
  • 代码:
    package day16;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Iterator;
    import java.util.function.Consumer;
    public class TestGenerics1{
     public static void main(String[] args){
      List<String> list = new ArrayList<String>();
      list.add("YKY");
      list.add("LYH");
      list.add("HHH");
      list.add("YXM");
      list.add("ZYK");
      
      for(int i = 0; i < list.size(); i++){
       String s = list.get(i);
       System.out.println(s.toUpperCase());
      }
      System.out.println();
      
      Iterator<String> it = list.iterator();
      while(it.hasNext()){
       String s = it.next();
       System.out.println(s.toUpperCase());
      }
      System.out.println();
      
      for(String s : list){
       System.out.println(s.toUpperCase());
      }
      System.out.println();
      
      list.forEach(new Consumer<String>(){
       public void accept(String s){
        System.out.println(s.toUpperCase());
       }
      });
      System.out.println();
      
      list.forEach(System.out::println);
     }
    }
  • 运行结果:
    在这里插入图片描述

09_泛型的多态

  • 泛型的特点
    • 只在编译时有泛型,运行时没泛型
    • 泛型没有多态,赋值语句前后泛型必须保持一致
  • 语法(JDK7):
    List list = new ArrayList<>();
  • 代码:
    package day16;
    import java.util.List;
    import java.util.ArrayList;
    public class TestGenerics2{
     public static void main(String[] args){
      //List<Animal> list1 = new ArrayList<Animal>();
      List<Animal> list1 = new ArrayList<>();
      //List<Dog> list2 = new ArrayList<Dog>();
      List<Dog> list2 = new ArrayList<>();
      
      System.out.println(list1.getClass() == list2.getClass());
      
      //list1.add(new Cat());
     }
    }
    class Animal{}
    class Dog extends Animal{}
    class Cat extends Animal{}
  • 运行结果:
    在这里插入图片描述

10_泛型的通配符

  • 方法参数的泛型定义:
    通配符 <?>
  • 用法:
    • <?> 任何类型
    • <? extends A> A或A的任何子类(A可以是类也可以是接口)
    • <? super A> A或A的父类
  • 代码(编译通过):
    package day16;
    import java.util.ArrayList;
    import java.util.List;
    public class TestGenerics3{
     public static void main(String[] args){
      List<Object> l1 = new ArrayList<>();
      List<String> l2 = new ArrayList<>();  //implements Comparable
      List<Number> l3 = new ArrayList<>();
      List<Integer> l4 = new ArrayList<>();  //extends Number implements Comparable
      List<Double> l5 = new ArrayList<>();  //extends Number implements Comparable
      List<Comparable> l6 = new ArrayList<>();  
      print(l1);
      //print(l2);
      print(l3);
      //print(l4);
      //print(l5);
      //print(l6);
     }
     /*和下面的方法不能同时出现,只有泛型不同的两个方法不算重载,因为运行时没有泛型。
     static void print(List<? extends Number> list){
      for(int i = 0; i < list.size(); i++){
       Number n = list.get(i);
      }
     }
     */
     static void print(List<? super Number> list){
      for(int i = 0; i < list.size(); i++){
       Object o = list.get(i);
      }
     }
    }

11_泛型方法

  • < T >使用方法
    • T可以替换为任何标识符,通常写一个大写字母
    • 泛型定义在修饰符之后,返回值类型之前
    • < T extends A >: T为A或A的子类
    • < T extends A & B >: T为A或A的子类,同时实现B接口
    • 其他用法
      • static <T, s> void m(T t, S s){}
      • static <T, S extends T> void m2(T t, S s){}
  • 代码1(编译通过):
    package day16;
    import java.util.ArrayList;
    import java.util.List;
    public class TestGenerics4{
     public static void main(String[] args){
      List<Object> l1 = new ArrayList<>();
      List<String> l2 = new ArrayList<>();  //implements Comparable
      List<Number> l3 = new ArrayList<>();
      List<Integer> l4 = new ArrayList<>();  //extends Number implements Comparable
      List<Double> l5 = new ArrayList<>();  //extends Number implements Comparable
      List<Comparable> l6 = new ArrayList<>();  
      
      //copy(new Object[]{}, l1);
      //copy(new String[]{}, l2);
      //copy(new Number[]{}, l3);
      copy(new Integer[]{}, l4);
      copy(new Double[]{}, l5);
      //copy(new Comparable[]{}, l6);
     }
     
     static <T extends Number & Comparable> void copy(T[] os, List<T> list){
      for(T o : os){
       list.add(o);
      }
     }
    }
  • 代码2:
    package day16;
    import java.util.ArrayList;
    import java.util.List;
    public class TestGetAllDogs{
     public static void main(String[] args){
      
     }
     static Dog[] findAllDogs(Animal[] as){
      List<Dog> result = new ArrayList<>();
      for(Animal a : as){
       if(a instanceof Dog){
        Dog d = (Dog)a;
        result.add(d);
       }
      }
      //result --> Dog[]
      return result.toArray(new Dog[]{});
     }
    }

12_泛型类

  • 代码(编译通过):
    package day16;
    public class TestGenerics5{
     public static void main(String[] args){
      MyClass<String> m1 = new MyClass<>();
      
      MyClass<Integer> m2 = new MyClass<>();
      
     }
    }
    class MyClass <T>{
     public void method1(T t){}
     public T method2(){
      return null;
     }
    }
    /*
    class MyArrayList <T>{
     private T[] os;
     private int index;
     public void add(T t){
     }
     public T get(int pos){
      return os[pos];
     }
    }
    MyArrayList<String> m1 = new MyArrayList<>();
    m1.add("abc");
    String s = m1.get(0);
    */
    interface A{
     void m(String s);
    }
    interface B{
     void m(Integer i);
    }
    interface I<T>{
     void m(T t);
    }
    interface N<T>{
     T m();
    }
    class c1 implements I<String>{
     public void m(String s){}
    }
    class c2 implements I<Integer>{
     public void m(Integer i){}
    }
    class c3 implements N<String>{
     public String m(){
      return "helloword"; 
     }
    }
    class c4 implements N<Integer>{
     public Integer m(){
      return 0;
     }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值