124344534453

迭代器的细节注意点:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增加或者删除

1.迭代器在遍历集合的时候是不依赖索引的2.迭代器需要掌握三个方法:
Iterator it = list.iterator( );while( it.hasNext()){
string str = it.next( );system.out.println(str);
}
3.迭代器的四个细节:
如果当前位置没有元素,还要强行获取,会报NoSuchElementException
迭代器遍历完毕,指针不会复位
循环中只能用一次next方法

集合进阶-03-增强for介lambda表达式

增强for遍历
增强for的底层就是迭代器,为了简化迭代器的代码书写的。
它是JDK5之后出现的,其内部原理就是一个lterator迭代器
所有的单列集合和数组才能用增强for进行遍历。

//1.创建集合并添加元素
collection<String> coll = new ArrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//2.利用增强for进行遍历//注意点:
//s其实就是一个第三方变量,在循环的过程中依次表示集合中的每一个数据
for(String s : coll){
System.out.println(s);
}

增强for格式:
for(数据类型变量名:集合/数组){
}
快速生成方式:
集合的名字+ for 回车

增强for的细节
修改增强for中的变量,不会改变集合中原本的数据。
在这里插入图片描述

//1.创建集合并添加元素
collection<string> coll = new ArrayList<>();
coll.add( "zhangsan");
coll.add( "1isi");
coll.add( "wangwu" );
//2.利用匿名内部类的形式
//底层原理:
//其实也会自己遍历集合,依次得到每一个元素
//把得到的每一个元素,传递给下面的accept方法
//s依次表示集合中的每一个数据
coll.forEach( new Consumer<String>( ) {
@Override
public void accept( String s) {
system.out.println( s );
}
});
// lambda表达式
coll.forEach(s -> system.out.println(s)) ;

List系列集合独有的方法:
void add(int index,E element)
在此集合中的指定位置插入指定的元素
E remove(int index)
删除指定索引处的元素,返回被删除的元素
E set(int index,E element)
修改指定索引处的元素,返回被修改的元素
E get(int index)
返回指定索引处的元素

在这里插入图片描述

//1.迭代器
Iterator<String> it = list.iterator( );
while(it.hasNext( )){
string str = it.next( );
system.out.println(str);
}

//2.增强for
//下面的变量s,其实就是一个第三方的变量而已。//在循环的过程中,依次表示集合中的每一个元素
for (string s : list) {
system.out.println( s ) ;
}

// 3.Lambda表达式
//forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素//并把每一个元素传递给下面的accept方法
//accept方法的形参s,依次表示集合中的每一个元素
list.forEach(s->system.out.println(s) );

//4.普通for循环
//size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
for (int i = o; i < list.size(); i++) {
//i:依次表示集合中的每一个索引
string s = list.get(i);
system.out.println(s);
}

在这里插入图片描述

集合进阶-05-数据结构

常见的数据结构

  1. 队列
  2. 数组
  3. 链表
  4. 二叉树
  5. 二叉查找树
  6. 平衡二叉树
  7. 红黑树

集合进阶07-LinkedList和迭代器的源码.(跳过)

LinkedList集合
底层数据结构是双链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。

在这里插入图片描述

集合进阶-08-泛型类、泛型方法、泛型接.

泛型深入
**泛型:**是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
泛型的格式:<数据类型>
**注意:**泛型只能支持引用数据类型。

<String>这个就是泛型

//1.创建集合的对象
ArrayList<String> list = new ArrayList<>();
//2.添加数据
//list.add( 123);
list.add( "aaa");
// list.add(new Student( "zhangsan",123));
//3.遍历集合获取里面的每一个元素
Iterator<String> it = list.iterator();
while(it.hasNext()){
string str = it.next();
//多态的弊端是不能访问子类的特有功能
//obj.length( );
//str.length( );
system.out.println(str);
}

泛型的好处
统一数据类型。
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。
在这里插入图片描述

集合进阶-09-泛型的通配符和综合练习

泛型不具备继承性,但是数据具备继承性

此时我们就可以使用泛型的通配符:
?也表示不确定的类型
他可以进行类型的限定
? extehds E:表示可以传递E或者E所有的子类类型
? super E:表示可以传递E或者E所有的父类类型

应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符:
关键点:可以限定类型的范围。
4.哪里定义泛型?

  • 泛型类:在类名后面定义泛型,创建该类对象的时候,确定类型
  • 泛型方法:在修饰符后面定义方法,调用该方法的时候,确定类型
  • 泛型接口:在接口名后面定义泛型,实现类确定类型,实现类延续泛型
    5.泛型的继承和通配符
  • 泛型不具备继承性,但是数据具备继承性
  • 泛型的通配符:?
    ? extend E
    ? super E.
    6.使用场景
  • 定义类、方法、接口的时候,如果类型不确定,就可以定义泛型
  • 如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符

