java学习---集合
集合框架体系
集合可以保存任意多个对象,并且提供了操纵对象的方法,使用起来方便。
单列集合:
双列集合:
Collection
1.collection实现子类可以存放多个元素,每个元素可以是Object
2.有些Collection实现类可以存法重复的元素,有些不可以。
3.有些Collection实现类是有序的(List),有些事无序的(Set)。
4.Collection接口没有直接实现的子类,而是通过他的子接口List和Set来实现的。
Collection接口遍历元素方式
1.迭代器 Iterator
所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即返回一个迭代器。
package Collection_;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class collection01 {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("西游记",123));
col.add(new Book("红楼梦",120));
col.add(new Book("三国演义",150));
//先得到 col 对应的 迭代器
Iterator iterator = col.iterator();
while (iterator.hasNext()){//判断是否还有数据
Object obj = iterator.next();//返回下一个元素,类型是 Object
System.out.println(obj);
}
//当退出 while 循环后 , 这时 iterator 迭代器,指向最后的元素
//如果希望再次遍历,需要重置我们的迭代器
iterator = col.iterator();
}
}
class Book{
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
使用的快捷键:
快速生成 while => itit
显示所有的快捷键的的快捷键 ctrl + j
2.for增强循环
增强for就是简化版的iterator,本质一样,只能用于遍历集合或者数组。
基本语法:
for(元素类型 元素名 : 数组或者集合){
访问元素;
}
List
基本介绍
1.List集合类中元素有序(即添加元素和取出元素的顺序一致),且可以重复。
2… List 集合中的每个元素都有其对应的顺序索引,即支持索引,索引是从 0 开始的
List list = new ArrayList();
list.add("tom");
list.add("jack");
list.add("tom");
System.out.println(list);
System.out.println(list.get(2));
常用方法
List list = new ArrayList();
list.add("tom");
list.add("jack");
//1.void add(int index, Object ele):在 index 位置插入 ele 元素
list.add(1,"tom");
//2.boolean addAll(int index, Collection eles):
// 从 index 位置开始将 eles 中的所有元素添加进来
List list2 = new ArrayList();
list2.add("a");
list2.add("b");
list.addAll(1,list2);
//System.out.println(list);
//3.int indexOf(Object obj):返回 obj 在集合中首次出现的位置
System.out.println(list.indexOf("tom"));
//4.int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
System.out.println(list.lastIndexOf("tom"));
//5.Object remove(int index):移除指定 index 位置的元素,并返回此元素
list.remove(0);
System.out.println(list);
//6.Object set(int index, Object ele):
// 设置指定 index 位置的元素为 ele , 相当于是替换
list.set(0,"txl");
System.out.println(list);
//7.List subList(int fromIndex, int toIndex):
// 返回从 fromIndex 到 toIndex 位置的子集合
//注意返回的子集合 fromIndex <= subList < toIndex
List list3 = list.subList(0,2);
System.out.println(list3);
List的三种遍历方式
ArrayList
注意事项
1.ArrayList可以加入null,并且可以加入多个,同时可以输出
2.ArrayList是由数组实现数据存储的。
3.ArrayList基本等于Vector,除了ArrayList是线程不安全,在多线程情况下,不建议使用它。
ArrayList底层源码
使用细节:
1.ArrayList中维护了一个Object类型的数组elementData, transient Object[ ] elementData , 其中transient表示瞬时,短暂的,表示该属性不会被序列化。
2.当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0 , 第一次添加时,elementData扩容为10 , 如果需要再次扩容,则elementData扩大为原来的1.5倍。
3.如果使用的是指定大小的构造器,则初始elementData为指定大小,如果需要扩容,则直接将elementData扩容为原来的1.5倍。
Vector
Vector与ArrayList基本相同,它的底层也是一个对象数组,不过它是线程同步的,也就是线程安全的,还有个不同点就是它们的扩容机制不完全相同。
LinkedList
基本说明
1 . LinkedList底层实现了双向链表和双端队列特点,可以添加任意元素,元素可以重复,包括null
2.它是线程不安全的,没有实现同步。
底层操作:
1 . LinkedList底层维护了一个双向链表,它维护了两个属性 first 和 last 分别指向首节点和尾结点。
2.每个节点(Node对象)中又维护了 prev 和 next 和 item 三个属性,其中通过prev指向前一个,next指向后一个,最终实现双向链表。
3.LinkedList中元素的删除和添加不是通过数组完成的,效率比较高。
基本方法
LinkedList linkedList = new LinkedList();
//增加元素
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
//删除元素
linkedList.remove(0);
//修改元素
linkedList.set(0,10);
//查看元素
System.out.println(linkedList.get(0));
//调用迭代器输出
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
ArrayList和LinkedList比较:
set
基本介绍
1.添加和取出元素的顺序不一致,但是取出的顺序不会因为次数而改变,不能通过索引取出某一个元素。
2.不允许有重复元素,最多只有一个null.
常用方法
和 List 接口一样, Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一样.
HashSet
HashSet实际上是HashMap.
HashMap底层是数组+链表+红黑树
HashSet添加元素如何实现
1.添加一个元素时,先得到hash值,会转换成索引值。
2.找到存储数据表table,看这个索引位置是否已经存放有元素。
3.如果没有,直接加入。
4.如果有,调用equals比较,如果相同,放弃添加,如果不同,则添加到最后。
5.在JAVA8中,如果一条链表的节点个数到达8个,并且table的大小>=64,那么就会进行树化( 红黑树 ).
第一次添加元素时:table数组扩容到16,临界值是16临界因子 = 12,如果table数组使用到了临界值,就会扩容162 = 32,新的临界值就是32*0.75 = 24,以此类推。
这个临界值到12是指table表中的对象到达了12个,可能只有两条链表,不一定要用到12个链表。
LinkedHashSet
1.LinkedHashSet是HashSet的子类,它的底层是LinkedHashMap,它的底层维护了一个数组+双向链表。
2…LinkedHashSet根据元素的hashcode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入的顺序保存的。它的输出时是按插入的顺序输出的。
3.LinkedHashSet不允许添加重复元素。