java第14课

问题1:解决死锁的方法

  1. 破坏______条件:__
  2. 破坏______条件:__
  3. 破坏______条件:__
  4. 破坏______条件:__

问答2:List,set,Queue的区别

判断3:队列先入先出,栈先入后出()

判断4:并行存在竞争,并发不存在竞争()

进程与线程

进程(process)是操作系统的任务单元,每一个程序启动后,操作系统都会为其分配进程编号PID

线程(Thread)是进程中的任务单元,程序启动以后,首先创建主线程,可以在主线程中开辟子线程,每一个线程都对应一个虚拟机栈,栈是私有的,堆和方法区是线程共享的

串行:在单台机器单线程执行

并行 :在多台机器上并行执行

并发:在一台机器上并行执行(存在资源竞争)

Java中实现多线程的方法4种

  1. 继承Thread类,重写run方法
  2. 实现Runnadle接口,重写run方法
  3. 实现Callable接口,重写call方法
  4. 使用线程池类

锁与死锁

锁是java保证线程操作原子性的一种机制

锁是数据库中保证事务操作原子性的一种机制

Java中的锁有synchronized与lock

Synchronized:关键字,,可以锁代码块和方法

Lock锁:类,,可以锁代码块

产生死锁的原因

我们把数据类型分为线程安全类型和线程不安全类型

如果一个数据类型需要我们自己动手加锁保证操作原子性,即线程不安全的数据类型;

线程不安全

线程安全

Arraylist

Vector,CopyOnwriteArraylist

Hashmap

Hashtable,ConcurrentHashMap

String,StringBuilder

stringBuffer

Int,integer

Atomiclinteger

产生死锁的原因

两个线程各自持有一个对象的锁,没有释放,去请求对方手上的锁;

产生死锁的条件

互斥条件:锁具有排他性

请求与保持条件:一个线程因为请求其他资源被阻塞时,对以获取的资源保持不释放

不剥夺条件:一个线程没有主动释放资源之前,是不可以被剥夺

循环等待条件:A线程持有a锁,B线程持有b锁,在不释放自己持有的锁,去请求对方的锁,会形成双方循环等待;造成永久阻塞;

解决方法:

一次锁住所有资源;

破坏任一死锁条件

  1. 破坏互斥条件:用共享锁,在同一时刻,可以多线程(只读)
  2. 破坏请求与保持条件:一次性申请所有资源
  3. 破坏不剥夺条件:一个线程因为请求阻塞,自动释放
  4. 破坏循环等待条件:前者顺序,后者逆序

Coollection与Map的区别

  1. 两个是官方提供的集合容器的两大体系的顶层接口
  2. Coollection代表单元素集合体系,,Coollection接口继承了Iterable接口;所有的子类中有迭代器的实现,Map没有;
  3. Map是kv键值对集合体系

List,set,Queue的区别

  1. 都是Coollection体系下的子接口,分别代表三个体系
  2. List体系特点,有序不唯一
  3. Set体系特点,无序唯一;
  4. Queue体系特点,先入先出;

队列和栈的区别

  1. 队列是一种FIFO的先入先出的结构
  2. 栈是一种FILO的先入后出的结构

Java集合体系中的linked list类实现队列和栈结构

在链表中,头入尾出,尾入头出,队列

在链表中,头人头出,尾入尾出,栈

Array和ArrayList的区别

Array是数据类型数组,定长

ArrayList是底层Array的类

ArrayList和LinkedList的区别

ArrayList和Vecter的区别(带一下CopyOnWriteArrayList)

  1. ArrayList是线程不安全的,Vector是线程安全,ArrayList所有方法都没有加同步锁

Vector中所有的方法都加了Aynchronized同步锁,,,JDK1.5版本发布一个CopyOnWirteArrayList,使用了Lock锁实现线程安全然后弃用了Vector,因为Lock锁的性能

比synchronized的锁性能更好

在并发编程中,如果多个线程共享一个ArrayList,必须考虑安全问题,可以在代码中对ArrayList的操作代码加锁,或者直接使用线程安全的CopyOnWirteArrayList,不考虑线程安全问题,优先使用ArrayList;ArrayList的性能更好;

Array如何转换为Arrayliast,,Arraylist如何转换Array

  1. Arrays.asList()可以把数组转换成list,参数数组,返回值List
  2. ArrayList类中提供了list.toArrayList(要转换的数组(类型[]){})

