Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)
Java基础之 集合体系结构详细笔记(Collection、List、ArrayList、LinkedList、Vector)
集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就是对数据结构的封装
数组与集合的比较
数组:长度固定,可以存储基本数据类型,也能存储对象
集合:长度可变,只能存储对象类型(由于有包装类的存在,集合可以存储任何类型)
集合的体系结构
集合也叫容器,用于存储对象
我们根据不同的需求和不同的数据结构来对集合做了不同的抽象
Collection接口-公共方法
collection集合是所有集合类的老祖宗,我们将要学习它的公共属性,这些公共属性将被所有集合子类所继承,由于具体的实现需要用子类去继承collection接口,故我们使用arrayList类来实现
创建集合对象并加入元素
/*创建一个collection集合对象*/
Collection coll = new ArrayList() ;
((ArrayList) coll).add("劳斯莱斯");
((ArrayList) coll).add("迈巴赫");
/*创建一个collection集合对象*/
Collection coll2 = new ArrayList() ;
((ArrayList) coll2).add("宝马");
((ArrayList) coll2).add("奔驰");
理论上集合中的数据类型可以任意且不同的,但在工程中我们常通过泛型对集合中的泛型进行约束
addAll
集合中加入集合,以元素的形式并入被加集合
((ArrayList) coll2).addAll(coll) ;
System.out.println(coll2);
结果:[宝马, 奔驰, 劳斯莱斯, 迈巴赫]
remove
删除指定元素
coll.remove("劳斯莱斯") ;
System.out.println(coll);
结果:[迈巴赫]
removeAll
删除集合中的集合
coll2.removeAll(coll) ;
System.out.println(coll2);
结果:[宝马, 奔驰, 劳斯莱斯]
contains
是否包含某元素,返回boolean类型数据
boolean iscontain = coll2.contains("宝马");
System.out.println(iscontain);
结果:true
containsAll
是否包含某集合,返回boolean类型数据
iscontain = coll2.containsAll(coll) ;
System.out.println(iscontain);
结果:false
isEmpty
集合是否为空,返回boolean类型数据
boolean isEmpty = coll.isEmpty() ;
System.out.println(isEmpty);
结果:false
toArray
集合转化为数组
Object[] obj = coll2.toArray();
System.out.println(obj);
for(int i=0 ; i
System.out.println(obj[i]);
}
结果:[Ljava.lang.Object;@a77106
宝马
奔驰
劳斯莱斯
集合的遍历
强调:迭代器对象遍历是一次性的,如需多次遍历需创建多个迭代器对象
/*获得迭代器对象,迭代器本质是个指针,一次性使用(一去不复返),迭代过程不允许增删改查(不支持并发)*/
Iterator iterator = coll2.iterator();
while (iterator.hasNext()){
Object obj1 = iterator.next();
System.out.println(obj1);
}
结果:
宝马
奔驰
劳斯莱斯
集合中加入对象
以student对象为例子
import java.util.ArrayList;
import java.util.Collection;
public class Student extends Person {
private int sno;
private String sname;
public Student(int sno, String sname) {
this.sno = sno;
this.sname = sname;
}
private Collection books = new ArrayList() ;
public Collection getBooks() {
return books;
}
public void setBooks(Collection books) {
this.books = books;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", name='" + sname + '\'' +
", books=" + books +
'}';
}
}
/*创建集合*/
Collection coll3 = new ArrayList() ;
/*创建学生对象*/
Student student = new Student(101,"junsir") ;
/*学生对象加入集合*/
((ArrayList) coll3).add(student);
System.out.println(coll3);
结果:[Student{sno=101, name='junsir', books=[]}]
拓展(可直接跳过):
/*创建学生对象*/
Student student1 = new Student(102,"zhangsan") ;
/*学生对象加入集合*/
((ArrayList) coll3).add(student1);
/*获取该学生的books属性*/
Collection books = student1.getBooks();
/*对books集合进行加入操作*/
books.add(new Books("长安十二时辰",101)) ;
books.add(new Books("诡秘之主",102)) ;
System.out.println(coll3);
结果
[Student{sno=101, name='junsir', books=[]}, Student{sno=102, name='zhangsan', books=[Books{name='长安十二时辰', bno=101}, Books{name='诡秘之主', bno=102}]}]
可见,集合coll3中的第二个学生的books属性得到了更新,即我们通过get获取到的属性集合,在内存中与学生对象中的属性集合是一致的
此拓展还包含了数据库中的一对多模型
List(接口)
List集合类是继承Collection,但其还是一个接口,需要一个子类来对其继承,我们还是选用ArrayList
List集合底层是数组,有序,长度可变
创建集合并添加元素
/*创建集合并添加元素*/
List list = new ArrayList() ;
//集合末尾添加元素
list.add("吴用");
list.add("刘唐");
list.add("宋江") ;
/*创建集合并添加元素*/
List list1 = new ArrayList() ;
//集合末尾添加元素
list1.add("阮小五");
list1.add("阮小七");
add(int index,Object element)
在指定位置插入元素,元素下标机制与数组一致
list.add(0,"晁盖");
System.out.println(list);
结果:[晁盖, 吴用, 刘唐, 宋江]
addAll
在指定集合中插入集合的元素,
/*在list中添加list1*/
list.addAll(list1) ;
System.out.println(list);
结果:[晁盖, 吴用, 刘唐, 宋江, 阮小五, 阮小七]
get
获得指定元素
注意:不要越界
Object obj = list.get(1) ;
System.out.println(obj);
结果:吴用
size
获得集合长度
int i = list.size();
System.out.println(i);
结果:6
listIterator正向遍历
list集合的迭代器,一般用于遍历集合
iterator遍历一般不支持并发操作,但其提供的add方法可以在遍历过程中进行其他操作
ListIterator lIterator = list.listIterator() ;
while (lIterator.hasNext()){
Object obj1 = lIterator.next();
if ("吴用".equals(obj1)){
/*迭代器提供的add避免并发,但添加的元素不会被实时显示*/
lIterator.add("白胜");
}
System.out.println(obj1);
}
System.out.println(list);
结果:
晁盖
吴用
刘唐
宋江
阮小五
阮小七
[晁盖, 吴用, 白胜, 刘唐, 宋江, 阮小五, 阮小七]
listIterator反向遍历
while (lIterator.hasPrevious()){
Object obj1 = lIterator.previous();
System.out.println(obj1);
for循环遍历
for(int k = 0 ; k
Object obj1 = list.get(k);
if ("吴用".equals(obj1)){
lIterator.add("白胜1"); //被添加元素可以被实时显示
}
System.out.println(obj1);
}
indexof/lastIndexOf
返回指定元素的正向遍历第一个位置/返回指定元素的反向遍历第一个位置
System.out.println(list.indexOf("白胜1"));
System.out.println(list.lastIndexOf("白胜1"));
结果:7 7
remove
删除指定元素,返回元素位置
或
删除指定位置元素,返回Boolean
System.out.println(list.remove(2)); //返回被删除元素,往后元素向前移动
System.out.println(list.remove("晁盖")); //返回boolean,往后元素向前移动
结果:白胜
true郑州妇科在线医生 http://www.zzkdfk120.com/
在list集合中,增删改操作性能较低,因为其底层是数组,牵一发而动全身,如果考虑性能能优先,list集合不是首先,后面会介绍更适合的集合
removeAll
删除集合中的指定集合元素
list.removeAll(list1) ;
System.out.println(list);
结果
[吴用, 刘唐, 宋江, 白胜1]
clear
清空集合元素
list.clear();
ArrayList
实现了List的一个类,底层数组
改进:
数组长度动态可变
允许存入null类型元素
相比list,支持多并发(不是线程安全)
多并发->高效率
其方法与其接口list提供的方法基本一致
List list = new ArrayList() ;
list.add(null);
list.add(null);
list.add(null);
list.set(2,"吴用") ; // 修改指定索引出的值
System.out.println(list);
LinkedList
LinkedList底层是数据结构中的链表实现的
特点:
允许用作堆栈、队列(包括双端队列)
允许包括null在内的所有元素
支持并发(非线程安全)
创建LinkedList集合并加入元素
LinkedList list = new LinkedList();
list.add("张三");
list.add("王五");
list.add("李四") ;
System.out.println(list);
掐头去尾
list.removeFirst();
list.removeLast();
结果:
[王五]
压栈入栈
System.out.println(list.pop());
list.push("赵六");
System.out.println(list);
结果:
王五
[赵六]
Vector
Vector集合与AaaryList集合功能上是类似的,区别在于vector不支持并发(即线程安全),导致的结果就是效率较低
持并发(非线程安全)
创建LinkedList集合并加入元素
LinkedList list = new LinkedList();
list.add("张三");
list.add("王五");
list.add("李四") ;
System.out.println(list);
掐头去尾
list.removeFirst();
list.removeLast();
结果:
[王五]
压栈入栈
System.out.println(list.pop());
list.push("赵六");
System.out.println(list);
结果:
王五
[赵六]
Vector
Vector集合与AaaryList集合功能上是类似的,区别在于vector不支持并发(即线程安全),导致的结果就是效率较低