集合框架与泛型

Collection接口

集合概述

  • 是单例集合的顶层接口,它表示一组对象,这些对象也被称为Collection的元素

  • JDK不提供此接口的任何直接实现,它提供更具体的子接口(Set和List)实现

创建Collection集合的对象

  • 多态的方式

  • 具体的实现类ArrayList

    public static void main(String[] args){
        //创建Collection集合对象
        Collection<String> c = new ArrayList<String>();
        
        //添加元素,boolean add(元素类型与<String>相同)
        c.add("sanbaiqiqi");
        c.add("三百七七");
        System.out.println( c.add("三百七七"));  //输出:true
        System.out.println(c);    //输出:[sanbaiqiqi,三百七七]   被重写了特定形式输出
    }
    

ArrayList集合类

  • ArrayList类是List接口的一个具体实现类

  • ArrayList对象实现了可变大小的数组

  • 随机访问和遍历元素时,它提供更好的性能

方法名说明
boolean add(Object o)在列表的末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间
int size()返回列表中的元素个数
Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)判断列表中是否存在指定元素
boolean remove(Object o)从列表中删除元素
Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始

Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()、add()、size()、contains(Object o) 、remove(Object o)

public static void main(String[] args){
    //创建集合对象
    Collection<String> c = new ArrayList<>(String);
    c.add("hello");
    c.add("world");
    c.add("java");
    //移除指定元素
    System.out.println(c.remove("world"));  //输出 true [hello,java]
    System.out.println(c.remove("javaee"));  //输出false,"javaee"不在集合中
    
    //void clear() 清空集合中的元素
    c.clear();  //输出[ ]
    
    //boolean contains(Object o):判断集合中是否存在指定的元素
    Sysotem.out.println(c.contains("world"));   //true
    
    //boolean isEmpty():判断集合是否为
     Sysotem.out.println(c.isEmpty());  //集合没有内容输出true;有元素为false
    
    //int size():集合的长度(集合中元素的个数) 
    Sysotem.out.println(c.size());  
        
}

Alt+7快捷键可以看到类的所有信息

LinkedList集合类

  • LinkedList类是List接口的一个具体实现类

  • LinkedList 类用于创建链表数据结构

  • 插入或者删除元素时,它提供更好的性能

  • 特有功能:

    方法名说明
    void addFirst(Object o)在列表的首部添加元素
    void addLast(Object o)在列表的末尾添加元素
    Object getFirst()返回列表中的第一个元素
    Object getLast()返回列表中的最后一个元素
    Object removeFirst()删除并返回列表中的第一个元素
    Object removeLast()删除并返回列表中的最后一个元素

Collection集合的遍历(迭代器Iterator< E >)

  • Iterator< E > iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到,所以说依赖集合存在

  • 方法:

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

    boolean hasNext():如果迭代具有更多元素,则返回true

public static void main(String[] args){
    //创建集合对象
    Collection<String> c = new ArrayList<>(String);
    //添加元素
    c.add("hello");
    c.add("world");
    c.add("java");
    
    Iterator<String> it = c.iterator();   //Iterator是接口
   /* System.out.println(it.next());
    System.out.println(it.next());
    System.out.println(it.next());  第四次会报错*/
    
    //用while循环改进迭代,判断是否有元素
   while(it.hasNext()){
      // System.out.println(it.next());
       String s = it.next();
       System.out.println(s);   
    }
}
/* 输出java
      world
      java
      没有就停止,不报错
 */

List接口

集合概述

  • 有序集合(序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素

  • 允许重复的元素

集合特点

  • 有序:存储和取出的元素顺序一致

  • 可重复性:存储的元素可重复

public static void main(String[] args){
    //创建集合对象
    List<String> list = new ArrayList<>(String);
    list.add("hello");list.add("world");list.add("java");
    list.add("hello");
    
    //void add(int index, E element):添加元素:指定索引位置插入,超出范围报错
    list.add(1,"javaee"); 
    
    //E remove(int index):删除指定索引处的元素,返回被删除的元素
    System.out.println(list.remove(1));   
    Sysem.out.println(list);
    //输出:world   [hello,java]
        
    //E set(int index, E element):修改指定索引处的元素,返回被修改的元素
    System.out.println(list.set(1,"三百七七"));
    Sysem.out.println(list);
     //输出:world    [hello,三百七七,java]
    
    //E get(int index):返回指定所引出元素
    System.out.println(list.get(2)); 
    //输出:java   
 
    //输出集合对象
    Sysem.out.println(list);
    //输出:[hello,world,java,hello]   顺序性和重复性
 **************************************************************
    //迭代遍历
    Iterator<String> it = list.iterator();
    while(it.hasNext()){
        String s = it.next();
        System.out.println(s);
        /* 输出:
            hello
            world
            java
            hello
        */        
    }    
    
    //遍历集合, 用for循环遍历
    for(int i = 0; i<list.size(); i++){
        String s = list.get(i);
         System.out.println(s);
    }
   
}   

ListIterator列表迭代器

  • 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器

  • 用于允许程序员沿任意方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置

  • 常用方法:

    • E next(): 返回迭代中的下一个元素

    • boolean hasNext():如果迭代器具有更多元素,则返回true

    • E previous(): 返回列表中的上一个元素

    • boolean hasPrevious(): 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true

    • void add(E e):将指定的元素插入列表

List集合子类的特点:

ArrayList:

  • 底层数据结构是数组,查询快,增删慢

LinkedList

  • 底层数据结构是链表,查询慢,增删快

public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> array = new ArrayList<String>();
        array.add("三百七七");
        array.add("张缤智");
        array.add("王焕君");       
        //增强for遍历:
        for(String a : array){
            System.out.println(a);
        }
    
System.out.println("--------");
​
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("三百七七");
        linkedList.add("Aurora");
        linkedList.add("Ethereal");
        for(String s : linkedList){
            System.out.println(s);
        }
}

