1. 类集概述
java类集框架位于java.util包下,是JDK1.2产生的,它的本质其实就是动态数组。
动态数组:当元素个数达到最大值时,动态增加容量,解决数组定长的问题
在java的类集中,提供了两个最为核心的接口:Collection、Map
Collection接口及其子接口:每次进行数据操作时,都是对单个对象进行处理
Map接口:对键值对进行操作处理
2. 关于Collection接口
2.1 Collection的定义和常用方法
Collection接口是单个对象保存的最顶层的父接口它的构造方法如下:
public interface Collection extends Iterable
看一下他有哪些常用方法:
其中我们最常使用有两个方法:
add() :向集合中添加元素
iterator():取得集合的迭代器
由于Collection接口制定了数据的存储标准,而没有区分具体的存储类型,因此我们在使用时一般不直接使用Collection接口,而是使用它的两个子接口
List:允许元素重复
Set:不允许元素重复
2.2 List接口
List接口除了有Collection接口提供的那些方法之外。还有两个自己独有的方法
get(int index):根据指定索引获取元素
set(int index, E element): 修改指定索引处的元素,返回修改前的元素
在List接口下有三个重要子类:ArrayList、LinkedList、Vector
ArrayList:
public class ArrayList extends AbstractList implements List
LinkedList:
public class LinkedList extends AbstractSequentialList implements List
public abstract class AbstractSequentialList extends AbstractList
Vector:
public class Vector extends AbstractList implements List
AbstractList:
public abstract class AbstractList extends AbstractCollection implements List
我们可以看到ArstractList已经实现了List,但是ArrayList它们还要自己实现List接口。这是因为对于数组来说有一些基本的增删改查操作,我们把这些方法就放在ArstractList中,但是ArrayList等又有一些自己特有的方法,这时候就需要实现List接口去扩展自己的方法。
下面我们来具体看看List下的子类
2.2.1 ArrayList
ArrayList底层是一个对象数组,声明一个ArrayList对象时长度为0,只有第一次使用时,长度才会被置为10。这是一种懒加载策略。对集合的增删改查都是异步处理,性能较高,线程不安全。
2.2.2 Vector
底层实现是一个对象数组,声明一个Vector,初始化长度是10
对集合的修改都采用同步处理(直接在方法上使用内建锁),性能较低,线程安全
当数组长度不够用时,扩容策略变为原来数组的2倍
2.2.3 LinkedList
基于链表实现的动态数组
我们都直到List接口允许存储重复元素,如果我们想用List来存储自定义对象时,这时我们就需要自己覆写equals()方法了。因为当我们在使用List中的contains()和remove()方法时,它们都需要用到equals方法,对于基本类型和引用类型而言,Object已经帮他们覆写了equals()。但是自定义类并没有覆写,因此我们需要自己覆写。
下面通过一个例子,来看看如何使用List来存储自定义类对象。
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age