吉比特java面经

1.项目spring,spring启动过程(没有回答上来)

2.mybatis中sql语句中#和$符号的区别

(1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是id,则解析成的sql为order by "id"。

(2)$将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是id,则解析成的sql为order by id。

(3)#方式在很大程度上能够防止sql注入。

(4)$方式无法防止sql注入。

(5)$方式一般用于传入数据库对象,例如传入表名。(这里得注意SQL注入问题

(6)一般能用#的就别用$。

3.sychornized的加锁的底层实现

1、jvm基于进入和退出Monitor对象来实现方法同步和代码块同步。

方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。

代码块的同步是利用monitorenter和monitorexit这两个字节码指令。它们分别位于同步代码块的开始和结束位置。当jvm执行到monitorenter指令时,当前线程试图获取monitor对象的所有权,如果未加锁或者已经被当前线程所持有,就把锁的计数器+1;当执行monitorexit指令时,锁计数器-1;当锁计数器为0时,该锁就被释放了。如果获取monitor对象失败,该线程则会进入阻塞状态,直到其他线程释放锁。

4.key等于null时他的存储位置

是在entry表talbe[0]链表中查找key为null的元素,如果找到,则将value重新赋值给这个元素的value,并返回原来的value。
如果上面for循环没找到则将这个元素添加到talbe[0]链表的表头

5.http状态码,头部信息

问了502,当时没答出来补充说了501和505

6.基本类型的占有字节数 

byte     1字节               

short    2字节               

int      4字节               

long     8字节               

char     2字节(C语言中是1字节)可以存储一个汉字

float    4字节               

double   8字节               

boolean  false/true(理论上占用1bit,1/8字节,实际处理按1byte处理) 

7.

Double double1=3.14;
 Double double2=3.14;
 System.out.println(double1==double2);

输出false

double double1=3.14;
 double double2=3.14;
 System.out.println(double1==double2);

输出true;

8.索引不会被使用的情况有。

9.手撸indexof()的代码,并且优化

10.jsp和servlet(没有学过,直接说的不会)

发布了55 篇原创文章 · 获赞 17 · 访问量 4982

猜你喜欢

转载自blog.csdn.net/weixin_43698704/article/details/105411587
今日推荐