Set接口

Set:

  • 不包含重复元素的集合,HashSet:对集合的迭代顺序不做任何保证

  • 没有带索引的方法,所以不能使用普通for循环遍历

  • HashSet是Set接口常用的实现类

  • Set中存放对象的引用

  • 注意的是Set接口不存在get方法,也就是没有List接口中通过索引取值的方法。

public static void main(String[] args) {
        // 创建集合对象
        Set<String> set = new HashSet<String>();
        //添加元素
        set.add("1111");
        set.add("2222");
        set.add("3333");
        set.add("3333");  //不会添加进集合
        //遍历
        for(String s : set){
            System.out.println(s);
        }       
    }
/*输出: 1111
        2222
        3333
   */

哈希值:

是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值;object类中有一个方法可以获取对象的哈希值public int hashCode(),返回对象的哈希码值。

  • 默认情况下:不同对象的哈希值是不同的

  • 通过方法重写:可以实现不同对象的哈希值是相同的,哈希值是return返回值

public static void main(String[] args) {
        // 创建学生对象
        Student s1 = new Student("三百七七",22);
        
        //同一对象多次调用hashCode()方法返回的哈希值是相同的
        System.out.println(s1.hashCode());  //1080497174
        System.out.println(s1.hashCode());  //1080497174
        
        //默认情况下:不同对象的哈希值是不同的
        //通过方法重写:可以实现不同对象的哈希值是相同的,哈希值是return返回值
            /*在Student类中重写:
                @Override
                public int hashCode(){
                    return 0;
                }
            */
        Student s2 = new Student("三百七七",22);
        System.out.println(s2.hashCode());   //779325750
    
    //相同
        System.out.println("重地".hashCode());  //1179395
        System.out.println("通话".hashCode());  //1179395
​
}

HashSet集合特点:

  • HashSet是Set接口的实现类,底层数据结构是哈希表

  • 对集合的迭代顺序不做任何保证,即不保证存储和取出的元素顺序一致

  • 没有带索引的方法,所以不能使用普通for循环遍历

  • 由于是Set集合,所以不包含重复元素的集合

    public static void main(String[] args) {    
            HashSet<String> hs = new HashSet<String>();
            //添加元素
            hs.add("1111");
            hs.add("2222");
            hs.add("3333");
            hs.add("3333");  
            //遍历
            for(String s : hs){
                System.out.println(s);
            }
    }

LinkedHashSet集合:

  • 继承HashSet,哈希表和链表实现的Set接口,具有可预测的迭代次序

  • 由链表保证元素有序,即元素的存储和取出孙旭是一致的

  • 由哈希表保证元素唯一,即没有重复的元素

LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();

TreeSet集合:

  • 间接使用Set接口,是Set集合,不包含重复的元素

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体的方式取决于构造方法

    • TreeSet():根据其元素的自然顺序进行排序

    • TreeSet(Comparator comparator):根据指定的比较器进行排序。

  • 没有带索引的方法,所以不能使用普通for循环遍历

public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeSet<Integer> ts = new TreeSet<Integer>();
        ts.add(10);
        ts.add(30);
        ts.add(20);
        ts.add(40);
    //自然排序,从小到达 
        for(Integer i : ts){
            System.out.println(i);
        }
}

增强for循环

增强for循环:简化数组和Collection集合的遍历

  • 实现Iterable接口的类允许其对象成为增强型for语句的目标

  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

  • 格式:

    for(元素数据类型 变量名 : 数组或者Collection集合){
        //此处使用变量即可,该变量就是元素
    }
    //示例:
    int[] arr = {1,2,3,4};
    for(int i : arr){
        System.out.println(i);
    }
    String[] strAray = {"hello","三百七七","java"};
    for(String s : strAray){
        System.out.println(s);
    }
    //集合增强for循环
            List<String> list = new ArrayList<String>();
            list.add("三百七七");
            list.add("张缤智");
            list.add("王焕君");
            for(String s2 : list){
                System.out.println(s2);
            }
    //内部原理是一个Iterator迭代器
            for(String s2 : list){
                if(s2.equals("张缤智")){
                    list.add("yu");   
                    //抛出并发修改异常:ConcurrentModificationException,所以……
                }
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱尔斯Jules

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值