Java的部分八股(随便记着玩)
Java的部分八股
1.Hashmap和Hashtable的区别
1.安全性
hashtable是线程安全的,hashmap是非线程安全的
但是hashmap的性能高于hashtable
多线程下使用hashmap需要使用一个线程安全的集合
2.容量部分
Hashmap的初始容量为16,hashtable的初始容量为11,填充因子默认都是0.75
Hashmap扩容是当前容量翻倍,hashtable是容量翻倍+1
hashmap允许用null做key,hashtable不允许
hashmap在链表长度大于阈值时,默认为8,hashmap会将链表转化为红黑树
2.重载和重写的区别
重载是指在同一个类中可以定义多个同名方法,比如函数重载之类的
重写(override)是指在子类中重新定义父类已经存在的方法,保持方法名、参数列表和返回值类型相同。目的是实现多态性
重写的访问修饰符可以扩大,子类中的方法不能缩小父类中方法的可见性
重写方法不能抛出比重写方法更宽泛的异常
3.Stringbuffer,Stringbuilder和String的区别
String是不可变的类,一旦创建就不能被修改,每次对String的操作都会生成一个新的String对象
StringBuffer是可变的类,修改字符串的内容时不会生成新的对象,适用于多线程环境,它可以保证线程安全,但是因为同步机制,所以性能相对较低
StringBuilder是可变的类,与StringBuffer相似,不是线程安全的,更适用于单线程环境
4.Exception和Error有什么区别
Exception是程序本身可以处理的异常,可以通过catch来进行捕获,Exception又可以分为Checked Exception(受检查异常,必须处理)和Unchecked Exception(不受检查异常,可以不处理)
Error是属于程序无法处理的错误,不建议用catch进行捕获
例如java虚拟机运行错误等
5.Synchronized和Lock的区别
1.synchonized是关键字,Lock是接口,synchonized是在JVM层实现,Lock是JDK中JUC包下的实现
2.synchonized是隐式加锁,lock是显式加锁
3.synchonized可以作用于方法上,lock只能作用于方法块
4.synchonized是阻塞式加锁,lock是非阻塞式加锁以及支持可中断式加锁,支持超时时间的加锁
5.synchonized在发生异常时,会自动释放锁,确保不会造成死锁。Lock需要在finally中手动释放锁,确保在异常情况下锁一定会被释放
6.什么是阻塞式加锁以及非阻塞式加锁
1.阻塞式加锁
当一个线程尝试获取锁但锁已经被其他线程占用,该线程会被阻塞,直到它成功获取锁为止
2.非阻塞式加锁
如果锁已经被其他线程占用,它不会被阻塞,而是立即返回,通常会返回一个表示获取锁失败的状态。这种方式下,线程会继续执行其他操作,而不会等待锁变为可用。并且需要编写一些重试逻辑。
7.Java中的一些线程安全的类
线程安全的类大部分都在java.util.concurrent包中,比如
- ConcurrentHashmap等concurrent开头的类
- AtomicInteger等原子性类
8.雪花算法生成全局唯一ID
分布式ID特点
- 全局唯一性
- 递增性
- 高可用性
- 高性能性
雪花算法生成的ID由64位组成,第一位始终为0,时间戳占用41bit,工作机器占用10bit,一般高五位是数据中心ID,第五位是工作节点ID,序列号占用12bit,每个节点每毫秒从0开始不断增加
于是雪花算法在同一毫米内最多可以生成1024*4096=4194304也就是将近420w个ID
41位的时间戳可以保证使用69年不重复
缺点:
强依赖机器时钟,如果在机器上进行时钟回拨,会导致生成重复
解决方案:
保存过去一段时间内每一台机器在当前这一毫秒产生ID的最大值,如果发生了时钟回拨,就直接在这台机器对应的id的基础上继续自增生成ID
9.OSI七层模型
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
https协议属于应用层
而SSL/TSL属于传输层
DNS属于应用层,大多数时候使用的是UDP,当响应大小超过UDP的限制的时候可能会采用TCP
10.Nginx反向代理和正向代理的区别
反向代理:
1.反向代理服务器处于服务器端,代表服务器接收来自客户端的请求,然后将这些请求转发到后端的多个服务器上,客户端只知道反向代理容器的存在,不直接与后端服务器交互
2.反向代理可以用于负载均衡,将客户端的请求分发到多个服务器上
3.反向代理可以隐藏后端服务器的真实IP地址
正向代理
1.正向代理服务器位于客户端,它代表客户端向其他服务器发送请求,隐藏客户端的真实IP地址,使服务器看不到客户端的身份
2.正向代理可以用于访问控制,限制访问特定的网站,也可以用来绕过网络过滤,访问被屏蔽或限制的内容