集合进阶-10-数据结构(二叉树,二叉查…

数据结构(二叉树)遍历方式

前序遍历
中序遍历
③后序遍历
④层序遍历
在这里插入图片描述

集合进阶-11数据结构(平衡二叉树旋转…

数据结构(平衡二叉树)旋转机制
规则1:左旋
规则2:右旋
触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树

集合进阶-12-数据结构(红黑树、红黑规…

在这里插入图片描述
数据结构(红黑树)红黑规则

  • 每一个节点或是红色的,或者是黑色的
  • 根节点必须是黑色
  • 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
  • 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
  • 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
    在这里插入图片描述
    在这里插入图片描述

集合进阶-13-HashSet、LinkedHashSet…

set系列集合

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
    Set集合的实现类
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引
    Set接口中的方法上基本上与collection的API一致。
    在这里插入图片描述
//1.创建一个Set集合的对象
set<String> s = new Hashset<>();
//2,添加元素
//如果当前元素是第一次添加,那么可以添加成功,返回true
//如果当前元素是第二次添加,那么添加失败,返回false

  1. Set系列集合的特点
  • 无序、不重复、无索引
  • Set集合的方法上基本上与Collection的API一致
  1. Set集合的实现类特点
  • HashSet :无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引

Hashset底层原理

HashSet集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据性能都较好的结构
哈希表组成
JDK8之前:数组+链表
JDK8开始:数组+链表+红黑树

哈希值

  • 根据hashCode方法算出来的int类型的整数
  • 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算·
  • 一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

对象的哈希值特点

  • 如果没有重写hashCode方法,不同对象计算出的哈希值是不同
  • 如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
    在这里插入图片描述
    HashSet底层原理
    JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树
    如果集合中存储的是自定义对象,必须要重写hashCode和equals方法
    在这里插入图片描述

集合进阶-14-TreeSet第一种排序方式超…

TreeSet集合默认的规则
对于数值类型:Integer , Double,默认按照从小到大的顺序进行排序。
对于字符、字符串类型;按照字符在ASCII码表中的数字升序进行排序。

双列集合的特点

  1. 双列集合一次需要存一对数据,分别为键和值
  2. 键不能重复,值可以重复
  3. 键和值是一一对应的,每一个键只能找到自己对应的值
  4. 键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”

Map集合常用的API

在这里插入图片描述

//1.创建Map集合的对象
Map<String, string> m = new HashMap<>();
//2.添加元素
// put方法的细节:
//添加/覆盖

//在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中
//在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。

m.put("郭靖","黄蓉");
m.put("韦小宝","沐剑屏");
m.put("尹志平","小龙女");
string value = m.put("韦小宝""双儿");
system.out.println(value);
//3.打印集合
system.out.println(m); //???

-Map集合的第一种遍历方式


//Map集合的第一种遍历方式
//1.创建Map集合的对象
Map<String,string> map = new HashMap<>();
//2.添加元素
map.put("尹志平","小龙女");
map.put("郭靖","穆念慈");
map.put("欧阳克","黄蓉");
//3.通过键找值
//3.1获取所有的键,把这些键放到一个单列集合当中
set<String> keys = map.keySet();
//3.2遍历单列集合,得到每一个键
for ( string key : keys) {
//system.out.println( key ) ;
//3.3利用map集合中的键获取对应的值
getstring value = map.get(key);
system.out.print1n(key + " =" + value);
}

-Map集合的第二种遍历方式

public class A03_MapDemo3 {
public static void main(String[ ] args) {
//Map集合的第二种遍历方式

//1.创建Map集合的对象
Map<String,string> map = new HashMap<>();
//2.添加元素
//键:人物的外号//值:人物的名宁
map.put("标枪选手","马超");
map.put("人物挂件","明世隐");
map.put("御龙骑士","尹志平");
//3.Map集合的第二种遍历方式/通过键值对对象进行遍历
//3.1通过一个方法获取所有的键值对对象,返回一个Set集合
Set<Map.Entry<string,string>> entries = map.entrySet();
//3.2遍历entries这个集合,去得到里面的每一个键值对对象
for (Map.Entry<String,String> entry : entries) {//entry ---’“人物挂件" ,"明世稳"
//3.3 利用entry调用get方法获取键和值
string key = entry.getKey( );
string value = entry.getvalue();
system.out.print1n(key + "=" + value);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值