Java 学习笔记(七)集合框架

    科技2022-07-13  126

    集合框架


    一、集合框架

    集合框架被设计成要满足以下几个目标。

    该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

    该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

    对一个集合的扩展和适应必须是简单的。

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

    List的接口的实现类主要有ArrayList和LinkedList. Set接口主要的实现类有HashSet和TreeSet。

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

    接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map等。之所以定义多个接口,是为了以不同的方式操作集合对象实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

    二、集合接口

    序号接口描述1Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。2List 接口 List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。List 接口存储一组不唯一,有序(插入顺序)的对象。(有索引,可以使用普通的for循环遍历)3Set Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象(没有索引,不能使用普通的for循环遍历)。4SortedSet 继承于Set保存有序的集合。5Map Map 接口存储一组键值对象,提供key(键)到value(值)的映射。6Map.Entry 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。7SortedMap 继承于 Map,使 Key 保持在升序排列。8Enumeration 这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。

    三、Collection集合

    java.util

    Interface Collection

    集合层次结构中的根界面 。

    是所有单利集合的顶层接口,;里面定义了所有单利集合共性的方法,任意的单例集合都可以使用Collection接口的方法;

    public boolean add(E e)确保此集合包含指定的元素(可选操作)。public void clear() 从此集合中删除所有元素(可选操作)。public boolean remove(Object o)从该集合中删除指定元素的单个实例(如果存在)(可选操作)。 4.public boolean contains(Object o)如果此集合包含指定的元素,则返回 true 。 5.public boolean isEmpty() 如果此集合不包含元素,则返回 true 。 6.public int size()返回此集合中的元素数。

    四、List接口

    List接口,实现了Collection接口;常见方法:add()...remove();有序集合(存储和取出的顺序相同)允许存储重复元素;实现类: ArrayList:数组结构的结合,方便查询;LinkedList: 链式结构的集合,方便增删改; 区分ArrayList、LinkedList、Vector? Vector :数组结构,线程安全的,效率慢,而且也是可变长数组的,继承自List接口ArrayList :数组结构,线程不安全的,效率快,而且也是可变长数组的,继承自List接口;LinkedList:双向链表结构,继承自List接口;

    1. ArrayList 类

    数组的长度是不可以改变的,但是ArrayList集合的长度可以改变; 在ArrayList后面的代表泛型泛型:集合中所以元素全部都统一的什么类型注意:泛型只能是引用类型,不能是基本类型;对于ArrayList集合来说直接打印得到的不是地址值,而是内容; 如果内容为空,则为[].add(E e)向集合中添加元素,参数的类型和泛型一致;.get(int index)从集合当中获取元素,参数是索引编号; package list; import java.util.ArrayList; public class ArrayListDemo1 { public static void main(String[] args) { // 创建一个ArrayList集合,集合的名称是List,里面装的全部都是String字符串类型的数据; // 备注:从JDK1.7开始右侧的<>中科院不写内容,都是<>本身要保留; // 泛型只能是引用类型;但是如果想ArrayList中存基本数据,就必须使用基本数据类型的包装类; // ArrayList<Integer> list=new ArrayList<>(); ArrayList<String> list=new ArrayList<>(); System.out.println(list);//[] // 向集合中添加数据 add(); list.add("xiao"); System.out.println(list);//[xiao] } }

    2. LinkedList 类

    1. LinkedList 类中的常用方法

    向链表末尾添加一个新节点,该节点中的数据是参数element指定的对象:

    public boolean add(Object element)

    向链表指定位置添加一个新节点,该节点中的数据是参数element指定的对象:

    public void add(int index,Object element)

    向链表表头添加一个新节点,该节点中的数据是参数element指定的对象:

    public void addFirist(Object element)

    向链表表尾添加一个新节点,该节点中的数据是参数element指定的对象

    public void addLast(Object element)

    删除第一个节点并返回这个节点中的对象

    public Object removeFirst()

    删除最后一个节点并返回这个节点中的对象

    public Object removeLast()

    删除指定位置的节点

    public Object remove(int index)

    得到指定位置的节点

    public Object get(int index)

    得到链表第一个节点的对象

    public Object getFirst()

    表最后一个节点的对象

    public Object getLast()

    返回节点对象element在链表中首次出现的位置,如果链表中无此节点的对象则返回-1

    int indexOf(Object element)

    返回节点对象element在链表中最后出现的位置,如果链表中无此节点的对象则返回-1

    public int lastIndexOf(Object element)

    将当前链表index位置节点中的对象替换成参数element指定的对象,返回被替换对象

    public Object set(int index,Object element)

    返回链表的长度即节点个数

    public int size()

    判断链表节点对象中是否含有element

    public boolean contains(Object element)

    五、Set 集合

    接口,实现了Collection接口;不允许存储重复元素;(按自身内部规则欧排序 —无序)没有索引(不能通过普通for循环遍历);无序集合(存储和取出元素的顺序有可能不一样);实现类: HashSet类: LinkedHashSet子类(可满足按插入顺序排序)TreeSet类:继承了Set,SortedSet;实现comparable接口:比较器 -headSet(E):不包含subSet(fromE to E)包前不包后tailSet(E):包含 Set<Person> hashset=new LinkedHashSet<>();//按插入顺序排序。

    七、Collection与Collections区别

    Collection集合框架的父接口;Collections:集合工具类:乱序,排序、查找(二分)等。

    八、比较器

    comparable:表示可以比较的; 实现该接口,这个类就可以比较大小,可以进行自然排序compareTo() 正数表示大,负数表示小,0表示相等Comparable 的实现必须与equals()结果一致,就是相等的对象的时候,比较结果为0comparator:比较工具;

    九、Map 集合

    接口存储一组键值对象,提供key到value的映射;key唯一不可重复,value可重复多个;

    1.散列表Map

    容量:散列表中的散列数组大小;散列桶:散列值相同的元素的线性集合;加载因子:散列元素的数量除以散列数组大小 0.75HashMap默认加载因子值

    2. 遍历 Map

    import java.util.*; public class Test{ public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二次取值 System.out.println("通过Map.keySet遍历key和value:"); for (String key : map.keySet()) { System.out.println("key= "+ key + " and value= " + map.get(key)); } //第二种 System.out.println("通过Map.entrySet使用iterator遍历key和value:"); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第三种:推荐,尤其是容量大时 System.out.println("通过Map.entrySet遍历key和value"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } //第四种 System.out.println("通过Map.values()遍历所有的value,但不能遍历key"); for (String v : map.values()) { System.out.println("value= " + v); } } }

    3. HashMap

    以键值对形式存储对象,key唯一且不重复; key可以是任意对象,value也可以是任意对象;(key:value)成对存放在集合中;重复的key第一个,重复添加是覆盖(替换);可以根据key值计算散列表,元素按照散列值排序;HashMap默认容量是16,加载因子默认值是0.75HashMap根据key查找value值

    4. TreeMap类

    十、泛型通配符

    ?:可以表示任意的数据类型;

    **注意:**泛型没有继承概念;

    使用方法: 不能创建对象使用;只能作为方法的参数使用;
    Processed: 0.012, SQL: 8