JAVA-API-Collection集合(List和Set)

Collection集合

1 集合概述

集合:集合是java中提供的⼀种容器,可以⽤来存储多个数据。
集合和数组既然都是容器,它们有啥区别呢?
数组的⻓度是固定的。集合的⻓度是可变的。
数组中存储的是同⼀类型的元素,可以存储基本数据类型值。集合存储的都是对象。⽽且对
象的类型可以不⼀致。在开发中⼀般当对象多的时候,使⽤集合进⾏存储。

2 集合框架

集合按照其存储结构可以分为两⼤类,分别是单列集合 java.util.Collection 和双列集
合 java.util.Map 。
Collection:单列集合类的根接⼝,⽤于存储⼀系列符合某种规则的元素,它有两个重要的
⼦接⼝,分别是 java.util.List 和 java.util.Set 。其中, List 的特点是元素有序、元
素可重复。 Set 的特点是元素⽆序,⽽且不可重复。 List 接⼝的主要实现类
有 java.util.ArrayList 和 java.util.LinkedList , Set 接⼝的主要实现类
有 java.util.HashSet 和 java.util.TreeSet 。
在这里插入图片描述
其中,橙⾊框⾥填写的都是接⼝类型,⽽蓝⾊框⾥填写的都是具体的实现类。
集合本身是⼀个⼯具,它存放在 java.util 包中。在 Collection 接⼝定义着单列集合框架中最最共性的内容。

3 Collection 常⽤功能

Collection是所有单列集合的⽗接⼝,因此在Collection中定义了单列集合(List和Set)通⽤的
⼀些⽅法,这些⽅法可⽤于操作所有的单列集合。⽅法如下:
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() :把集合中的元素,存储到数组中。

List

List接⼝介绍

java.util.List 接⼝继承⾃ Collection 接⼝,是单列集合的⼀个重要分⽀,习惯性地会将实现了 List 接⼝的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以⼀种线性⽅式进⾏存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有⼀个特点就是元素有序,即元素的存⼊顺序和取出顺序⼀致。

List接⼝特点:

  1. 它是⼀个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的
    存储就是按照11、22、33的顺序完成的)。
  2. 它是⼀个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是⼀个
    道理)。
  3. 集合中可以有重复的元素,通过元素的equals⽅法,来⽐较是否为重复的元素。
    Tips:我们在基础班的时候已经学习过List接⼝的⼦类java.util.ArrayList类,该类中的⽅法
    都是来⾃List中定义。

List接⼝中常⽤⽅法

public void add(int index, E element) :将指定的元素,添加到该集合中的指定位置
上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) :移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :⽤指定元素替换集合中指定位置的元素,返回值
的更新前的元素。

举例:

public class ListDemo {
 public static void main(String[] args) {
 // 创建List集合对象
 List<String> list = new ArrayList<String>();
 // 往 尾部添加 指定元素
 list.add("图图");
 list.add("⼩美");
 list.add("不⾼兴");
 System.out.println(list);
 // add(int index,String s) 往指定位置添加
 list.add(1,"没头脑");
 System.out.println(list);
 // String remove(int index) 删除指定位置元素 返回被删除元素
 // 删除索引位置为2的元素
 System.out.println("删除索引位置为2的元素");
 System.out.println(list.remove(2));
 System.out.println(list);
 // String set(int index,String s)
 // 在指定位置 进⾏ 元素替代(改)
 // 修改指定位置元素
 list.set(0, "三⽑");
 System.out.println(list);
 // String get(int index) 获取指定位置元素
 // 跟size() ⽅法⼀起⽤ 来 遍历的
 for(int i = 0; i < list.size(); i++){
 System.out.println(list.get(i));
 }
 //还可以使⽤增强for
 for (String string : list) {
 System.out.println(string);
 }
 }

ArrayList集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于⽇常开发中
使⽤最多的功能为查询数据、遍历数据,所以 ArrayList 是最常⽤的集合。

LinkedList集合

java.util.LinkedList 集合数据存储的结构是链表结构。⽅便元素添加、删除的集合。
LinkedList是⼀个双向链表,那么双向链表是什么样⼦的呢,我们⽤个图了解下
在这里插入图片描述
实际开发中对⼀个集合元素的添加与删除经常涉及到⾸尾操作,⽽LinkedList提供了⼤量⾸尾操
作的⽅法。这些⽅法我们作为了解即可:
public void addFirst(E e) :将指定元素插⼊此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public E getFirst() :返回此列表的第⼀个元素。
public E getLast() :返回此列表的最后⼀个元素。
public E removeFirst() :移除并返回此列表的第⼀个元素。
public E removeLast() :移除并返回此列表的最后⼀个元素。
public E pop() :从此列表所表示的堆栈处弹出⼀个元素。
public void push(E e) :将元素推⼊此列表所表示的堆栈。
public boolean isEmpty() :如果列表不包含元素,则返回true。
LinkedList是List的⼦类,List中的⽅法LinkedList都是可以使⽤,这⾥就不做详细介绍,我们只
需要了解LinkedList的特有⽅法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构
使⽤。(了解即可)
⽅法演示:

public class LinkedListDemo {
 public static void main(String[] args) {
 LinkedList<String> link = new LinkedList<String>();
 // 添加元素
 link.addFirst("abc1");
 link.addFirst("abc2");
 link.addFirst("abc3");
 System.out.println(link);
 // 获取元素
 System.out.println(link.getFirst());
 System.out.println(link.getLast());
 // 删除元素
 System.out.println(link.removeFirst());
 System.out.println(link.removeLast());
 while (!link.isEmpty()) { // 判断集合是否为空
 System.out.println(link.pop()); // 弹出集合中的栈顶元素
 }
 System.out.println(link);
 }
}

Vector

和ArrayList类似,也是通过数组实现元素的存储,长度可变,更安全,保证同步,效率低。

特有方法
    void addElement(Object obj)

将指定的元素添加到此向量的末尾,相当于add(Object obj)

    Enumeration elements()

返回此向量的枚举,结合Enumeration接口使用,相当于迭代器。

    boolean hasMoreElements()

相当于迭代器里面的hasNext()。

    Object nextElement()

相当于next()方法。

import java.util.Enumeration;
import java.util.Vector;
 
public class VectorDemo {
 
	public static void main(String[] args) {
 
		// 创建集合对象
		Vector<String> v = new Vector<String>();
 
		// 添加元素
		v.addElement("hello");
		v.addElement("world");
		v.addElement("java");
 
		// 遍历
		// 获取Enumeration :向量的枚举
		Enumeration<String> e = v.elements();
		while (e.hasMoreElements()) {
			String s = e.nextElement();
			System.out.println(s);
		}
	}
}
/***
hello
world
java
 */

Set接⼝

java.util.Set 接⼝和 java.util.List 接⼝⼀样,同样继承⾃ Collection 接⼝,它
与 Collection 接⼝中的⽅法基本⼀致,并没有对 Collection 接⼝进⾏功能上的扩充,只是⽐
Collection 接⼝更加严格了。与 List 接⼝不同的是, Set 接⼝中元素⽆序,并且都会以某种规
则保证存⼊的元素不出现重复。
Tips:Set集合取出元素的⽅式可以采⽤:迭代器、增强for。

HashSet
 不能保证元素的排列顺序,顺序有可能发生变化
 不是同步的
 集合元素可以是null,但只能放入一个null
当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等
注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。
TreeSet
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0
定制排序
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。

重点:
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值