首页 > 其他分享 >m1_day19

m1_day19

时间:2024-05-10 23:45:49浏览次数:26  
标签:HashMap Optional 实例 m1 线程 方法 day19 Lambda

课程内容:
  • Map集合常见的面试题

  • Lambda表达式

  • 方法引用

  • Optional类


Map集合常见的面试题?
  • HashMap和Hashtable之间的区别?

    同步特性不同:
    Hashtable同一时间允许一个线程进行访问 效率较低 但是不会出现并发错误
    HashMap同一时间允许多个线程进行访问 效率较高 但是可能会出现并发错误
    jdk5.0开始 集合的工具类里面提供一个方法 将线程不安全的HashMap变成线程安全的Map集合 于是HashTable渐渐被淘汰了
    Map map = Collections.synchronizedMap(HashMap对象)

    对null容忍度不同
    Hashtable无论是主键还是值 都不能传入null 否则触发空指针异常
    HashMap无论是主键还是值 都可以传入null 但是由于主键唯一 所以只能输入一个null

    分组组数不同
    Hashtable默认分11个小组 程序员可以随意的指定
    HashMap默认分16个小组 程序员可以随意的指定 但是最终一定会变成2的n次方数

    出现的版本不同
    Hashtable since jdk1.0
    HashMap since jdk1.2
  • HashMap Hashtable ConcurrentHashMap之间的区别?

    Hashtable为了追求安全性 只要有一个线程进入哈希表之后 将整个哈希表全部加锁 同一时间最多一个线程进行访问 所以效率很低

    HashMap为了追求高效性 不再加锁 因此在多线程的情况下可能会出现并发错误

    ConcurrentHashMap为了追求高效性和安全性 采用了锁分离机制 将锁的粒度降低
    如果有一个线程进入哈希表 仅仅对该小组加锁 如果新来的线程也想要访问该小组 需要等待
    如果新来的线程想要访问未加锁的小组 直接访问
  • 在多线程的情况下 HashMap不安全 有什么可以替代的方案?

    Hashtable
    ConcurrentHashMap
    Map map = Collections.synchronizedMap(HashMap对象)
  • HashMap在jdk7.0前后的底层变化

    HashMap底层基于哈希表实现的
    jdk7.0及之前 哈希表由数组 + 链表组成
    数组:用来存储表头信息 为了方便元素快速定位应该去到的小组
    链表:用来组内添加元素
    头插法

    jdk8.0开始 哈希表由数组 + 链表 + 二叉树组成
    数组:用来存储表头信息 为了方便元素快速定位应该去到的小组
    链表:用来组内添加元素
      当链表长度 > 8个元素 由链表 转换成 二叉树
      当二叉树长度 < 6个元素 由二叉树 转换成 链表
    尾插法

Lambda表达式:
  • Lambda表达式其实是一个匿名函数 它允许参数以匿名函数的形式输入进去 用于简化代码

  • jdk8.0出现了一种新的操作符 -> [箭头操作符] 将整个语句分为两个部分

    Lambda表达式格式:(...) -> ....
    左侧:要覆盖的抽象方法的参数列表
    右侧:表示Lambda体 写具体的执行步骤
  • Lambda表达式需要注意:

    左侧参数列表只有一个参数的话()可以省略 建议不要省略   
    左侧参数列表里面的数据类型可以省略 jdk7.0开始 泛型可以自动推断
    右侧Lambda体如果只有一句话的话 return和{}可以省略
    右侧Lambda体有多句话的话 return和{}不能省略
  • 当调用一个方法 发现方法的参数是函数式接口的话 都可以使用Lambda表达式简化

    什么是函数式接口?
    接口里面只有一个抽象方法 -》 函数式接口
  • jdk8.0开始 新增四大函数式接口

    Consumer:消费型接口
    抽象方法:accept(x) -> void

    Predicate:断言型接口
    抽象方法:test(x) -> boolean
  • Jdk8.0开始 针对List集合新增:

    jdk8.0之前 List集合排序:
    Collections.sort(List):自然排序
    Collections.sort(List,Comparator):定制排序

    jdk8.0开始 List集合新增排序:
    list.sort(Comparator);定制排序
  • Jdk8.0针对所有单值集合新增:

    forEach((x) -> void):对集合里面的元素进行...处理
    removeIf((x) -> boolean):删除集合里面所有符合条件的元素
  • jdk8.0针对Map集合新增的方法

    forEach((k,v) -> void):对集合里面的元素进行...处理

jdk8.0 方法引用 是对Lambda表达式的再一种简化的版本
8.0之前 调用方法:
对象.实例方法()
类名.静态方法()
new 构造方法()

8.0开始 调用方法:
1.对象::实例方法
当在Lambda中 将对象.实例方法() 想要改成对象::实例方法
必须满足:
要覆盖的抽象方法参数列表和调用的实例方法的参数列表一致
要覆盖的抽象方法返回类型和调用的实例方法的返回类型一致

