JAVA补充(三)collection集合

基础

是单例结合的顶层接口,他表示一组对象,这些对象也称为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值