前言
由于之前的类对多个对象进行操作时,扩展性和适应性相对较差,所以java提供了集合框架来供我们灵活地操作对象组。
集合有以下三个特点:(1)长度可变;(2)只能存储引用类型;(3)可以存储多种引用类型。
java集合框架主要包括两种,一种是集合(Collection),存储一个元素集合,另一种是图(Map),用来存储键值对映射。
Collection接口
Collection接口又有3种子类型:List、Set和Queue,之所以定义多个接口,是为了以不同的方式操作集合对象;再下面是一些抽象类,上图省略了抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、HashMap等等。
由于Collection是集合继承结构中的根接口,定义的是集合的共性功能,该接口的主要功能如下:
(1)添加操作
(2)移除操作
(3)判断是否包含元素功能
(4)获取集合大小和元素的功能
迭代器接口Iterator,实现该接口的迭代器对象可以用来遍历集合中的元素,该接口的主要方法包括:
集合使用
- 首先创建集合对象,例如Collection c = new ArrayList();
- 创建元素对象,并利用c.add(E e)将元素e添加到集合中;
- 通过集合对象获取迭代器对象,然后利用hasNext()和next()进行遍历。
List集合
- ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全;
- LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全;
- Vector:底层数据是数组,查询快,增删慢,线程安全。
去除掉ArrayList中的重复元素:
利用LinkedList模拟栈数据结构的集合
利用LinkedList模拟栈数据结构的集合,并测试:
public class MyStack<E> {
private LinkedList<E> list;
public MyStack(){
list = new LinkedList<E>();
}
public void push(E e){
list.add(e);
}
public E pop(){
E e = list.removeLast();
return e;
}
public E peek(){
E e = list.getLast();
return e;
}
public boolean isEmpty(){
if(list.size()==0) {return true;}
else {return false;}
}
}
public class Test {
public static void main(String[] args) {
MyStack<String> st = new MyStack<String>();
st.push("hello");
st.push("world");
System.out.println(st.isEmpty());
String s1 = st.pop();
System.out.println(s1);
String s2 = st.pop();
System.out.println(s2);
System.out.println(st.isEmpty());
}
}
Set集合
Set集合的特点:存储的元素无序,并且不重复。
- HashSet:底层数据结构是哈希表,哈希表保证元素唯一性的两个方法是hashCode()和equals,首先判断对象的哈希值是否相同,如果不同,就直接添加到集合中;如果相同,则执行equals()进行比较,若返回false,就直接添加到集合,否则不添加。
- LinkedHashSet:底层数据结构是哈希表和链表,哈希表表征元素唯一性,链表保证元素有序,且存储顺序和取出顺序一致。
- TreeSet:底层结构是红黑树,平衡二叉树,集合中的元素不重复,并且按照要求排序,具体为在添加元素时,会和之前的元素比较,若返回值为正数,则往后添加,返回负数,则往前添加,返回0,则说明重复,不添加。
- 一般要求集合有序时,使用TreeSet,否则使用HashSet。
Map集合
Map中的每一个元素是一个键值对,键唯一,值可以重复,它的实现类的数据结构只针对键有效,跟值无关。
- 统计字符串中字符的个数:
Java泛型
泛型是将所操作的数据类型指定为一个参数,它允许在编译时刻检测到非法类型。
假设我们不仅想要比较两个整数的大小,还想要比较浮点数、字符间的大小,可以使用泛型。
泛型类和非泛型类声明类似,除了在类名后面添加类型参数声明部分。