刷面试题的盲点难点汇总——1月
2号
1. 关于线程安全
线程安全意义:
线程安全, 是指变量或方法( 这些变量或方法是多线程共享的) 可以在多线程的环境下被安全有效的访问。这说明了两方面的问题:
(1)可以从多个线程中调用, 无需调用方有任何操作;
(2)可以同时被多个线程调用, 无需线程之不必要的交互。
一、ArrayList肯定不是线程安全的
二、线程安全的Map包括
- Hashtable:
Map<String,Object> hashtable=new Hashtable<String,Object>();
- synchronizedMap:
Map<String,Object> synchronizedMap= Collections.synchronizedMap(new Hashtable<String,Object>());
1和2锁性差不多,区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
- ConcurrentHashMap:
Map<String,Object> concurrentHashMap=new ConcurrentHashMap<String,Object>();
这个是目前使用最多,而且也是最推荐的一个集合,实现也是比较复杂的一个。我们看源码其实是可以发现里面的线程安全是通过cas+synchronized+volatile来实现的,其中也可看出它的锁是分段锁,所以它的性能相对来说是比较好的。整体实现还是比较复杂的。
三、线程安全必须保证
原子性、可见性、序列性
volatile关键字不能保证原子性,不是线程安全
synchronized–OK
四、线程安全集合
线程安全的集合对象:
-
Vector 线程安全:
-
HashTable 线程安全:
-
StringBuffer 线程安全:
非线程安全的集合对象:
-
ArrayList :
-
LinkedList:
-
HashMap:
-
HashSet:
-
TreeMap:
-
TreeSet:
-
StringBulider:
2. 必会的ASCII码
48–>数字0
65–>大写A
97–>小写a
32–>空
0是空字符
3. 常见的转换(加法)
参考查看12.2的第11点
1. char与int —>int char转为int(ASCII码)
2. 遇到 long 格式,再提升到long
3. 在2的基础上,遇到float,提升到float
- double 同上
4. 关于byte的转换
package com.nk;
public class Test3 {
public static void main(String args[]){
final byte b1 = 1;
final byte b2 = 2;
byte b3 = 3;
byte b4 = b1 + b2;//只有b1 b2 都是常量时候,才能编译运行成功
//即使是一个byte+一个常量也不行
//byte b6 = b1 + b3;//编译不通过
byte b5;//定义了不用,不需要赋值,但是怎么做就是浪费内存 没有用
System.out.println(b4);
String s;//编译不通过
System.out.println(s);
}
}
5. 关于局部变量
局部变量如果不使用,可以不赋值,但是一般变量声明了之后都是要使用的,所以你最好初始化
6. 双亲委派
-
Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库( rt.jar );
它用来加载 Java 的核心库,是用原生代码来实现的
-
Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap ;
它用来加载 Java 的扩展库。
-
system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
tomcat 为每个 App 创建一个 Loader,里面保存着此 WebApp 的 ClassLoader。需要加载 WebApp 下的类时,就取出 ClassLoader 来使用
7. 关于Servlet的知识
- Servlet 的生命周期?
在 Servlet 的接口中定义了一个 Servlet 的生命周期方法 , 分别是 Init,Service 和 Destroy
- 常用的servlet包的名称?
javax.servlet
javax.servlet.http
- 如何在 Servlet 之间共享信息 ?
我们可以通过 ServletContext 来维护在不同 Servlet 之间共享的信息 .
8. 以下哪个式子有可能在某个进制下成立(13*14=204)?
二元一次方程求解
八进制13转十进制:18+3=11
八进制14转十进制:18+4=12
11 **2=132
八进制204转十进制:288+0*8+4=132
所以:(1x¹+3x°)* (1x¹+4x°) = 2x²+0x¹+4*x°
x₁=8 x₂=-1
解二元一次方程组 得到 8 【x代表进制】
9. switch语句
没有break语句,就是从头到尾执行,不管default语句
10. i = 0;i = i++ + i;
i++ 先运算 后+; ++i 先+后运算 i++ + i=0+1
我的理解是就像i=0;i = i++;i还是0一样i++这个部分有一个盒子保存i
11. super的使用场景
1、子类构造函数调用父类构造函数用super
2、子类重写父类方法后,若想调用父类中被重写的方法,用super
3、未被重写的方法可以直接调用。
12. 多态:继承是根源,重写是表现形式
13.依赖注入
Spring依赖注入(DI)的三种方式,分别为:
1. 接口注入
2. Setter 方法注入
3. 构造方法注入
依赖注入是一种思想,或者说是一种设计模式,在Java中是通过反射机制实现,与具体框架无关。
因此,“只有通过Spring才能实现依赖注入(DI)”是错误的说法
14.反射破坏封装
反射破坏代码的封装性,破坏原有的访问修饰符访问限制
封装就是把你的器官都放到你的身体里, 反射就相当于X光