HashSet和TreeSet的区别

都是Set接口的子类

HashSet的底层是HashMap,他将数据储存在HashMap的key中

无序唯一因为key无序唯一

TreeSet的底层是TreeMap,他将数据储存在TreeMap的key

有序唯一因为key有序唯一

HashMap和HashTable区别(带ConcurrentHashmap)

HashMap是线程不安全的,HashTable是线程安全,HashTable所有方法都没有加同步锁

HashTable中所有的方法都加了synchronized同步锁,,,JDK1.5版本发布一个ConcurrentHashmap,使用了Lock锁实现线程安全然后弃用了HashTable,因为Lock锁的性能比synchronized的锁性能更好

在并发编程中,如果多个线程共享一个HashMap,必须考虑安全问题,可以在代码中对HashMap的操作代码加锁,或者直接使用线程安全的ConcurrentHashmap,不考虑线程安全问题,优先使用HashMap;HashMap的性能更好;

HashMap支持null但只能有一个,key;Hashtable不支持key为null抛NPE;ConcurrentHashmap不支持key与value为null;

HashMap在1.8以后,设置了阈值=8,当链表超过阈值转换红黑树;,Hashtable被舍弃

初始容量:Hashmap默认初始容量16,扩容两倍

  Hashtable默认初始容量11,扩容2n+1

  HashMap手动指定初始容量,会主动转换最近的2^n

  Hashtable手动给定初始容量,会直接使用给定大小

Hashtable采用了锁全表的设计,ConcurrentHashmap采用了分段锁的设计,锁粒更细,性能更好;

Hashmap和TreeMap的区别

Hashmap底层是数组加链表/红黑树,key是无序,唯一的

TreeMap底层是红黑树,key是有序,唯一的

HashMap的性能比TreeMap更好,但需要有序key使用TreeMap;

HashMap的底层原理,,(数据结构+put()流程+resize()流程)

什么是哈希碰撞,怎么解决,HashMap采用什么策略

如果有两个不同字符串通过同样的哈希算法计算出来的哈希码是一样的,则称他们发生了哈希碰撞,哈希冲突,解决方法:

1.开放地址法

2.拉链法(链地址法)HashMap默认使用的就是这种

### HashMap为什么不直接使用key的hashCode()处理后的哈希值直接作为落曹的索引号**HashMap那怎么解决呢?**

Or这题也可以这样问“HashMap的底层是如何计算key落曹时的索引的”

答:`hashCode()`方法返回的是int整数类型,其范围为-(2 ^ 31)~(2 ^ 31 - 1),约有40亿个映射空间,而HashMap的容量范围是在16(初始化默认值)~2 ^ 30,HashMap通常情况下是取不到最大值的,并且设备上也难以提供这么多的存储空间,从而导致通过`hashCode()`计算出的哈希值可能不在数组大小范围内,进而无法匹配存储位置;

1. HashMap自己实现了自己的`hash()`方法,通过两次扰动使得它自己的哈希值高低位自行进行异或运算,降低哈希碰撞概率也使得数据分布更平均;
2. 在保证数组长度为2的幂次方的时候,使用`hash()`运算之后的值与运算(&)(数组长度 - 1)来获取数组下标的方式进行存储,这样一来是比取余操作更加有效率,二来也是因为只有当数组长度为2的幂次方时,h&(length-1)才等价于h%length,三来解决了“哈希值与数组大小范围不匹配”的问题;

==与equals()的区别

A==b……a.equals(b)

==比较内存地址

equals()方法是Objeck类中方法,默认也是用==比较地址

可以被任意类重写继承,通过查看官方源码

想要修改equals()方法比较规则,可以重写equals()方法

String类就重写equals()方法的比较规则,由默认的,更改为比较字符串;

为什么重写equals()方法,必须HashCode()重写

HashMap的底层采用了key的hashcode()来计算数组索引index

如果数组[index]为null说明key不存在,直接落槽插入

如果数组[index]不为null说明该位置有key存在,但

重写equals的目的是为了不去比较对象的内存地址,改为对象的内容,如果一个类重写了equals没有重写hashcode,就可能会出现相同对象,不同地址,违反唯一性,,,故

能否使用任意数据类型作为HashMap的key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值