1.1目录
1. 为什么使用集合? 2. 集合架构有哪些? 3. List集合 4. ArrayList集合 5. LinkedList集合。
1.2 为什么使用集合?
1. 我们原来讲过数组. 当我们需要保持一组一样(类型相同)的元素的时候,我们应该使用一个容器来保存,数组就是这样一个容器。 思考: 数组有缺陷?--定容【一定数组定义好,他们得长度就无法改 变.】如果需要改变数组得长度,变得很复杂。 2.那么,数组的缺点是什么呢? 数组一旦定义,长度将不能再变化。 3.我们在开发中,需要保存一些变长的数据集合,所以我们需要一些能够动态增长长度的容器来保存我们的数据。 4.我们需要对数据的保存的逻辑有了各种各样的数据结构。我们将数据结构在Java中实现,于是就有了我们的集合框架。
1.3 集合的架构
1.4 List集合
1.4.0 创建集合对象
List list = new ArrayList(); //创建一个集合对象 如果没有指定集合容器的长度默认为10
List list1 = new ArrayList(15);
1.4.1 添加的操作1.4.2 修改的操作
//修改操作
list.set(1,"张三");
System.out.println(list);
1.4.3 查询操作1.4.4 删除的操作
//删除操作
list.remove(2);//移除下标为2的元素
System.out.println(list);
list.clear();//清空集合中的元素
System.out.println(list);
1.5.LinkedList
1.5.1 添加操作
//添加操作
linkedList.add("java01");//添加操作
linkedList.addFirst("java02");//添加到头部
linkedList.addLast("java03");//添加到尾部
1.5.2 查询操作
//查询操作
System.out.println(linkedList.size());//获取数组长度
System.out.println(linkedList.isEmpty());//获取数组是否为空
System.out.println(linkedList.contains("java05"));//判断元素是否在数组内
System.out.println(linkedList.get(1));//获取下标为一的元素
System.out.println(linkedList.getFirst());//获取头部元素
System.out.println(linkedList.getLast());//获取尾部元素
1.5.3 删除操作
//删除操作
linkedList.remove(1);//删除下标为一的数据
linkedList.removeFirst();//删除头部
linkedList.removeLast();//删除尾部
System.out.println(linkedList);
1.5.4 修改操作
//修改操作
linkedList.set(1,"李四");
System.out.println(linkedList);
1.5.5LinkedList的get()查询操作的源代码
1、==================== get(1)-----获取元素========================
public E get(int index) {
checkElementIndex(index); //检查index下标是否正确。
return node(index).item; //李四Node对象
}
========================node(index)=============================
Node<E> node(int index) {
//>> 位运算二进制运算 ----- size >> 1 一半的意思size/2
if (index < (size >> 1)) { //前半部分
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else { //后半部分
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
1.6 Set集合
1.7 HashSet集合
1.7.0 创建HashSet对象
public class Test02 {
public static void main(String[] args) {
HashSet hashSet= new HashSet();
HashSet hashSet1 = new HashSet(16);//初始容器的大小
//loadFactor:--->0.7f 表示负载因子 当空间使用70%时 要求扩容
HashSet hashSet2 = new HashSet(16,0.7f);
}
}
1.7.1 添加元素
//添加操作
hashSet.add("java01");
hashSet.add("java02");
hashSet.add("java04");
hashSet.add("java03");
hashSet.add("java02");
HashSet set2=new HashSet();
set2.add("易烊千玺");
set2.add("王俊凯");
set2.add("王源");
hashSet.addAll(set2); //把set2中的每个元素添加到hashset中
System.out.println(hashSet); //元素不能重复 而且无序
1.7.2 删除元素
//删除
hashSet.remove("王源");
// hashSet.clear();//清空容器集合
System.out.println(hashSet);
1.7.3 修改元素
//修改操作
boolean empty = hashSet.isEmpty(); //判断是否为空
System.out.println(empty);
boolean b = hashSet.contains("易烊千玺");//判断元素是否在容器中
System.out.println(b);
1.7.4 hashSet的遍历
(1)通过foreach遍历
//遍历--- foreach
for(Object o: hashSet){
System.out.println(o);
}
(2)通过迭代器来遍历
//迭代器遍历
Iterator iterator = hashSet.iterator();//获取迭代器对象 有序:有下标
while (iterator.hasNext()){//判断是否指定能够移动
Object next = iterator.next();//指定移动并获取当前的元素
System.out.println(next);
}
1.8 TreeSet集合
TreeSet中的方法和HashSet中的方法一模一样 只是他们的实现不一样。
TreeSet 基于TreeMap 实现。TreeSet可以实现有序集合,但是有序性需要通过比较器实现。
例子: 存储String类型
存储一个对象类型: