11.
为什么要重写hashcode 与 equals
因为所有的输入都会通过hash算法得到一串数字,此时通过可以比较出hash值比较数字是否相同,如果相同代表内容一样,效率高
但如果输入的内容不一样但hash值相同(即哈希冲突),也会发生误差,此时再通过equals比较内容是否一致
发生哈希冲突的原因是哈希值为int类型,为-2147483648 和 2147483647 ,总共只有43亿个对象地址,如果有44亿个对象那么哈希值一定会有相同的.此时即发生哈希冲突.此时在用equals比较内容,如果equals也相同则认为这是同一个对象
12.
说出常见的设计模式(基础常用):单例模式/策略模式/建造者/装饰模式
定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供"
实例化过程: 类名 对象名 = new 类名(参数1,参数2,参数3....)
一个类有且仅有一个实例化对象
1.声明私有构造器(private)
2.声明当前类的实例化对象
3.提供一个方法返回该实例化对象
(对象的类型就是类的名字,每一个类都是引用类型)
优点: 节省内存空间
适用的场景:如果一个类没有个性化的成员变量,但有各种成员方法则这个类就适用创建单例模式
显然单例模式的要点有三个:(枚举是典型的单例模式)
一: 某个类只能有一个实例;
二: 它必须自行创建这个实例;
三: 它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:
一: 单例模式的类只提供私有的构造函数,
二: 类定义中含有一个该类的静态私有对象,
三: 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
策略模式: 根据不同的策略执行任务,一般用在Java 中用来优化if/switch
建造者模式: 创建对象的模式,如果一个类属性过多就不适合使用构造器.使用set方法的话,代码又过于
冗余->这时候就适合使用"建造者模式",链式调用来解决
使用步骤:1.在类中创建一个 Builder 静态内部类
2.把外部类中想使用Builder赋值的属性直接复制到内部类中
3.提供属性赋值的三要素:Builder 属性(参数)
4.外部类提供有参构造器 参数是Builder
5.内部类Builder提供最终创建外部类对象的build方法
类名.builder() .属性1(调用是对应属性的参数对应的赋值) .属性2(调用是对应属性的参数对应的赋值) .build();
装饰模式:当你想给对象添加某种功能,又不想改变原来对象的功能的时候;->装饰模式增强对象的功能
在IO流中是提高读写速度的(典型的就是BufferInput)
流的三大操作: map/reduce/collect
(异常/集合/流)三大体系
13.
synchronized 同步(互斥/非显示)锁 , 不公平锁/独占锁
特性:1.具有线程独占性(同一时刻只能有一个线程占有该同步锁,锁的是方法)
2.不公平性(不公平锁/独占锁)
步骤:1.所有线程参与抢锁
2.成功抢到所得线程就原子性的执行方法(原子性就是将锁内所有的执行方法看作一个整体)
3.执行完方法释放锁
锁的缺点:1.效率可能低下,锁的释放情况少,试图获取锁时不能设定超时
2.不够灵活,不能控制加锁和解锁的时机,每个锁仅有单一的条件,*无法知道是否成功获取锁
14.
是不是在使用到多线程的时候就使用 synchronized? 不是,在保证线程安全的时候才需要
确认是否存在共享变量,才需要加锁
加锁的三种方式: synchronized 同步给方法上锁
synchronized 同步代码块锁执行的代码
Lock 显示锁 ReentrantLock 可重入锁
可重入锁()的概念:同一个线程可以多次获取该锁
死锁的概念:死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源产生的互相等待资源释放的现象
死锁的具体原因:1.互斥条件:一个资源只能被一个线程占有,当这个资源占有其他线程就只能等待
2.不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有
3.请求并持有条件:线程已经拥有了一个资源后,又尝试请求新的资源
4.环路等待条件:产生死锁一定是发生了线程资源环形链
解决死锁:改变资源的环路等待