一、 集合的遍历方式
1. 将集合转换为数组遍历(了解)
2. 增强for遍历
3. 迭代器遍历
代码:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test01 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");
System.out.println("==========转换为数组遍历=========");
Object[] array = collection.toArray();
for (int i = 0; i < array.length; i++) {
System.out.print((String)array[i]+"\t");
}
System.out.println();
System.out.println("========增强for遍历===========");
for (String s : collection) {
System.out.print(s+"\t");
}
System.out.println();
System.out.println("==========迭代器遍历===========");
Iterator<String> it = collection.iterator();
while (it.hasNext()){
String next = it.next();
System.out.print(next+"\t");
}
System.out.println();
System.out.println("==========lambda表达式遍历==========");
collection.forEach(item-> System.out.print(item+"\t"));
}
}
二、 List
2.1 简介
1.特点:
A.有序的 有索引 存取顺序一致
B.允许重复的元素 不唯一
C.集合中可以有空的元素
2.List 集合是一个接口 实现类 ArrayList 与 LinkedList
2.2 常用的方法
方法的名称 | 方法的描述 |
---|---|
void add(int index, E element) 增 | 在列表的指定位置插入指定元素 |
E get(int index) 查 | 返回列表中指定位置的元素 |
E remove(int index)删 | 移除列表中指定位置的元素 |
E set(int index, E element)改 | 用指定元素替换列表中指定位置的元素 |
代码:
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
//实例化一个集合
List li = new ArrayList();
li.add("迪丽热巴");
li.add("古力娜扎");
li.add("杨幂");
li.add("波多老师");
System.out.println(li);
li.add(0,"林志玲");
System.out.println(li);
li.remove(3);
System.out.println(li);
//修改
li.set(0,"小野老师");
System.out.println(li);
// li.set(100,"哈哈哈");
System.out.println(li.get(3));
}
}
2.3 List集合的循环
List有索引下标,也提供了一些带索引的方法 可以使用普通的for循环
2.4 迭代器 ListIterator
方法的名称 | 方法的描述 |
---|---|
E previous() | 返回的上一个元素 |
boolean hasPrevious() | 判断是否有上一个元素 |
void add(E e) | 将指定的元素插入列表 |
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test03 {
public static void main(String[] args) {
List li = new ArrayList();
//添加元素
li.add("周杰伦");
li.add("薛之谦");
li.add("许嵩");
li.add("凤凰传奇");
//转换我迭代器
ListIterator iter = li.listIterator();
//使用循环将指针移动最后一位
while (iter.hasNext()){
iter.next();
}
//使用while循环
while (iter.hasPrevious()){
System.out.println(iter.previous());
}
}
}
2.5 ConcurrentModificationException-并发修改异常
1.原因:使用迭代器遍历的集合 使用集合添加数据 集合在修改的数据之后 迭代器并不知道集合修改数据 产生并发异常
2.解决:
A.使用迭代器遍历 迭代器添加数据
B.使用传统的遍历方法 使用集合添加数据
问题代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test04 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("宋小宝");
li.add("贾玲");
li.add("沈腾");
li.add("张小斐");
//使用迭代器进行遍历
Iterator iter = li.iterator();
while (iter.hasNext()) {
String s = (String) iter.next();
if (s.equals("沈腾")){
li.add("马冬梅");
}
}
System.out.println(li);
}
}
解决代码-01:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test05 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("宋小宝");
li.add("贾玲");
li.add("沈腾");
li.add("张小斐");
//使用迭代器遍历 使用迭代器增加元素
ListIterator iter = li.listIterator();
//使用循环遍历
while (iter.hasNext()) {
String s = (String) iter.next();
if (s.equals("沈腾")){
iter.add("马冬梅");
}
}
System.out.println(li);
}
}
解决代码-02
import java.util.ArrayList;
import java.util.List;
public class Test06 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("宋小宝");
li.add("贾玲");
li.add("沈腾");
li.add("张小斐");
//使用普通for循环
for (int i=0;i<li.size();i++){
String s = (String) li.get(i);
if (s.equals("沈腾")){
li.add("马冬梅");
}
}
System.out.println(li);
}
}
三、 ArrayList
3.1简介
- ArrayList是List接口的实现类 都是使用父类的方法
- ArrayList 底层数组初始化的容器是10 (自动扩容1.5倍)
- 特点
- 以数组的方式进行存储
- 此实现不是同步的 多线程不安全 效率高
- 数组存储的数据结构的特点: 查询快 增删慢
3.2 主要方法
size()、isEmpty()、get()、set()、iterator() 和 listIterator()
四、 LinkedList
4.1 简介
- LinkedList是List接口的实现类 提供了一个对头与尾操作的方法
- 特点:
- 数据结构: 以链表的方式进行存储 特点: 增加、删除快 查询慢
- 此实现不是同步的 在多线程中是不安全的
4.2 常用的方法
方法的名称 | 方法的描述 |
---|---|
public void addFirst(E e) | 将指定元素插入此列表的开头 |
public void addLast(E e) | 指定元素添加到此列表的结尾 |
public E removeFirst() | 移除并返回此列表的第一个元素 |
public E removeLast() | 移除并返回此列表的最后一个元素 |
public E getFirst() | 返回此列表的第一个元素 |
public E getLast() | 返回此列表的最后一个元素 |
五、Set
5.1 简介
- Set集合是Collection集合的子接口
- 特点:
A. 无序 存取的顺序不一致,没有索引
B.唯一 不重复
5.2 set集合的遍历方式
- 使用增强for循环遍历
- 使用迭代器iterator遍历
六、 HashSet
6.1 简介
1.特点:
A.此类实现 Set 接口 Set接口的实现类
B.数据结构是有Hash表结构进行存储
C.此实现不是同步的 在多线程中是不安全
D.默认初始容量是16
-
HashSet 是无序不允许元素重复的集合。它是由HashMap实现的,数据结构与HashMap相同。
-
不能是用hashcode值来判断是否是同一个对象 因为引用数据类型 一般都会重写hashcode方法
-
如果要把一个对象存入HashSet中,要重写该对象对应类的hashCode()方法和重写其equals()方法。
-
hashCode值是根据内存地址生成的一个十进制的整数 不能根据hashcode值来表示是内存地址值
-
Object中提供了一个方法
public int hashCode() ==>返回该对象的哈希码值 -
注意点:字符串重存在的hash冲突: 内容不同 但是hashcode值的相同
数据结构:JDK1.7 数组+链表
Jdk 1.8 数组+链表+红黑树(当链表长度大于8转化为红黑树)
七、 TreeSet
7.1 简介
1.特点:
A.元素的自然顺序对元素进行排序
B.Comparable 或 Comparator 提供这个两个类来定义比较规则
C.此实现不是同步的 在多线程中是不安全
2.排序规则:
A.数值类型是按照升序(从小到大)进行排列
B.字符串类型是按照字符串首字母的ascll来进行排序
C.自定义的引用数据类型 直接添加集合中会报错 没有确定其比较的规则
3.引用数据类型的比较
A.定义类中能够实现(Comparable )这个接口
this > object 返回是整数 按照升序进行排序
this = object 返回是0 表示是相同
this < object 返回的是负数 按照降序进行排序
B.实例化集合的手传递比较的规则(Comparator)
TreeSet是一个有序集合,是基于TreeMap实现的,非线程安全
八、LinkedHashSet
1.特点:
A.具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现
B.数据结构 hash表+双链表 有序、不重复
C.此实现不是同步的 多线程中不安全的
数据结构:哈希表 + 链表
九、Map
Map是由键值对组成的集合,一个key对应一个vlaue , 不能存在相同的key值,但是可以存在相同的 value 值
9.1 map集合的遍历方式
- 先获取所有的键,再通过键取value值
- 将键值对封装成对象,再通过对象调用方法取值: entry.getKey()、entry.getValue()
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
map集合的两种遍历方式
*/
public class Demo02 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("a","张杰");
map.put("b","谢娜");
map.put("c","周星驰");
map.put("d","刘德华");
map.put("e","刘德华");
//方式一
Set set = map.keySet();
for (Object o : set) {
System.out.println(o+"\t"+map.get(o));
}
System.out.println("================");
//方式二
Set set1 = map.entrySet();
for (Object o : set1) {
Map.Entry entry = (Map.Entry) o;
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
}
}
9.2 HashMap
9.2.1简介
特点:
A.数据结构基于哈希表
B.并允许使用 null 值和 null 键
C.此实现不是同步的 在多线程中是不安全
D.默认初始化容量是16
9.2.2 HashMap与HashSet比较
相同点: 都是以hash表结构来进行存储
不同点:
A.HashMap 数据结构只针对与键 HashSet的数据结构针对于是元素
B.HashSet集合的底层也是使用HashMap来进行存储 只能用于HashMap键的数据结构
9.3 LinkedHashMap
9.3.1 简介
A.Map 接口的哈希表和链接列表实现 数据结构 hash表结构 与链表进行存储
B.具有可预知的迭代顺序
C.此实现不是同步的 多线程中是不安全的
9.4 TreeMap
TreeMap 是一个有序的集合,非同步,基于红黑树实现,每一个key-value节点作为红黑树的一个节点。TreeMap存储时会根据key进行排序,其中排序方式分为两种,一种是自然排序,一种是定制排序。
自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。
定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口。如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0。
十、 泛型
10.1概念
1.使用的场景:定义的集合的时候 不确定其数据数据类型 就可以使用泛型
泛型可以理解为是一个变量 变量用于接收数据类型
2.泛型的使用
在实例化对象的时候可以确定其数据类型
例子:List<数据类型> li = new ArrayList<数据类型>();
注意点:
A.前后的泛型必须是一致
B.在jdk1.7之后出现了菱形的泛型 后面的泛型数据类型可以不写
C.泛型只能使用引用数据类型 不能使用基本数据类型
3.好处:
A.避免进行强制类型转换
B.将运行时的错误提前编译期间
4.泛型使用的符号
一般泛型使用的符号都是大写的符号…任意的大写字母都是可以的
E V K W T Z …
10.2 定义泛型类
1.语法:
访问修饰符 class 类名<泛型> {
类中的所有的成员都可以使用其泛型
}
2.例子:public class ArrayList<E>{}
10.3 定义泛型方法
1.语法:
访问修饰符 <泛型> 返回值类型 方法的名称(参数列表) {
方法体
return 返回值
}
2.说明:可以给普通方法加泛型 也可以给静态的方法加泛型
3.注意点:
A.普通的成员方法是可以使用类定义的泛型
B.静态方法不能使用类的泛型 因为静态资源优先进行加载
10.4 定义泛型接口
1.体现:A.实现类确定其泛型 B.实现类不确定其泛型
2.例子:实现类确定其泛型
public interface Iterator<E>{
E next()
}
public final class Scanner implements Iterator<String>{
public String next()
}
3.例子:实现类也不确定其泛型
public interface List<E>{
boolean add(E e)
}
public class ArrayList<E> implements List<E>{
public boolean add(E e)
}
10.5 泛型通配符
1.概念:泛型通配符可以表示任意的数据类型 泛型的统配符号使用 ?来表示
泛型通配符一般作为方法的参数使用 实例化集合对象的时候不能使用通配符表示 泛型是没有继承的概念
2.解释特殊的通配符
<? extends E> E本身或者是其子类
<? super T> T本身或者是其父类
十一、Collections
方法名称 | 方法的描述 |
---|---|
public static int binarySearch(List<? extends Comparable<? super T>> list, T key) | 查找指定元素在集合中的索引值(集合需要按照升序进行排列) |
public static void copy(List<? super T> dest, List<? extends T> src) | 将所有元素从一个列表复制到另一个列表 |
public static int frequency(Collection<?> c, Object o) | 返回指定 collection 中等于指定对象的元素数 |
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) | 集合中的最大值 |
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) | 获取集合中最小值 |
public static void reverse(List<?> list) | 反转指定列表中元素的顺序 |
public static void shuffle(List<?> list) | 使用默认随机源对指定列表进行置换 |
public static <T extends Comparable<? super T>> void sort(List list) | 按照升序进行排列 |
public static void swap(List<?> list, int i, int j) | 交换集合中指定索引的元素 |
案例:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(5);
list.add(7);
list.add(9);
System.out.println(Collections.binarySearch(list,7));
List<Integer> list01 = new ArrayList<>();
list01.add(8);
list01.add(8);
list01.add(8);
list01.add(8);
list01.add(8);
list01.add(8);
Collections.copy(list01,list);
System.out.println(list);
System.out.println(list01);
Collections.fill(list01,10);
System.out.println(list01);
int count = Collections.frequency(list01, 10);
System.out.println(count);
System.out.println(Collections.max(list));
System.out.println(Collections.min(list));
Collections.reverse(list);
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
Collections.swap(list,0,1);
System.out.println(list);
}
}