Collection集合与泛型

本文介绍了Java中的集合和数组的区别,数组长度固定且存储基本类型或对象,而集合长度可变,主要用于存储对象。接着详细讲解了Collection的常用方法、Iterator迭代器的使用以及如何通过增强for循环遍历集合。最后深入探讨了泛型的概念,包括泛型类、泛型方法、泛型接口和泛型通配符的应用,并展示了泛型的上限和下限的定义及其含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 集合:集合是java中提供的一种容器,可以用来存储多个数据。
    集合和数组既然都是容器,它们有啥区别呢?
  • 数组的长度是固定的。集合的长度是可变的。
  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
    在这里插入图片描述
    1. Collection 常用方法
import java.util.Collection;
import java.util.HashSet;
/*
 * `public boolean add(E e)`:  把给定的对象添加到当前集合中 。
 * `public void clear()` :清空集合中所有的元素。
 * `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
 * `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
 * `public boolean isEmpty()`: 判断当前集合是否为空。
 * `public int size()`: 返回集合中元素的个数。
 * `public Object[] toArray()`: 把集合中的元素,存储到数组中
*/
public class test {
    public static void main(String[] args) {
        Collection<String> coll=new HashSet<>();
        System.out.println(coll);
        coll.add("张三");
        coll.add("李四");
        coll.add("王五");
        System.out.println(coll);
        coll.remove("张三");
        boolean r=coll.contains("王五");
        System.out.println(coll);
        boolean r1=coll.isEmpty();
        System.out.println(r1);
        int r2=coll.size();
        System.out.println(r2);
        Object[] arr = coll.toArray();
        for (int i = 0; i <arr.length ; i++) {
            System.out.println(arr[i]);
        }
        coll.clear();
        System.out.println(coll);
    }
}

运行结果
在这里插入图片描述
2. Iterator迭代器

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
`public Iterator iterator()`: 获取集合对应的迭代器,用来遍历集合中的元素的。
 `public E next()`:返回迭代的下一个元素。
 `public boolean hasNext()`:如果仍有元素可以迭代,则返回 true。
*/
public class test {
    public static void main(String[] args) {
        Collection<String> coll=new ArrayList<>();
        coll.add("张三");
        coll.add("李四");
        coll.add("王五");
        Iterator<String> it = coll.iterator();//获取迭代器的实现对象,并把指针指向-1索引
        while(it.hasNext()){//判断有没有下一个元素
            String name=it.next();//取出下一个元素,把指针向后移动一位
            System.out.println(name);
        }
    }
}

运行结果
在这里插入图片描述
增强for循环遍历

import java.util.ArrayList;
import java.util.Collection;

/*
增强for循环(也称for each循环)是**JDK1.5**以后出来的一个高级for循环,专门用来遍历数组和集合的。
它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
*/
public class test {
    public static void main(String[] args) {
        Collection<String> coll=new ArrayList<>();
        coll.add("张三");
        coll.add("李四");
        coll.add("王五");
        for (String name:coll) {
            System.out.println(name);
        }
    }
}

3. 泛型
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
(1)泛型类修饰符 class 类名<代表泛型的变量> { }

public class GenericClass<D> {//D代表 未知的一种数据类型
    public D name;
    public D getName() {
        return name;
    }
    public void setName(D name) {
        this.name = name;
    }
}

public class test {
    public static void main(String[] args) {
        GenericClass<Integer> gc=new GenericClass<Integer>();//创建一个泛型为Integer的类
        gc.setName(99);
        Integer obj=gc.getName();
        System.out.println(obj);

        GenericClass<String> gc1 = new GenericClass<String>();//创建一个泛型为String的类
        gc1.setName("小廖");
        String obj1 = gc1.getName();
        System.out.println(obj1);
    }
}

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

public class GenericMethod {
    public <M> void method(M m){
        System.out.println(m);
    }
    public static <S> void method1(S s){
        System.out.println(s);
    }
}

public class test {
    public static void main(String[] args) {
        GenericMethod gm = new GenericMethod();
        gm.method(10);
        gm.method("Nihao");
        gm.method(8.9);
        gm.method(true);

        gm.method1(2222);
        GenericMethod.method1(2333);
    }
}

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

public interface GenericInterface<E> {
    public abstract void add(E e);
    public abstract E getE();
}
//泛型接口实现类第一种
public class GenericInterfaceIml<E> implements GenericInterface<E> {

    @Override
    public void add(E e) {

    }

    @Override
    public E getE() {
        return null;
    }
}
//泛型接口实现类第二种
public class GenericInterfaceIml2 implements GenericInterface<String > {

    @Override
    public void add(String s) {

    }

    @Override
    public String getE() {
        return null;
    }
}

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

public class test {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("喜洋洋");
        list.add("灰太狼");

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);

        printArray(list);
        printArray(list2);
    }
    public static void printArray(ArrayList<?> list){//*************
        Iterator<?> it = list.iterator();
        while(it.hasNext()){
            Object o = it.next();
            System.out.println(o);
        }
    }
}

泛型的上限

  • 格式类型名称 <? extends 类 > 对象名称
  • 意义只能接收该类型及其子类

泛型的下限

  • 格式类型名称 <? super 类 > 对象名称
  • 意义只能接收该类型及其父类型
public static void main(String[] args) {
    Collection<Integer> list1 = new ArrayList<Integer>();
    Collection<String> list2 = new ArrayList<String>();
    Collection<Number> list3 = new ArrayList<Number>();
    Collection<Object> list4 = new ArrayList<Object>();
    
    getElement(list1);
    getElement(list2);//报错
    getElement(list3);
    getElement(list4);//报错
  
    getElement2(list1);//报错
    getElement2(list2);//报错
    getElement2(list3);
    getElement2(list4);
  
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值