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.正向代理可以用于访问控制,限制访问特定的网站,也可以用来绕过网络过滤,访问被屏蔽或限制的内容

posted @ 2023-08-29 09:54  ANewPro  阅读(23)  评论(0编辑  收藏  举报