java-3年面试总章:解决面试中的问题

java-3年面试总章:解决面试中的问题

面试官想问的问题
  1. 你说一下对线程的理解。
  2. 你说一下多线程开发。
  3. 你给我讲解一下JWT的优势。
  4. 你讲解一下shiro开发。
分析面试官问题。
  1. 你要明白面试官要考察什么?这个非常重要。比如说面试官问:你讲解一下创建线程的方式。

你回答的时候就要先说出有哪些创建线程的方式。既然他问了这么一个问题,说明里面肯定有一些注意点。你一定要把哪些注意点说出来。就ok了。

面试题:
  1. 创建线程的三种方式

创建类A继承Thread类,重写Thread中的run()方法。

使用方法:

实例化类A。调用类A的start()方法。

注意点:调用start()方法,和直接调用实例run()方法的不同。调用start()方法相当于多线程调用。当直接调用run()方法时,会执行完run()方法后,才会向下执行。

  1. 创建线程的第二种方式

创建类A实现Runable接口,重写Runable接口中的run()方法。

使用方法:

Runable里面没有start()方法。还得需要实例化一个Thread,并且包装类A。执行的时候也是通过Thread对象调用start()方法。

注意点:Runable是一个接口,接口里面没有实现方法。需要重新实例化Thread才能调用。

  1. 创建线程的第三种方式:

创建类A实现Callable接口。并重写call()方法。Callable接口带有一个泛型。

使用方法:

实例化实现类A,但是无法直接获取返回值,需要使用FutureTask<V>在外部封装一下再获取返回值。此外因为Runable是个接口,需要start()方法。因此需要实例化Thread类,然后包装FutureTask类。开启线程。

注意点:Runable是一个接口,需要Thread实例化包装。Runable无法接收返回值,需要FutureTask<V>进行包装。

java线程池的创建
  1. 线程池的创建一般有两种方式

使用ThreadPoolExecutor类进行创建线程池。

ThreadPoolExecutor的构造函数最多有七个参数。总共有四个构造函数

1、corePoolSize:线程池的核心线程数。

2、maximumPoolSize:线程池的最大线程数。

3、keepAliveTime:线程池空闲时线程的存活时间。

4、unit:线程存活时长单位,结合上个参数使用。

5、workQueue:存放任务的队列,使用的是阻塞队列。在这个方6、threadFactory:线程池创建线程的工厂。

7、handler:在队列和线程池达到最大线程数,都满时,仍热有任务的情况下的处理方式。

第一个构造方法,包含1,2,3,4,5,前5个参数。

第二个构造方法:包含1,2,3,4,5,6前6个参数。

第三个构造方法:包含1,2,3,4,5,7,参数。

第四个构造方法:包含所有参数。7个。

  1. 线程池创建的第二种方式:Exectors

Executor大约有10个构造方法。

1、newCachedThreadPool:创建一个可以根据需要创建新线程的线程池,如果有空闲,优先使用空闲线程。

2、newFixedThreadPool:创建一个固定大小的线程池,在任何时候,最多只有N个线程在处理任务。

3、newSheduledThreadPool:能延迟执行,定时执行的线程池。

4、newWorkStealingPool:工作窃取,使用多个队列来减少竞争。

注意点: 允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量线程,从而导致OOM

面试中的sql问题:
  1. mysql语句中使用#{}取值和${}取值有什么不同。

使用${}会有一个问题,当取得字符串类型的值时,没有加单引号。黑客可以

code = “1233 or code=456” password=“2123”:

select * from user where code=‘123’ or code=‘456’ and password=‘2123’ 进行攻击。

而使用#号,黑客就无法使用这样的攻击。

  1. mysql的优化方案:

1、mysql经过查询后,会生成一个缓存。当下次查的时候,就很快返回来了。但是当sql语句里面有一些函数时,无法使用缓存。例如:NOW(),CURDATE()等函数。不会生成缓存。尽量不要使用函数,可以传过来一个值。

2、使用explain关键字分析你的查询语句或是表结构的性能瓶颈。

3、当只要一行数据时,使用limit 1提高查询效率,有了limit 1当数据库查询出来1条数据后,就不会再查询了。

4、为搜索字段添加索引。(这个字段经常用来做搜索)

​ 1、唯一性太差的字段,不适合建索引。2、更新太频繁不适合建索引。3、不会出现在where条件中的字段不适合建索引,4、频繁使用的字段适合建索引。

5、为join字段添加索引。

6、不要使用select *

7、能使用ENUM类型的就不使用varchar字段

8、把ip地址存成UNSIGNED int(10)10位就行,可以使用inet_aton()函数将ip转数字,inet_ntoa()数字转ip

where 和having的区别
  1. where和having都可以做条件查询,但是having做条件查询时,select里面必须包含having条件查询的字段,否则查不出来。这也是只可以使用where,不可以使用having的情况。
  2. where中的条件是数据表中的字段,而having中的条件是select后面必须出现的字段。如果select后面出现avg()函数where 对avg()做条件筛选,会报错,having就不会。
  3. having是先分组,再过滤。having可以使用组函数,但是效率没有where高。
java常用的五大包
  1. java常用的包有:

1、java.lang.*

2、java.util.*

3、java.io.*

4、java.net.*

5、java.sql.*

  1. java常见的异常

1、java.lang.NullPointerException空指针异常。

2、java.lang.ClassNotFoundException指定类型不存在异常

3、java.lang.ArrayIndexOutOfBoundsException数组越界异常。

4、java.lang.StackOverflowError:堆栈过深异常。

5、java.lang.ArithmeticException:数组运算异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值