贝壳Java后端开发实习
Java的基本数据类型?
- 整形:byte,short,int,long
- 字符型:char
- 浮点型:float,double
- 布尔型:boolean
Java引用类型有哪些?
- 强引用(Strong Reference):Java中的引用,默认都是强引用。比如new一个对象,对它的引用就是强引用。对于被强引用指向的对象,就算JVM内存不足OOM,也不会去回收它们。
- 软引用(Soft Reference):若一个对象只被软引用所引用,那么它将在JVM内存不足的时候被回收,即如果JVM内存足够,则软引用所指向的对象不会被垃圾回收。
- 弱引用(Weak Reference):若一个对象只被弱引用所引用,那么它将在下一次GC中被回收掉。
- 虚引用(Phantom Reference):虚引用是四种引用中最弱的一种引用。我们永远无法从虚引用中拿到对象,被虚引用引用的对象就跟不存在一样。
String、StringBuffer、StringBuilder有什么区别?哪个适合多线程?
- String类中使用字符数组保存字符串,数组有”final”修饰符,String对象是不可变的,可以理解为常量,线程安全。
- StringBuilder使用字符数组保存字符串,StringBuilder对象是可变的,没有对方法进行加同步锁,线程不安全。
- StringBuffer使用字符数组保存字符串,StringBuffer对象是可变的,对方法加了同步锁,线程安全。
HashMap线程安全吗?为什么?
- HashMap不是线程安全的。
- 在jdk1.7中,多线程环境下,扩容时会造成环形链或数据丢失。
- 在jdk1.8中,多线程环境下,会发生数据覆盖的情况。
ArrayList线程安全吗?
ArrayList线程不安全,Vector线程安全。
有哪些线程安全的集合类?
- Vector:比Arraylist多了个同步化机制。
- Hashtable:比HashMap多了个线程安全。
- ConcurrentHashMap:是一种高效但是线程安全的集合。
- Stack:栈,继承于Vector。
ConcurrentHashMap的原理?
- jdk1.7:采用Segment数组 + HashEntry数组的方式进行实现,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个Segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。
- jdk1.8:采用Node数组 + CAS + Synchronized进行实现,使用数组元素作为锁,从而实现对每一行数据进行加锁,进一步减少并发冲突的概率。
为什么要使用线程池
- 可以减少资源的消耗。线程的创建和销毁会造成一定的时间和空间上的消耗,而线程池可以让我们重复的利用已经创建好的线程,避免了不必要的浪费。
- 提高了系统的响应速度。线程池是利用已经创建好的线程,没有线程的创建和销毁,所以响应速度很快。
- 让线程更加便于管理。线程属于稀缺资源,我们不可以随意创建。运用线程池可以方便统一的管理。
接口和抽象类的区别?
- 抽象类要被子类继承(extends),接口要被类实现(implements)。
- 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 一个类只能继承一个抽象类,但是可以实现多个接口。
浏览器输入网址,中间会经历什么
- 浏览器的地址栏输入URL并按下回车。
- 浏览器查找当前URL是否存在缓存,并比较缓存是否过期。
- DNS解析URL对应的IP。
- 根据IP建立TCP连接(三次握手)。
- HTTP发起请求。
- 服务器处理请求,浏览器接收HTTP响应。
- 渲染页面,构建DOM树。
- 关闭TCP连接(四次挥手)。
tcp/ip在哪一层?http呢?
- tcp/udp在传输层。
- ip在网络层。
- http在应用层。
left join和inner join的区别
- 内连接:查询的是两张表的交集部分。
- 左外连接:查询的是左表所有数据以及其交集部分。
- 右外连接:查询的是右表所有数据以及其交集部分。
参考