基础
是单例结合的顶层接口,他表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
可以通过具体的接口ArrayList接口
栗子1:
public class CollectionDemo01 {
public static void main(String[] args){
//创建Collection集合的对象
Collection<String> c = new ArrayList<String>();
//添加元素:boolean add(E e)
c.add("hello");
c.add("world");
c.add("java");
//输出集合对象
System.out.println(c);
}
}
Collection集合常用方法
方法名boolean add(E e)添加元素
|方法名 | 说明|
|-boolean add(E e)-|-添加元素-|
| boolean remove(Object o) | 从结合中移除指定的元素 |
| void clear() | 清空集合中的元素 |
| boolean contains(Object o) | 判断集合中是否存在指定的元素 |
| boolean isEmpty() | 判断集合是否为空 |
| int size() | 集合的长度,也就是集合中元素的个数 |
栗子2
public class CollectionDemo02 {
public static void main(String[] args){
//创建集合对象
Collection<String> c = new ArrayList<String>();
//boolean add(E e )添加元素
Sysout.out.print(c.add("hello"));
//remove
Sysout.out.println(c.remove(“world”));
//clear
c.clear();
//contains(Object o)
Sysout.out.println(c.contains(“world”));
//isEmpty
Sysout.out.println(c.isEmpty(“world”));
//输出集合对象
Sysout.out.println(c);//可以存储重复元素 返回值不一定是true
//int size
Sysout.out.println(c.size(“world”));
}
}
Collection集合的遍历
方法
Iterator interor();返回此集合中元素的迭代器,返回值类型也是迭代器。
迭代器是通过集合的 interor()方法得到的,所以我们说他是依赖于集合而存在的
iterator中的常用方法
E next(),返回迭代中的下一个元素
boolean hasNext()如果迭代具有更多元素,则返回true
public class CollectionDemo01 {
public static void main(String[] args){
//创建Collection集合的对象
Collection<String> c = new ArrayList<String>();
//添加元素:boolean add(E e)
c.add("hello");
c.add("world");
c.add("java");
Iterator<String> it = c.iterator();//使用多台的范式得到iterator对象
Sysout.out.println(it.next());
Sysout.out.println(it.next());
Sysout.out.println(it.next());//每次多不一样 ,最后一个的下一个就会显示异常,表示被请求的元素不存在
}
}
public class CollectionDemo01 {
public static void main(String[] args){
//创建Collection集合的对象
Collection<String> c = new ArrayList<String>();
//添加元素:boolean add(E e)
c.add("hello");
c.add("world");
c.add("java");
Iterator<String> it = c.iterator();//使用多台的范式得到iterator对象
if(it.hasNext()){
Sysout.out.println(it.next());
}
if(it.hasNext()){
Sysout.out.println(it.next());
}
if(it.hasNext()){
Sysout.out.println(it.next());
}
if(it.hasNext()){
Sysout.out.println(it.next());//如果没有元素就不会抛出异常
}
}
}
用while改进
变为
while(it.hasNext()){
//Sysout.out.println(it.next());
String s = it.next();
System.out.println(s);
}
集合的使用步骤
第一步:创建集合对象
第二步:添加元素{创建元素,添加元素到集合,合并添加元素到集合}
第三步:遍历结合{通过集合对象个获取迭代器对象,通过迭代器对象的hasNext方法判断是否还有元素,通过迭代器对象的next方法获取下一个元素}
案例
Collection集合存储学生对象并遍历
定义学生类
创建ccollection集合对象
创建学生对象
吧学生添加到集合
遍历结合(迭代器方式)
public class CollectionDemo{
public static void main(String[] args){
Collection<Student> c = new ArrayList<Student>();
}
}
LIst集合
基础
在javaUtil包下 有索引 有set集合不通过 通常允许有重复元素
特点
有序:存储和去除的元素顺序一致
可重复:存储的元素可以重复
栗子
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
//输出集合对象
Sysout(list);
//迭代器的方式遍历
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
List集合的特有方法
List集合的方法Collection是没有的 但是他的儿子ArrayList集合是有的
演示
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
list.add(1,"javaee"); //发现world往后一个位置 从0开始 如果越界就会报异常
System.out.println(list.remove(1));//发现删除了指定元素并且返回了呗删除的元素,如果越界,也会出现索引越界异常
System.out.println(list.set(1,javaeee));//输出被修改的元素,越界异常仍存在
System.out.println(list.get(1));//返回指定位置的元素
//输出集合对象
System.out.println(list);
另一种遍历方式
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
循环改进遍历
for(int i=0; i<list.size();i++){
String s = list.get(i);
System.out.println(s);
}
案例List存储学生对象并遍历
思路:定义学生类
创建List集合对象
创建学生对象
把学生添加到集合
遍历集合
List<Student> s1 = new Student("张三",30);
List<Student> s1 = new Student("李四",30);
List<Student> s1 = new Student("王五",30);
list.add(s1);
list.add(s2);
list.add(s3);
//迭代器方式
Iterator<Student> it = list.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println("-----");
//for循环方式
for(int i = 0;i<list.size();i++){
Student s = list.get(i);
Sysout.out.println(s.getName()+","+s.getAge())};
}
并发修改异常
引栗:遍历结合得到一个匀速,看有没有world元素,如果有就添加一个javaee元素 请写代码实现
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
Iterator<Student> it = list.iterator();
while(it.hasNext()){
Student s = it.next();//并发修改异常
if(s.equals("world"){
list.add("javaee");
})
发现出现异常:并发修改异常
实际上有一个实际修改次数和预期修改次数如果两个不一样就会抛出并发修改异常
通过集合去修改元素就会让add方法的实际修改方法++
解决方式
使用for遍历集合
把next变为get get方法不会对预期修改值和实际修改值判断
总结
并发修改异常:
ConcurrentModificationException
产生原因:
迭代器在遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值得不一致
解决方案:
用for循环遍历,然后用集合对象做对应的操作即可
列表迭代器ListIterator
是list集合特偶的迭代器,通过listIterator()方法得到
继承Iterator
允许程序员沿着任意方向迭代,在迭代期间修改列表,并获取列表中迭代器的当前位置
方法
常用方法:
E next();返回迭代中的下一个元素
boolean hasNext():如果迭代具有更多元素,则返回true
E previoud():返回列表中的上一个元素
boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有很多元素,则返回true
viod add(E e)将指定元素添加到列表
图中分别显示了正向遍历与逆向遍历
add方法
Iterator没有add方法 之前使用集合的添加方法添加的
ListIterator是有add方法的 没有报错的原因是之后实际修改次数和预期修改次数会重新赋值
增强for循环
格式:
for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
范例:
int[] arr = {1,2,3,4,5};
for(int i :arr){
System.out.println(i);
}
测试内部原理其实是Iterator迭代器
for(String s: list){
if(s.equals({“world”)){
list.add(“javaee”);
}
}
明显抛出了异常
用三种方式遍历学生对象
思路:如上
遍历方式:迭代器:集合特有的遍历方式
普通for:带有索引的遍历方式
增强for:最方便的遍历方式
实现
List<Student> list = new ArrayList<>();
//创建学生对象
Student s1 = new Student("张三",30);
Student s2 = new Student("李四",30);
Student s3 = new Student("王五",30);
//吧学生添加到集合
list.add(s1);
list.add(s2);
list.add(s3);
//迭代器遍历
Iterator<Student> it = list.iterator();
while(it.hasNext()
数据结构
是指相互之间存在一种过着多种的关系
常见数据结构之栈
数据进入栈模型的过程称为:压栈或者进栈
数据离开栈的模型过程称为:弹栈或者出栈
是一种先进后出的模型
常见数据结构之队列
数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列的模型的过程称为:出队列
是一种先进先出的模型
常见数据结构之数组
查询数据通过索引定位,查询任意数据耗时相同,查询效率高删除数据时,后面数据前移效率低 添加数据时,后面的全后移 效率低
是一种查询快,增删慢的原型
常见数据结构之链表
是一种增删快*(对比数组),查询慢的原型(必须从头开始查询)
List集合
子类特点
常用子类ArraList(数组实现)与LinkList(链表实现)
练习
剩下两种
案例:ArrayList集合存储学生对象用三种方式遍历
LinkedList集合的特有功能
栗子
Set集合
基础
特点
不包含重复元素的集合
没有带索引的方法,所以不能会用普通for循环比那里
hashset对集合的顺序不做保证
栗子
存储字符串并遍历
使用增强for实现遍历
结果是
world
java
hello
和存储顺序是不一致的
如果添加元素的时候又重复的 会出现以下结果
重复的没有添加进去
哈希值
基础
哈希值是jdk根据对象地址或者字符串或者数字算出来的int类型的数值
object类中有一个方法就可以获得对象的哈希值
public int hashCode();
特点
举例
同一个对象多次调用hashcode方法返回值是相同的
默认情况下 不同对象的哈希对象的哈希值是不同的(object的情况下)
通过方法重写可以实现不同对象的哈希值是相同的
字符串的类有重写了哈希code 的方法所以一样
总结
对象的哈希值特点
同一个对象多次调用hashcode方法返回的哈希值是相同的
默认情况下 不同对象的哈希值是不同的 二重写hashcode方法 可以实现让不同对象的哈希值相同
HashSet集合的特点
对集合的迭代顺序不做保证
底层数据结构是哈希表
没有带缩影的方法 所以不能使用普通for循环遍历
由于是set集合 所以不包含重复元素的集合
HaSet集合的练习
存储字符串并遍历
hashset保证唯一性的分析
可以知道是add方法中完成了唯一性
进行跟进put方法 其内部也调用了一个hash方法
总结
hashset集合存储元素要保证元素唯一性 需要重写hashcode和equals方法
常见数据结构之哈希表
处采用数组加连表实现
16 取余数得到存储的位置
如果一样 比较哈希值 然后发现相同就判定为重复 如果不是再存进去
如果这个位置没有元素就存进去
案例 hashset存储学生对象并遍历
需求 要保证唯一性
思路:定义学生类 创建hashset集合对象 创建学生对象 吧学生添加到集合 遍历结合 增强for 在学生类中重写两个方法 hashcode 和equals方法 通过自动生成
和之前一样 但是要重写hash方法
linkedhashset集合概述和特点
她存储和去除的元素顺序一样 由连表保证有序 由哈希表保证唯一
TreeSet集合
特点
元素有序
自然排序 也可以对象功能可以比较排序 取决于是有参还是无参
TreeSet():根据元素的自然排序进行排序(无参)
TreeSet(Comparator comparator):有参根据指定的比较器排序
没有带索引的方法 只能使用增强for
不包含重复元素的集合
注意
集合只能存储引用类型 所以不能存储int类型 只能存储包装类
’所有基本类型存储的时候只能存储包装类型
jdk5之后可以自动装箱
发现结果是根据从小到大排序了 同样不包含重复元素
自然排序Comparable的使用
栗子
存储学生对象遍历 创建集合使用余灿构造方法
要求按照年龄从小到大排序 年龄相同实 按照姓名的字母顺序排序
创建集合对象
创建学生对象
把学生添加到集合
遍历集合
出现类转换异常
每个元素的时候都按照出处比较的规则进行比较
如果是0 两者相同 判定为不添加
如果是1 添加 郑旭 -1 降序
比较器排序Comparator的使用
存储学生对象遍历,创建TreeSet集合使用带参构造方法
要求和上面一样
使用匿名内部类的方式
不能使用类的私有成只能用get方法
规则
主函数以及添加
结论
用treeset集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序 就是让集合构造方法接受comparator的实现类对象 重写compare(t1,t2)方法
- 未看成绩排序248