面试问题

82 阅读4分钟

HashMap是否是线程安全?如何实现线程安全。

不是

方法1:使用hashtable,hashtable底层是数组+链表的形式,其中的get、put方法等都是用synchronized修饰的,因此,hashtable是线程安全的,但是执行效率比较低,一般不推荐使用。

方法2:使用java.util.concurrent.concurentHashMap,synchronizedMap的线程安全和hashtable一样,都是使用sunchronized方法,将方法上锁。

方法3:使用java.util.collections.synchronizedMap()方法包装 HashMap object,得到线程安全的Map,并在此Map上进行操作。

为什么TIME_WAIT状态是2MSL?

去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。

HTTPS CA认证

CA机构颁布给自己的证书叫做根证书

浏览器在收到服务器证书后 在本地寻找给服务器颁发证书的CA机构的根证书和公钥

再用公钥对服务器证书进行解密 得到服务器的公钥 hash值(指纹)和hash算法

根据hash算法对证书数据进行hash 然后将得到的hash值与证书中保存的做对比

防止中间人篡改

证书=f((服务器公钥+hash算法+hash值+数据),CA私钥)

重载和重写

重写(Override)

从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。

重载(Overload)

在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载

为啥HashMap不直接采用红黑树

因为红黑树需要进行左旋,右旋操作, 而单链表不需要,

以下都是单链表与红黑树结构对比。

如果元素小于8个,查询成本高,新增成本低

如果元素大于8个,查询成本低,新增成本高

如何防止SQL注入

1、sql换行

2、前端后端字符串过滤

3、mybatis使用预编译 #{}将变量先变为?然后再DBMS阶段替换

${}是简单字符串替换,在解析阶段进行替换

MySQL执行预编译分为如三步:

第一步:执行预编译语句,例如:prepare myperson from 'select * from t_person where name=?'

第二步:设置变量,例如:set @name='Jim'

第三步:执行语句,例如:execute myperson using @name

预编译还可以提高mysql效率

面向过程 (C语言)

就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象 c++ c# java delphi

是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

GC Root

(1)虚拟机(JVM)栈中引用对象

(2)方法区中的类静态属性引用对象

(3)方法区中常量引用的对象(final 的常量值)

(4)本地方法栈JNI的引用对象

对象有哪些

(1)虚拟机(JVM)栈中引用对象

(2)方法区中的类静态属性引用对象

(3)方法区中常量引用的对象(final 的常量值)

(4)本地方法栈JNI的引用对象

新生代和老年代比例

1:3

伊甸区和幸存区比例

1:1:8