集合
--1,概述
集合和数组一样,都是用来存储 多个 数据的.
数组的缺点: 多个相同类型的数据 + 一旦创建长度不可变 + 按照下标遍历 + 适合查询
集合的优点: 可以存类型不同的数据 + 可变长度 + 遍历方式丰富 + 适合查询 + 适合增删
--2,继承结构
--Collection接口
--List子接口
--ArrayList实现类(底层是数组,适合查询)
--LinkedList实现类(底层是链表,适合增删)
--Set子接口
--HashSet实现类
--Map接口
--HashMap实现类
四,Collection接口
--1,Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。
一些collection 是有序的,而另一些则是无序的。


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
//测试 Collection接口
public class Test3_Collection {
public static void main(String[] args) {
//1,创建对象 --泛型约束里的类型是 引用类型 不能是基本类型
Collection<Integer> c = new ArrayList<>();
//2,调用方法
c.add(1) ;
c.add(2) ;
c.add(3) ;
c.add(4) ;
c.add(5) ;
System.out.println(c);//[1, 2, 3, 4, 5]
// c.clear(); //清空集合
System.out.println( c.contains(5) );//判断集合中是否包含
System.out.println( c.equals(123) );//判断集合和123是否相等
System.out.println( c.hashCode() );//获取c的哈希码值
System.out.println( c.remove(3) );//移除3
System.out.println( c.isEmpty() );//判断是否为空
System.out.println( c.size() );//获取集合的长度
Object[] os = c.toArray();//集合 转 数组
System.out.println( Arrays.toString(os) );//[1, 2, 4, 5]
//TODO 集合间的操作
Collection<Integer> c2 = new ArrayList<>();
c2.add(1);
c2.add(2);
System.out.println( c.addAll(c2) );//把c2加到c里 -->124512
System.out.println( c.containsAll(c2) );//判断c里包含c2吗
// System.out.println( c.removeAll(c2) );//移除交集
// System.out.println( c.retainAll(c2) );//保留交集
//TODO 获取集合里的元素
//方式一:: Iterator<E> iterator() -- 返回迭代器Iterator,专门用来迭代集合里的元素
Iterator<Integer> it = c.iterator();
while( it.hasNext() ){//hasNext()判断有元素吗,有的话就返回true
Integer in = it.next();//next()获取元素
System.out.println(in);
}
//方式二:: foreach -- Collection接口也可以用
//语法: for(数据的类型 变量名 : 容器){}
for(Integer in : c){
System.out.println(in);
}
}
}
Collections工具类
--1,概述
专门用来给 Collection集合 提供各种方法
--2,常用方法
addAll(Collection<? super T> c, T... elements)
max(Collection<? extends T> coll)
min(Collection<? extends T> coll)
static void reverse(List<?> list)
sort(List<T> list)
swap(List<?> list, int i, int j)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
//测试 集合的工具类Collections
public class Test2_Collections {
public static void main(String[] args) {
//1,创建List集合并添加元素
List<Integer> list = new ArrayList<>();
// list.add(1);
// list.add(2);
// list.add(3);
//TODO 一次性向集合中添加多个元素
Collections.addAll(list, 15,12,33) ;
System.out.println( Collections.max(list) );//获取最大值
System.out.println( Collections.min(list) );//获取最小值
Collections.reverse(list);//翻转list里的元素
Collections.sort(list);//给无序的list元素排序--12,15,33
//给list集合的下标0和下标2的元素交换位置--33,15,12
Collections.swap(list,0,2);
}
}
List接口
--1,概述
List是Collection接口的子接口.,,,,可以用Collection的所有方法
List还做了很多的扩展方法
--2,特点
--元素有序
--元素可以重复
--元素有下标
--可以存null
-3,方法
-TODO 继承自Collection接口的
!!--自己扩展的 --提供了大量的根据下标操作元素的方法
add(int index, E element)
boolean addAll(int index, Collection<? extends E> c)
E get(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
ListIterator<E> listIterator()
E remove(int index)
E set(int index, E element)
List<E> subList(int fromIndex, int toIndex)
--4,测试
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
// 测试 List接口
public class Test4_List {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("美队");
list.add("蜘蛛侠");
list.add("美队");
list.add(null);
list.add("蜘蛛侠");
list.add("猪猪侠");
list.add(null);
//TODO 1, List接口的特点: 元素有序 + 元素可重复 + 可以存多个null + 有下标
//[美队, 蜘蛛侠, 美队, null, 蜘蛛侠, 猪猪侠, null]
System.out.println(list);
// method(list);//继承自Collection接口的方法
method2(list);//特有的方法
}
//2, List接口的 特有的方法 -- 因为List接口有下标
public static void method2(List<String> list) {
list.add(4,"绿巨人");//在指定的索引处,插入指定的元素
System.out.println( list.get(3) );//根据下标获取元素
System.out.println( list.indexOf("蜘蛛侠") );//获取蜘蛛侠第一次出现的索引
System.out.println( list.lastIndexOf("蜘蛛侠"));//获取蜘蛛侠最后一次出现的索引
System.out.println( list.remove(3) );//根据下标删除元素
System.out.println( list.set(2,"灭霸"));//把2下标的元素换成 灭霸
List<String> list2 = list.subList(2, 5);//截取子List从2开始到5结束[2,5)
// boolean addAll(int index, Collection<? extends E> c)
//TODO 迭代List集合的元素
//方式1:: Iterator<E> iterator() --继承自Collection接口
Iterator<String> it = list.iterator();
while( it.hasNext() ){//有元素再获取
String s = it.next();
System.out.println(s+"====");
}
//方式2:: ListIterator<E> listIterator() --List接口特有的
//TODO 面试题:iterator() 和 listIterator() 的区别 ?
//出处不一样,,,,返回值是Iterator接口 和ListIterator接口,,是继承关系.
//ListIterator接口是一个子接口能用父接口的所有方法,而且做了方法扩展(逆向遍历)
ListIterator<String> it2 = list.listIterator();
while(it2.hasNext()){
String s = it2.next();
System.out.println(s+"~~~~");
}
//逆向遍历--了解 -- 必须先顺序遍历!!!
while(it2.hasPrevious()){
String s = it2.previous();
System.out.println(s +"---");
}
//方式3:: 由于List集合有下标,可以按照下标遍历
for(int i = 0 ; i< list.size() ; i++){
String s = list.get(i);//根据下标获取元素
System.out.println(s+"\\\\");
}
//方式4:: 增强for循环
for(String s : list){
System.out.println(s+"==");
}
}
//TODO 继承自Collection接口的方法
public static void method(List<String> a) {
//TODO 同 Test3_Collection.java
for(String s : a){
System.out.println(s);
}
}
}
List删除元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class C1 {
public static void main(String[] args) {
//list集合
List<Integer> list = new ArrayList<>();
//迭代元素
// iterator() -> Iterator
// listIterator() -> ListIterator -> 能顺序遍历还能逆向遍历
//删除元素 -- ?
list.add(10);
list.add(20);
list.add(30);
list.add(40);
//迭代循环
Iterator<Integer> it = list.iterator();
while (it.hasNext()){
Integer in = it.next();
System.out.println(in);
}
//删除 30 的数据
// --java.lang.IndexOutOfBoundsException
//System.out.println( list.remove(30) );
//不要直接传入一个基本类型的整数。。默认就当下标用
// E remove (int indext)
// boolean remove (Object 0)
System.out.println(list.remove(Integer.valueOf(30)));
System.out.println(list);
}
}
ArrayList
-1,概述
--是List集合的实现类,可以用Collection的也可以用List的方法
--每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。
随着向 ArrayList 中不断添加元素,其容量也自动增长。
--2,特点
--底层维护了一个数组Object[],方便查
--元素有序
--元素有下标
--元素可以存null
--元素可重复
--3,创建对象
ArrayList()
构造一个初始容量为 10 的空列表。
import java.util.ArrayList;
//ArrayList
public class C2 {
public static void main(String[] args) {
//TODO jdk1.6是当创建了一个ArrayList对象时,直接创建一个容量为10的数组
//TODO jdk1.8是当创建了一个ArrayList对象时,创建了一个空数组
//为了优化内存,,,first element is added.才扩充容量
ArrayList list = new ArrayList();
//TODO ArrayList底层维护了一个Object[] elementData用来存数据
//当调用add()时,才开始扩充容量.会把数据添加到数组里,并同时扩充容量
list.add("小蓝车");
list.add("小黄车");
list.add("小绿车");
System.out.println(list);
//数组的默认容量是10,当超过10个元素时,底层会自动扩容
//扩容的方式就是:int newCapacity = oldCapacity + (oldCapacity >> 1);
//就是旧容量的1.5倍
}
}
LinkedList
--1,概述
是List接口的实现类,也可以使用List接口和Collection接口的所有方法
也可以进行功能扩展
--2,特点
--底层是链表结构(适合增删)
--和List接口一样可以重复,可以有序,可以存null,有下标
--3,创建对象
LinkedList()
构造一个空列表。
--4,方法
void addFirst(E e)
void addLast(E e)
E getFirst()
E getLast()
E removeFirst()
E removeLast()
boolean offerFirst(E e)
boolean offerLast(E e)
E peekFirst()
E peekLast()
E pollFirst()
E pollLast()
import java.util.LinkedList;
public class C3 {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
//
list.addFirst(100);//添加首元素
list.addLast(200);//添加尾元素
System.out.println( list.getFirst() );//获取首元素
System.out.println( list.getLast() );//获取尾元素
System.out.println( list.removeFirst() );//移除首元素
System.out.println( list.removeLast() );//移除尾元素
}
}
Set接口
--1,概述
继承自Collection接口,所以可以用父接口Collection的所有方法
--2,特点
--通常 需要给数据去重 时 才用set
--元素不能重复 + 只能存一个null
--元素无序吗 没有下标
HashSet
--1,概述
--是Set接口的实现类,可以使用Set接口的方法
--底层是一个 哈希表 的结构
--2,创建对象
HashSet()
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class C4 {
public static void main(String[] args) {
//1,创建对象
Set<Integer> set = new HashSet<>();
set.add(10);
set.add(5);
set.add(33);
set.add(33);
set.add(99);
set.add(null);
//特点无序 + 不能重复 +没有下标, 存 null
System.out.println(set);
// 迭代set集合
//方式1:: Iterator<E> iterator()
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
Integer in = it.next();//获数据,流动指针
//TODO 如果取到null调用null.XXX一定会报空指针异常NullPointerException,
if(in != null){//防止空指针异常
System.out.println(in);
}
}
//方式2:: foreach
for (Integer i:set
) {
System.out.println(i);
}
}
}