一、Java 集合框架
0、介绍:
(0)什么是集合
-集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便.
(1)集合框架被设计成要满足以下几个目标:
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection)
,存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue
,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList
、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
(2)集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 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 接口存储一组唯一,无序的对象。
Set和List的区别:
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