SE API第10/11天:集合 ——>ArrayListals、Iterator遍历迭代器、增强for、List集→subList、集合间转换asList、排序sort | Map相关

本文详细介绍了Java集合框架,重点讲解了ArrayList类、HashMap的遍历以及集合的排序方法,包括Iterator迭代器、增强for循环、List的subList方法和sort排序。还探讨了集合与元素的equals方法、集合与数组的转换以及Map接口的遍历方式。
摘要由CSDN通过智能技术生成

一、Java 集合框架

0、介绍:

(0)什么是集合

-集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便.

(1)集合框架被设计成要满足以下几个目标:

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
  • 对一个集合的扩展和适应必须是简单的。

为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。

在这里插入图片描述
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

(2)集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

接口:是代表集合的抽象数据类型。例如 CollectionListSetMap 等。之所以定义多个接口,是为了以不同的方式操作集合对象

实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayListLinkedListHashSetHashMap。

算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

(3)集合框架体系如图所示:
在这里插入图片描述

(4)java集合框架中相关接口:

-java.util.Collection接口:

java.util.Collection是所有集合的顶级接口.Collection下面有多种实现类,因此我们有更多的数据结构可供选择.

-Collection类下面有两个常见的子接口:

  • java.util.List:线性表.是可重复集合,并且有序.
  • java.util.Set:不可重复的集合,大部分实现类是无序的.

-这里可重复指的是集合中的元素是否可以重复,而判定重复元素的标准是依靠元素自身equals比较的结果.为true就认为是重复元素.

1.Collection 接口:
Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(List和set)Collection 接口存储一组不唯一,无序的对象。

2.List 接口:
List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。

List 接口存储一组不唯一,有序(插入顺序)的对象。

3.Set:
Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。
Set 接口存储一组唯一,无序的对象。

SetList的区别:
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>

1、ArrayList 类

是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
-ArrayList 继承了 AbstractList ,并实现了 List 接口。

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.ArrayList; //引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>();  //初始化

E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
objectName: 对象名。

ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
-ArrayList类提供了很多有用的方法:

1:add()方法:添加元素
2:size()方法:如果要计算ArrayList中的元素数量
3:isEmpty()方法:判断当前集合是否为一个空集
4:clear()方法:删除Arraylist中的所有元素
CollectionDemo.java》:

package collection;
import java.util.ArrayList;
import java.util.Collection;
/**
 * JAVA集合框架
 * 集合和数组一样,可以保存一组元素,但是集合将元素的操作都封装成了方法,操作简便。
 * 并且集合提供了多种不同的实现供我们使用。
 *
 * java.util.Collection是所有集合的顶级接口,里面定义了所有集合都必须具备的功能方法
 * 集合有两类常用的子类:
 * java.util.List:可重复的集合,且有序。通常我们称它为"线性表"
 * java.util.Set:不可重复的集合。
 * 上述两个都是接口,而元素是否重复取决于元素自身的equals方法,即:Set集合中不会存在
 * 两个元素equals比较为true的情况。
 *
 */
public class CollectionDemo {
   
    public static void main(String[] args) {
   
        //集合只能存放引用类型:
        Collection c = new ArrayList();
        /*
        1:添加元素
        ArrayList类提供了很多有用的方法,添加元素到 ArrayList 可以使用add() 方法:
        boolean add(E e)  E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
        向当前集合中添加一个元素,当元素成功添加则返回true,否则返回false
         */
        c.add("one");//add:加
        c.add("twe");
        c.add("three");
        c.add("four");
        c.add("five");
        System.out.println(c);
//        c.add(123);//会触发自动装箱特性


        /*
        2:计算ArrayList中的元素数量可以使用size()方法:
        int size()
        返回当前集合的元素个数
         */
        int size = c.size();//size:尺寸,大小
        System.out.println("size:"+size);


        /*
        3:判断当前集合是否为一个空集
        boolean isEmpty()
        判断当前集合是否为一个空集(不含有任何元素),当size为0时,返回true
         */
        boolean isEmpty = c.isEmpty();//empty:空的

        System.out.println("是否为空集:"+isEmpty);


        /*
        4:删除Arraylist中的所有元素
        void clear()
         */
        System.out.println(c);
        c.clear();
        System.out.println(c);
        System.out.println("size:"+c.size());//0
        System.out.println("是否为空集:"+c.isEmpty());
    }
}

2、集合与元素equals方法相关的方法

Point.java》:

package collection;
import java.util.Objects;
/**
 * 使用当前类作为集合元素测试集合相关操作
 */
public class Point {
   
    private int x;
    private int y;

    public Point(int x, int y) {
    //alt+insert:构造方法:与类同名 没有返回值类型,连void都没有
        this.x = x;
        this.y = y;
    }

    public int getX() {
   
        return x;
    }

    public void setX(int x) {
   
        this.x = x;
    }

    public int getY() {
   
        return y;
    }

    public void setY(int y) {
   
        this.y = y;
    }

    //alt+insert 选择toString():
    @Override
    public String toString() {
   
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }


    //alt+insert 选择equals() and hashCode()后,返回为true

    @Override
    public boolean equals(Object o) {
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Point point = (Point) o;
        return x == point.x && y == point.y;
    }

    @Override
    public int hashCode() {
   
        return Objects.hash(x, y);
    }
}CollectionDemo2.java》:

package collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
/**
 * 元素会影响集合操作的相关方法
 */
public class CollectionDemo2 {
   
    public static void main(String[] args) {
   
//        Collection c = new ArrayList();
        Collection c = new HashSet();//(1)不可重复的集合
        c.add(new Point(1,2));
        c.add(new Point(3,4));
        c.add(new Point(5,6));
        c.add(new Point(7,8));
        c.add(new Point(9,10));
        c.add(new Point(1,2));//(1)因为HashSet(HashSet中的元素实际上是对象) 所以重复元素无法放入Set集合两次!
        /*
        集合重写了toString方法,格式为:
        [元素1.toString(), 元素2.toString(), 元素3.toString(),.......]
         */
        System.out.println(c);


        //在《Point.java》中按alt+insert,选择equals() and hashCode()后,下面返回为true
        Point p = new Point(1,2);
        /*
        contains()方法:来判断元素是否存在于集合当中:
        boolean contains(Object o)
        判断当前集合是否包含给定元素。
        元素是否包含取决于该元素是否与集合现有元素存在equals比较为true的情况
         */
        boolean contains = c.contains(p);
        System.out.println("是否包含该元素:"+contains);


        /*
        remove()方法来删除集合中的元素:
        remove()方法删除元素时也是删除
         */
        c.remove(p);//只会删除第一个匹配的重复元素
        System.out.println(c);
    }
}

3、集合存放的是元素的引用

-集合只能存放引用类型元素,并且存放的是元素的引用

CollectionDemo3.java》:

package collection;
import java.util.ArrayList;
import java.util.Collection;
/**
 * 集合只能存放引用类型元素,并且存放的是元素的引用(地址)
 */
public class CollectionDemo3 {
   
    public static void main(String[] args) {
   
        Collection c = new ArrayList(); //c为局部变量
        Point p = new Point(1,2);
        c.add(p);//将p元素放入集合
        System.out.println("p:"+p);//(1,2)
        System.out.println("c:"+c);//[(1,2)]

        p.setX(2);//将p对象中的x属性修改为2
        System.out.println("p:"+p);//(2,2)
        System.out.println("c:"+c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值