刷面试题的盲点难点汇总——1月第一篇

刷面试题的盲点难点汇总——1月

2号

1. 关于线程安全

线程安全意义:

线程安全, 是指变量或方法( 这些变量或方法是多线程共享的) 可以在多线程的环境下被安全有效的访问。这说明了两方面的问题:

(1)可以从多个线程中调用, 无需调用方有任何操作;

(2)可以同时被多个线程调用, 无需线程之不必要的交互。

一、ArrayList肯定不是线程安全的
二、线程安全的Map包括
  1. Hashtable:

Map<String,Object> hashtable=new Hashtable<String,Object>();

  1. synchronizedMap:

Map<String,Object> synchronizedMap= Collections.synchronizedMap(new Hashtable<String,Object>());

1和2锁性差不多,区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。

  1. 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

  1. 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的知识

  1. Servlet 的生命周期?

在 Servlet 的接口中定义了一个 Servlet 的生命周期方法 , 分别是 Init,Service 和 Destroy

  1. 常用的servlet包的名称?

javax.servlet
javax.servlet.http

  1. 如何在 Servlet 之间共享信息 ?

我们可以通过 ServletContext 来维护在不同 Servlet 之间共享的信息 .

8. 以下哪个式子有可能在某个进制下成立(13*14=204)?

二元一次方程求解

八进制13转十进制:18+3=11
八进制14转十进制:1
8+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光

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值