一 集合简介:
- 什么是集合? 集合简称集,是用来存储多个元素的容器
- 集合与数组的区别:集合中:引用类型的数据(如果存储基本类型时自动装箱),数组中:既可以是基本数据类型也可以是引用类型 。集合中:元素个数不固定,可任意扩容,数组是固定的,不可任意扩容。
- 集合的好处:不受容器大小的限制,可以随时添加,删除元素。Java针对集合提供了大量操作元素的方法(如:判断,获取等)
- 集合体系:(1)单列集合(Collection 接口) List体系:ArrayList类 Set体系:HashSet类 (2)双列集合(Map接口:key,value)Map体系:HashMap类
注意: 集合类<泛型类> 集合对象名 = new 集合类<>(); 使用System.out.println(“集合对象名”); s时默认调用该泛型类的 toString()方法,若该泛型 类没有重写toString()方法,则调用Object类中的默认方法,会输出集合中元素的字符串格式。 解决方法:需要获取集合中的内容,需要重写泛型类中的 toString()方法
二 List集合 :
- 特点:可重复 、有序(存取的顺序相同,先存的先取)
- 应用:List list = new ArrayList(); (List 为接口不能实例化,该方法为父接口指向子类对象来实例化)
ArrayList 构造方法: 1 ArrayList():构造一个初始容量为 10 的空列表 2 ArrayList(int initialCapacity):构造一个具有指定初始容量的空列表 3 ArrayList(Collection<? extends E> c):按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表 成员方法: 1 add(int index, E element):在此列表中的指定位置插入指定元素 2 add(E e):将指定的元素附加到此列表的末尾,返回boolean值表示是否添加成功 3 clear():从此列表中删除所有元素 4 get(int index):返回此列表中指定位置的元素 5 indexOf(Object o) 返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1 6 isEmpty():true如果此列表不包含任何元素,则返回 7 remove(int index):移除此列表中指定位置的元素 8 removeAll(Collection<?> c):从此列表中删除包含在指定集合中的所有元素 9 set(int index, E element):用指定的元素替换此列表中指定位置的元素 10 size():返回此列表中的元素数
三 增强for循环:
- 为什么增强for循环:简化数组和集合的遍历
- 格式:
for(数据类型 变量名 : 数组或者集合对象){ //循环体,变量即元素 } 注:在IDEA编译器中的快捷键:iter + 回车
- 增强for循环的底层依赖的是迭代器(Iterator),即增强for循环就是迭代器的简写形式
四 迭代器:
- 为什么使用迭代器?对过程的重复,称为迭代,迭代器是遍历Collection集合的通用方式,可以在对集合遍历的同时进行添加、删除等操作。
常用方法: 1 next():返回迭代的下一个元素对象 2 hasNext():如果仍有元素可以迭代,则返回ture 3 remove():从底层集合中移除此迭代器返回的最后一个元素(可选操作) 4 iterator():返回此集合中元素的迭代器 例:通过迭代器遍历List集合 1 创建集合对象 List list = new ArrayList(); 2 创建元素对象 3 将元素对象添加到集合对象中 list.add("a"); list.add("b"); list.add("c"); 4 遍历集合 (1)根据集合对象获取其对象的迭代器对象 Iterator it = list.iterator(); (2)判断迭代是否有元素 while (it.hasNext()){ (3)如果有元素就输出 System.out.println(it.next()); } 例: 在“b”后添加“java” List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); Iterator it = list.iterator(); while (it.hasNext()){ String s = (String) it.next(); if("b".equals(s)){ //使用常量“b”调用equals方法与变量s比较,防止空指针异常 list.add("java"); } } list.add("java") 这样写,会报ConcurrentModificationException(并发修改异常) 需要调用List独有的列表迭代器,该迭代器支持在遍历集合的同时进行添加、删除等操作 修改后: List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); ListIterator lit = list.listIterator(); while (lit.hasNext()){ String s = (String) lit.next(); if(s.equals("b")){ lit.add("java"); //使用列表迭代器进行添加 } } System.out.println(list); 输出结果:[a, b, java, c]
- 总结:普通的迭代器在遍历集合的同时不能添加或者删除元素,否则会报并发修改异常。使用列表迭代器在遍历的同时可以修改集合中的元素,但必须使用列表迭代器的方法
四 泛型类
- 什么是泛型类?即泛指任意类型,又叫参数化类型,对具体类型的使用起到辅助作用,类似于方法的参数
- 集合类泛型的解释:表示该集合中存指定类型的元素 List<String> list = new ArrayList<>();
- 泛型类的好处:类型安全,避免了类型转换
- 总结泛型一般只和集合类结合使用,泛型是JDK5提出的特性,在JDK7开始,后边的泛型可以不用写出具体的数据类型(菱形泛型类)
五 Collections工具类
- 简介:针对集合进行操作的工具类
成员方法: 1 sort(List<T>):根据元素的自然顺序,将指定列表按升序排列 2 max(Collection<T>):返回集合的最大元素 3 min(Collection<T>):返回集合的最小元素 4 reverse(List<T>):反转List集合元素 5 shuffle(List<T>):使用默认的随机源随机置换指定的列表 注:大部分方法为静态方法,可通过类名直接进行调用
六 Set集合
- 特点:不可重复,无序(先进后出)
- 应用:Set<T> set = new HashSet<>();
HashSet成员方法: 1 add(E e):如果指定的元素尚不存在,则将其添加到此集合中 2 clear():从此集合中删除所有元素 3 isEmpty():true如果此集合不包含任何元素,则返回 4 contains(Object o):返回true此集合是否包含指定的元素 5 iterator():返回此集合中元素的迭代器 6 remove(Object o):如果存在,则从此集合中删除指定的元素 7 size():返回此集合中的元素数(其基数)
- 遍历集合与List类似
- 注意:Set会“去重”,其保证元素的唯一性依赖的是equals() 和 hashCode() 的方法,如果使用的<T>:泛型类中没有重写equals() 和 hashCode() 的方法,则默认调用Object类中的方法,而在Object中这俩种方法比较的是地址值是否相同,就会造成不同对象,内容相同,但地址不同,同时存入HashSet,造成元素重复。解决方法,在泛型类中,重新equals() 和 hashCode() 的方法,使其进行内容的比较。
- 结论Set结合的元素唯一性依靠其引用泛型类的equals() 和 hashCode() 方法
七 Map集合
- 特点:双列集合元素由键值对(Entry)构成:key -- value (key不可重复,value可重复)
- 应用:Map<T1 , T2> map = new HashMap<>(); (T1:键的类型,T2:值的类型)
HashMap成员方法: 1 put(K key, V value):将指定值与此映射中的指定键相关联,如果一个键第一次添加元素,则返回null,如果同一个键第二次添加,则会覆盖第一次的内容,并返回第一次的内容 2 remove(Object key):如果存在,则从此映射中删除指定键的映射 3 keySet():获取所有的key,返回Set集合; 4 get(Object key):返回指定键映射到的值(根据键获取值),或者null如果此映射不包含键的映射 5 remove(Object key):如果存在,则从此映射中删除指定键的映射 6 values():返回Collection此映射中包含的值的视图
遍历集合: 1 获得所有的键集合: Set<key的泛型类> key = map.keySet(); 2 遍历所有集合:使用迭代器或增强for循环 for (key的泛型类 i : key){ System.out.println(map.get(i)); //3 使用get获得value值 }