集合框架概述
1、集合框架的作用
在实际开发中,我们经常会对一组相同类型的数据进行统一管理操作。
到目前为止,我们可以使用数组结构,链表结构,二叉树结构来实现。
数组的最大问题在于数组中的元素个数是固定的,要实现动态数组,必竟还是比较麻烦,自己实现链表或二叉树结构来管理对象更是不方便。
在JDK1.2版本后,JAVA完整的提供了类集合的概念,封装了一组强大的、非常方便的集合框架API,让我们在开发中大大的提高了效率。
集合中分为三大接口:
Collection、Map、Iterator
集合框架的接口和类在java.util包中
2、集合框架结构图
虚线是接口 实线是实现类
3、Collection接口
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
接口的定义:
public interface Collection
extends Iterable
2、集合框架List接口
1、 List接口
public interface List extends Collection
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
2、ArrayList
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
3、Vector
public class Vector extends AbstractList
implements List, RandomAccess, Cloneable, Serializable
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
4.LinkedList
public class LinkedList extends AbstractSequentialList
implements List, Deque, Cloneable, Serializable
List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。
——————————————————————————————
-
Collection接口:用于存储单个对象的集合
-
List接口:
-
1、有序的,可以重复
-
2、允许多个 null 元素
-
3、具体的实现有常用的:ArrayList,Vector,LinkedList
-
在实际开发中,我们如何选择list的具体实现?
-
1、安全性问题
-
2、是否频繁插入,删除操作(LinkedList)
-
3、是否是存储后遍历
————————————————————————————- LinkedList
- 1、实现原理,采用双向链表结构实现
- 2、适合插入,删除操作,性能高
——————————————————————————
面试题 :Vector与ArrayList的区别? 两个原理讲明白就行
- Vector
- 1、实现原理,采用动态对象数组实现,默认构造方法创建了一个大小为10的对象数组
- 2、扩充的算法:当增量为0时,扩充为原来大小的2倍,当增量大于0时,扩充为原来大小+增量
- 3、不适合删除或插入操作
- 4、为了防止数组动态扩充次数过多,建议创建Vector时,给定初始容量
- 5、线程安全,适合在多线程访问时使用,在单线程下使用效率较低
——————————————————————————
- ArrayList(1.8)
- 1、实现原理,采用动态对象数组实现,默认构造方法创建了一个空数组
- 2、第一次添加元素,扩展容量为10,之后的扩充算法:原来数组大小+原来数组的一半
- 3、不适合进行删除或插入操作
- 4、为了防止数组动态扩充次数过多,建议创建ArrayList时,给定初始容量
- 5、多线程中使用不安全,适合在单线程访问时使用,效率较高
- JDK1.2开始
—————————————————————————————
怎样自己实现ArrayList?(问的就是其基本原理)动态扩充数组
package com.vince;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
/**
* Collection接口:用于存储单个对象的集合
* List接口:
* 1、有序的,可以重复
* 2、允许多个 null 元素
* 3、具体的实现有常用的:ArrayList,Vector,LinkedList
* 在实际开发中,我们如何选择list的具体实现?
* 1、安全性问题
* 2、是否频繁插入,删除操作(LinkedList)
* 3、是否是存储后遍历
*
* Set接口:
* @author vince
* @description
*/
public class ListDemo {
/**
* LinkedList
* 1、实现原理,采用双向链表结构实现
* 2、适合插入,删除操作,性能高
*
*/
private static void linkedList(){
LinkedList<String> list = new LinkedList<>();
list.add("苍老师");
list.add("李老师");
list.add("张老师");
list.add("毕老师");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
/**
* Vector
* 1、实现原理,采用动态对象数组实现,默认构造方法创建了一个大小为10的对象数组
* 2、扩充的算法:当增量为0时,扩充为原来大小的2倍,当增量大于0时,扩充为原来大小+增量
* 3、不适合删除或插入操作
* 4、为了防止数组动态扩充次数过多,建议创建Vector时,给定初始容量
* 5、线程安全,适合在多线程访问时使用,在单线程下使用效率较低
* 面试题 :Vector与ArrayList的区别?
*/
private static void vector(){
Vector<String> v = new Vector<>();
v.add("苍老师");
v.add("李老师");
v.add("张老师");
v.add("毕老师");
for(int i=0;i<v.size();i++){
System.out.println(v.get(i));
}
}
/**
* ArrayList(1.8)
* 1、实现原理,采用动态对象数组实现,默认构造方法创建了一个空数组
* 2、第一次添加元素,扩展容量为10,之后的扩充算法:原来数组大小+原来数组的一半
* 3、不适合进行删除或插入操作
* 4、为了防止数组动态扩充次数过多,建议创建ArrayList时,给定初始容量
* 5、多线程中使用不安全,适合在单线程访问时使用,效率较高
* JDK1.2开始
*/
private static void arrayList(){
//使用集合来存储多个不同类型的元素(对象),那么在处理时会比较麻烦,的实际开发中,不建议
//这样使用,我们应该在一个集合中存储相同的类型对象
List<String> list = new ArrayList<>();
list.add("苍老师");
list.add("李老师");
list.add("张老师");
list.add("毕老师");
// list.add(10);
//遍历集合
int size = list.size();
for(int i=0;i<size;i++){
System.out.println(list.get(i));
}
System.out.println(list.contains("苍老师"));
list.remove("毕老师");
System.out.println(list.size());
String[] array = list.toArray(new String[]{});
for(String s: array){
System.out.println(s);
}
}
public static void main(String[] args) {
// arrayList();
// vector();
linkedList();
}
}
接下来的内容
1、集合框架概述
2、集合框架List接口
3、集合框架Set接口
4、集合框架Iterator接口
5、JDK1.8新特性之Stream
6、集合框架Map接口
7、Collections工具类
8、Queue、Deque接口
9、对象一对多与多对多关系
10、迭代器设计模式
11、guava对集合的支持