天天看点

JAVA基础学习总结,day13(集合,泛型)

集合:

集合和数组的区别:

  1. 数组的长度是固定的,而集合的长度是可变的
  2. 数组中的元素的类型是一致的,而集合中的元素可以不一致
  3. 数组中可以存储基本数据类型的数据,而集合只能存储引用数据类型的数据

集合体系图:

  • 单列集合:
    • Collection:定义了所有单列集合共有的方法
      • List:存取元素有序,可重复
        • ArrayList
        • LinkedList
        • Vector 过时不用
      • Set:存取元素无序,不可重复
        • HashSet:
        • LinkedHashSet:
        • TreeSet:
  • 双列集合:
    • Map:
      • HashMap:
      • LinkedHashMap:
      • TreeMap:

Collection集合(接口)

  • public boolean add(E e) : 把给定的对象添加到当前集合中 。
// 创建集合对象               
// 使用多态形式          
Collection<String> coll = new ArrayList<String>();//父接口指向实现类的对象  多态           
// 使用方法          
// 添加功能  boolean  add(String s)          
coll.add("小李广");          
coll.add("扫地僧");          
coll.add("石破天");          
System.out.println(coll);
           
  • public void clear() :清空集合中所有的元素。
// void  clear() 清空集合         
coll.clear();         
System.out.println("集合中内容为:"+coll)
           
  • public boolean remove(E e) : 把给定的对象在当前集合中删除。
//boolean remove(E e) 删除在集合中的o元素
  System.out.println("删除石破天:"+coll.remove("石破天"));          
  System.out.println("操作之后集合中元素:"+coll);
           
  • public boolean contains(E e) : 判断当前集合中是否包含给定的对象。
// boolean contains(E e) 判断o是否在集合中存在          
System.out.println("判断  扫地僧 是否在集合中"+coll.contains("扫地僧"));
           
  • public boolean isEmpty() : 判断当前集合是否为空。
// boolean  isEmpty()  判断是否为空         
System.out.println(coll.isEmpty()); 
           
  • public int size() : 返回集合中元素的个数。
// size() 集合中有几个元素     
System.out.println("集合中有"+coll.size()+"个元素")
           
  • public Object[] toArray() : 把集合中的元素,存储到数组中
// Object[] toArray()转换成一个Object数组              
Object[] objects = coll.toArray();          
// 遍历数组          
for (int i = 0; i < objects.length; i++) {     
System.out.println(objects[i]);             
}         
           

Collection 集合的遍历:

所有的Collection集合都有一个迭代器用来遍历集合中的元素

  1. 什么是迭代

    在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出,这种取出方式专业术语称为迭代

  2. 如何获取集合的迭代器

    Iterator iterator() 返回此集合中的元素的迭代器

// 使用多态方式 创建对象        
Collection<String> coll = new ArrayList<String>();          
// 添加元素到集合        
coll.add("串串星人");        
coll.add("吐槽星人");        
coll.add("汪星人");                
//获取coll集合的迭代器         
Iterator<String> it = coll.iterator();
           
  1. 如何使用迭代器遍历集合中的元素 iterator中的方法:

    public E next() :返回迭代的下一个元素。

    public boolean hasNext() :如果仍有元素可以迭代,则返回 true

//使用迭代器 遍历   每个集合对象都有自己的迭代器        
Iterator<String> it = coll.iterator();        
//  泛型指的是 迭代出 元素的数据类型        
while(it.hasNext()){ //判断是否有迭代元素            
String s = it.next();//获取迭代出的元素            
System.out.println(s);        
}
           

增强for循环:

格式:

for(元素的数据类型 变量 : Collection集合or数组){

//写操作代码

}

int[] arr = {3,5,6,87};          
       //使用增强for遍历数组
        for(int a : arr){//a代表数组中的每个元素
         System.out.println(a);
             }              
      Collection<String> coll = new ArrayList<String>();
          coll.add("小河神");
          coll.add("老河神");
          coll.add("神婆");
       for(String s :coll){
          System.out.println(s);
        }

           
泛型:

概述:可以在类或方法中预支地使用未知的类型(就是一个未知的数据类型)

特点:泛型只能是引用数据类型

泛型的好处:

  • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
  • 避免了类型强转的麻烦

注意:

  • 集合如果没有指定元素的类型,那么元素的类型默认是Object类型

自定义泛型和使用泛型:

  • 定义泛型类和使用泛型类:
    • 定义泛型类的语法格式:

      修饰符 class 类名<代表泛型的变量> { }

      public class 类名{

      }

      创建该泛型类对象的时候确定泛型的类型

public class MyGenericClass<MVP> { //没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型     
private MVP mvp;               
public void setMVP(MVP mvp) {        
this.mvp = mvp;    
}          
public MVP getMVP() {        
return mvp;    
}
}
           

定义泛型方法和使用泛型方法

  • 定义泛型方法的格式:

    修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

    调用泛型方法的时候确定泛型的类型

public class MyGenericMethod {          
public <MVP> void show(MVP mvp) {     
System.out.println(mvp.getClass());         
}         
public <MVP> MVP show2(MVP mvp) {        
return mvp;         
}
}
           

定义泛型接口和使用泛型接口

  • 定义泛型接口的格式:

    修饰符 interface接口名<代表泛型的变量> { }

    public interface 接口名{ }

    1. 定义实现类的时候确定泛型的类型

    2. 始终不确定泛型的类型,直到创建对象时,确定泛型的类型

public interface MyGenericInterface<E>{
public abstract void add(E e);          
public abstract E getE();       
}
           

泛型通配符

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?来表示未知通配符

此时只能接受数据,不能往该集合中存储数据

泛型的上限:

格式: 类型名称 <? extends 类 > 对象名称

意义: 只能接收该类型及其子类

泛型的下限:

格式: 类型名称 <? super 类 > 对象名称

意义: 只能接收该类型及其父类型

// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
           

注意:

泛型没有继承