2.类名::静态方法

3.类名::实例方法
当在Lambda中 将对象.实例方法() 想要修改类名::实例方法
必须满足:
要覆盖的抽象方法的参数列表比调用的实例方法的参数列表多一个
且抽象方法的第一个参数可以作为实例方法的调用者
要覆盖的抽象方法返回类型和调用的实例方法的返回类型一致

4.构造方法::new

() -> 方法调用 -》 可能修改成 ::的版本

Optional类:jdk8.0新增的一个容器类 专门用来处理空指针异常的类 可以将任意一个可能为空的对象装进Optional容器中 可以有效的避免空指针异常
  • 如何将一个对象装进Optional容器中

    //如果对象为空 调用of直接出现空指针异常
    Optiona<泛型> op = Optional.of(对象);//几乎不用

    //如果参数为空 ofNullable不会出现空指针异常 但是返回一个空的容器对象:Optional.empty
    Optional<泛型> op = Optional.ofNullable(对象);
  • 如何从容器里面取值

    //在调用get()时 如果容器里面有值 将值返回 如果容器里面没有值 会出现
    //NOSuchElementException异常 通常get()搭配isPresent()使用
    if(Optional对象.isPresent()){
    类型 x = Optional对象.get();
    }else{
    ...
    }

    //orElse():将容器里面的值返回 如果容器中有值 将值返回 如果容器里面没有值 返回默认值
    类型 x = Optional对象.orElse(默认值);
  •  
 

标签:HashMap,Optional,实例,m1,线程,方法,day19,Lambda
From: https://www.cnblogs.com/zhaodenghui33/p/18185502

相关文章

  • m1_day21
    课程内容:枚举时间类枚举:enum当希望一个类的对象是有限个确定的非常使用枚举类型【枚举其实就是列举一个类的对象有哪些当需要使用的时候从已创建的对象中进行选择】四大类型:classinterfaceenum@interface类接口枚举注解如何定义枚举jdk5.0之......
  • m1_day22
    课程内容:Date类Calendar类LocalDateLocalTimeLocalDateTime类LocalDateTime类中的核心方法:如何得到当前时间:LocalDateTimex=LocalDateTime.now();如何得到指定时间:LocalDateTimey=LocalDateTime.of(年,月,日,时,分,秒);得到年月日时分秒-》......
  • m1_day5
    课程内容:Java中的分支Java中的循环Java中的循环控制Java中的数组Java中的分支ifelse语法格式:if(boolean条件){执行语句;}elseif(boolean条件){执行语句;}elseif(boolean条件){执行语句;}else{执行语句;}ifelse排他特性如果代码能进入......
  • m1_day6
    课程内容:Java中的数组数组的复制Java中的数组什么是数组一组数据数组可以理解成一个容器用来存储多个类型相同的元素数组优势:将一组零散的数据统一管理数组的基本用法创建数组对象:int[]data=newint[5];//空间大小int[]data=newint[]{元素,元......
  • m1_day8
    课程内容:多态方法重载方法覆盖构造方法扫描仪多态:一个对象总有不同的类型去定义它作用一:创建对象-》父类类型=new子类对象();Personx=newTeacher();Animaly=newCat();当我们使用多态创建完一个对象之后这个对象只能调用父类和子类共......
  • m1_day7
    课程内容:数组的排序引用数据类型的数组面向对象封装继承多态数组的排序:手动排序冒泡排序*自动排序Arrays.sort(数组对象);只能升序排序importjava.util.*;引用数据类型的数组:当我们创建一个引用数据类型的数组的时候其实里......
  • m1_day9
    课程内容:参数传递变量的共享方法封装的意义参数传递:Java中只有值传递Java中的基本数据类型传值引用数据类型传地址......
  • m1_day10
    课程内容:String类常见的面试题String类常见的20个方法String类常见的面试题:new和不new之间的区别?Stringx="etoak"; Stringy=newString("etoak");不new的方式涉及到常量池查找机制永远先去常量池查看是否缓存过如果缓存过那么直接将值取出来使用如果没......
  • m1_day12
    课程内容:单例模式:Java中的接口单例模式:控制一个类有且只有一个对象醉汉式私有化构造方法防止外界随意的创建对象创建一个私有的静态的属于本类类型的对象提供一个公共的静态的返回本类对象的方法懒汉式-》尚不完善Java中的接口:interface相......
  • m1_day11
    课程内容:StringBuffer类常见的方法面向对象的高阶特征访问权限修饰符static修饰符final修饰符abstract修饰符单例模式StringBuffer类常见的方法:*append(String):往字符串里面追加连接reverse():翻转字符串insert(int,char):往指定下标处插入......