容器
变量:存储单个数据
数组:存储多个数据
引用数据类型
定长,长度确定不可改变
有序,有索引
存储相同的数据类型
容器|集合
-
可以存储多个数据
-
容量可以进行动态的改变
-
可以存储不同的数据类型
public class Class001_Container { public static void main(String[] args) { ArrayList list = new ArrayList<>(); list.add(123); list.add("你好"); list.add(false); list.add(3.12); System.out.println(list); System.out.println(list.size()); list.add(false); list.add(3.12); System.out.println(list); System.out.println(list.size()); System.out.println(list.get(1)); MyContainer my = new MyContainer(); my.add("abc"); System.out.println(my.size()); System.out.println(my); my.add("bcd"); System.out.println(my.size()); System.out.println(my); System.out.println(my.get(0)); System.out.println(my.get(1)); } } //手写ArrayList,自定义容器类 MyContainer : 只能存储字符串数据 class MyContainer{ //存储数据的结构 private String[] elementData; //记录集合中数据的个数 private int size; public MyContainer() { } /** * 添加 * @param value 要添加的数据 */ public void add(String value) { //判断是否为第一次添加数据 if(elementData==null || size==0){ elementData = new String[1]; elementData[0] = value; size++; return; } //不是第一次添加数据,原elementData指向数据对象,原数组中存在数据 //记录原数组对象地址 String[] temp = elementData; //创建新数组 elementData = new String[size+1]; //原数组中数据拷贝到新数组 //i 作为原数组索引同时也能作为新数组水印 for(int i=0;i<size;i++){ elementData[i] = temp[i]; } //新数据添加到新数组最后 elementData[size] = value; //长度+1 size++; } //根据索引获取数据 public String get(int index){ if(index<0 || index>=size){ throw new IndexOutOfBoundsException(index+"索引越界啦!!!"); } return elementData[index]; } //根据索引修改数据 //根据索引删除数据 //返回数据的个数 public int size(){ return this.size; } @Override public String toString() { return Arrays.toString(elementData); } }
Collection
Collection 集合层次结构中的根接口。 集合表示一组对象,称为其元素 。 遍历: 增强for循环 iterator迭代器
public class Class001_Collection { public static void main(String[] args) { Collection col = new ArrayList(); Collection col2 = new ArrayList(); //add() col.add("123"); col.add(false); col.add(543); col.add("你好"); System.out.println(col.add(null));; col2.add('a'); col2.add('b'); col2.add('c'); System.out.println(col); System.out.println(col2); //boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合中(可选操作)。 col.addAll(col2); System.out.println(col); System.out.println(col2); //boolean contains(Object o) 如果此collection包含指定的元素,则返回 true 。 System.out.println(col.contains("你好")); //boolean containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回 true 。 //boolean isEmpty() 如果此集合不包含任何元素,则返回 true 。 System.out.println(col2.isEmpty()); //col2.clear(); System.out.println(col2.isEmpty()); //boolean remove(Object o) 从此集合中移除指定元素的单个实例(如果存在)(可选操作)。 System.out.println(col.remove("123")); System.out.println(col); //boolean removeAll(Collection<?> c) 删除此集合的所有元素,这些元素也包含在指定的集合中(可选操作)。 //boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。 col2.add('d'); System.out.println(col.retainAll(col2)); System.out.println(col); System.out.println(col2); //Object[] toArray() 返回包含此集合中所有元素的数组。 System.out.println(Arrays.toString(col2.toArray())); //遍历方式 //foreach for(Object obj:col2){ System.out.println(obj); } //Iterator<E> iterator() 返回此集合中元素的迭代器。 //1)获取某一个集合的迭代器 Iterator it = col2.iterator(); //2)是否存在下一个元素 while(it.hasNext()){ //3)获取下一个元素 System.out.println(it.next()); } } }
泛型
泛型 : jdk1.5新增 参数化类型 : 数据的类型作为参数传递 泛型通过一对<>配置 泛型只能设置引用数据类型 泛型可以提高稳定与可读性
public class Class002_Generic { public static void main(String[] args) { //泛型可以提高稳定与可读性 ArrayList<String> col = new ArrayList<>(); col.add("abc"); col.add("bcd"); col.add("cde"); //遍历 for(String str:col){ System.out.println(str); } Iterator<String> it = col.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
List有序的
list:有序的
set:无序的
List : 有序集合(也称为序列 )。 特点 : 有序,可重复 ,可以根据索引操作.. 新增功能 : 新增了一些根据索引操作的方法 遍历方式 :
1.for
-
foreach
-
iterator
-
listIterator
public class Class001_ArrayList { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(3); list.add(2); list.add(4); list.add(1); list.add(5); System.out.println(list); //void add(int index, E element) 将指定元素插入此列表中的指定位置(可选操作)。 list.add(0,1); System.out.println(list); //E get(int index) 返回此列表中指定位置的元素。 System.out.println(list.get(3)); //int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。 //int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。 System.out.println(list.indexOf(1)); System.out.println(list.lastIndexOf(1)); //static <E> List<E> of(E... elements) 返回包含任意数量元素的不可修改列表。 List<Integer> list2 = List.of(1,2,3,4,5); System.out.println(list2); //E remove(int index) 删除此列表中指定位置的元素(可选操作)。 //boolean remove(Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)(可选操作)。 System.out.println(list.remove(1));; //E set(int index, E element) 用指定的元素替换此列表中指定位置的元素(可选操作)。 System.out.println(list.set(0,0)); System.out.println(list); //List<E> subList(int fromIndex, int toIndex) 返回指定的 fromIndex (包含)和 toIndex (不包括)之间的此列表部分的视图。 结束索引不包含 System.out.println(list.subList(1,3)); //for 遍历 for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
作业:
定义list集合,存储你喜欢的漫威英雄人物,如果存在灭霸,就添加一个 惊奇队长 实现方式: contains() 各种遍历方式 普通for 增强for iterator listIterator
public class Class002_Each { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("钢铁侠"); list.add("美国队长"); list.add("灭霸"); list.add("蜘蛛侠"); System.out.println(list); //contains /*if(list.contains("灭霸")){ list.add("惊奇队长"); }*/ //for /*for(int i=0;i<list.size();i++){ if("灭霸".equals(list.get(i))){ list.add("惊奇队长"); } }*/ //foreach //ConcurrentModificationException /*for(String s :list){ if("灭霸".equals(s)){ list.add("惊奇队长"); } }*/ //iterator //ConcurrentModificationException 多个线程多个引用同时操作当前的list集合,一个要遍历,一个要添加,有可能出现数据不安全情况,抛出次异常 /*Iterator<String> it = list.iterator(); while(it.hasNext()){ if("灭霸".equals(it.next())){ list.add("惊奇队长"); } }*/ //ListIterator<E> listIterator() 返回此列表中元素的列表迭代器(按适当顺序)。 //ListIterator<E> listIterator(int index) 从列表中的指定位置开始,返回列表中元素的列表迭代器(按正确顺序)。 // ListIterator<E> : 列表的迭代器,允许程序员在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。 ListIterator<String> it2 = list.listIterator(); while(it2.hasNext()){ if("灭霸".equals(it2.next())){ it2.add("惊奇队长"); } } System.out.println(list); } }
AarrayList
-
ArrayList : 有序,可重复,存在索引 底层结构: 数组 特点: 根据索引查询效率高,增删效率低 应用场景:适合用在大量做查询,少量做增删的场景 扩容: 默认的初始容量为10 , 每次扩容原容量的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1); 新增方法: void forEach(Consumer<? super E> action) 遍历方式:
-
for
-
foreach
-
iterator
-
listIterator
-
-
定义ArrayList存储数据,测试使用 存储自定义引用数据类型的数据 ...
-
注意: 存储JavaBean数据,需要重写equals方法'
-
Vector : 向量 是List接口的实现类 底层结构与ArrayList相同为数组,特点,应用场景相同 不同 : 1)ArrayList线程不安全|不同步 Vector线程安全|同步 2)ArrayList每次扩容原容量的1.5倍,Vector每次扩容原容量的2倍,ArrayList更有利于节省内存 注意: 如果不需要线程安全实现,建议使用ArrayList代替Vector
public class Class003_ArrayList { public static void main(String[] args) { //ArrayList() 构造一个初始容量为10的空列表。 ArrayList<Goods> list = new ArrayList<>(); list.add(new Goods(101,"华为")); list.add(new Goods(102,"小米")); list.add(new Goods(103,"苹果")); //void forEach(Consumer<? super E> action) 对 Iterable每个元素执行给定操作,直到处理 Iterable所有元素或操作引发异常。 list.forEach(System.out::println); //indexOf --> 判断两个商品对象是会否相等,默认调用equals方法 System.out.println(list.indexOf(new Goods(102,"小米"))); } } class Goods{ private int id; private String name; public Goods() { } public Goods(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Goods{" + "id=" + id + ", name='" + name + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Goods goods = (Goods) o; return id == goods.id && Objects.equals(name, goods.name); } }
LinkedList:
LinkedList : list接口实现类: 有序,可重复
底层结构: 双向链表
特点 : 查询效率低,增删效率高 应用场景 : 适合用在大量做增删少量做查询的位置
新增功能 : 新增了一些操作链表头尾的方法 遍历 : 与list相同
public class Class004_LinkedList {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("nihao");
list.add("hehe");
list.add("weixiao");
list.add("zaijian");
System.out.println(list);
System.out.println(list.getFirst());
System.out.println(list.getLast());
System.out.println(list.removeFirst());
System.out.println(list);
}
}