1.取整数a的十位数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void main(String[] args){ int s=1831; int g = s%10; int sw = s/10%10; int b = s/100%10; int q = s/1000%10; System.out.println("个位数是:"+g+";十位数是:"+sw+";百位数是:"+b+";千位数是:"+q); } 结果:个位数是:1;十位数是:3;百位数是:8;千位数是:1
2.多线程
实现一个线程有哪几种方式?各有什么优缺点,比较常用的是那种,为什么
1) 继承Thread类,需要重写run方法,无返回值
a) 优点:可以直接调用start方法启动线程
b) 缺点:java只能单继承,如果已经有了父类,不能用这种方法
2) 实现Runnable接口,需要重写run()方法
a) 优点:即使自己定义的线程类有了父类也可以实现接口,而且接口是多实现
b) 缺点:需通过构造一个Thread把自己传进去,才能实现Thread的方法,代码复杂
3) 实现Callable接口,需要重写call()方法
a) 优点:可以抛出异常,有返回值
b) 缺点:只有jdk1.5以后才支持,结合FuntureTask和Thread类一起使用,最后调用start启动线程
一般用第二种,实现Runnable接口,比较方便,扩展性高.
何为进程?
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程
何为线程?
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程
3.同步方式
(1)同步方法:
即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
(2)同步代码块
即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
(3)使用特殊域变量(Volatile)实现线程同步
a.volatile关键字为域变量的访问提供了一种免锁机制
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
(4)使用重入锁实现线程同步
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
(5)使用局部变量实现线程同步
4.线程状态
5.jsp和servlet的区别
jsp和servlet的区别和联系:
1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
联系: JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑
6.jsp传递参数的四种方式
1、form表单
2、request.setAttribute();和request.getAttribute();
3、超链接:<a herf="index.jsp"?a=a&b=b&c=c>name</a>
4、<jsp:param>
7.对比两个String是否相等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String a=new String("abc"); String b=new String("abc"); a.equals(b);
8.n1,n2相加,用递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Main { public static void main(String[] args){ System.out.println(sum(2, 5)); } public static int sum(int n1, int n2) { if(n1 == n2) { return n1; } if(n1 > n2) { int temp = n1; n1 = n2; n2 = temp; } return sum(n1, n2-1) + n2; } }
9.jvm加载class的顺序
10.pagehelp 分页以及mysql的分页
mysql主要是使用limit分页。
11.单例,懒汉和饿汉哪个线程安全
饿汉式单例模式是线程安全的
12.Redis的数据类型
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
13.项目中验证码是如何生成,主要是唯一性以及时效性
14.jsr303是什么
JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。如:@Null 限制只能为null、@NotNull 限制必须不为null
15.md5是可逆的吗?
MD5不可逆的原因是由于它是一种散列函数(也叫哈希函数,哈希函数又称散列函数,杂凑函数,他是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程,哈希函数可以将任意长度的输入经过变化后得到固定长度的输出,这个固定长度的输出称为原消息的散列或消息映射。 理想的哈希函数可以针对不同的输入得到不同的输出,如果存在两个不同的消息得到了相同的哈希值,那我们称这是一个碰撞),使用的是hash算法,在计算过程中原文的部分信息是丢失了的。一个MD5理论上是可以对应多个原文的,因为MD5是有限多个而原文是无限多个的。
16.list 和 set和map的区别,Redis里也有
- List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
- Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。
- Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。
17.java的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
18.一个商品,三个人同时抢,改变这个局面(多线程并发)
不懂不懂
19.堆排序
https://mp.weixin.qq.com/s/3krwgrzB6EV4HU7wI0Rm4A
20.快速排序
https://mp.weixin.qq.com/s/3krwgrzB6EV4HU7wI0Rm4A
21.Redis持久化有什么策略
持久化+过期策略:https://www.cnblogs.com/wlwl/p/9842691.html
https://blog.csdn.net/q649381130/article/details/79920277
22.Redis雪崩
缓存雪崩是指在我们设置缓存失效时间上时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部打到后端数据库,数据库一时请求过大,数据库cpu和IO一时负载过大,造成雪崩。
解决方法
(1)设置redis集群和DB集群的高可用,如果redis出现宕机情况,可以立即由别的机器顶替上来。这样可以防止一部分的风险。
(2)使用互斥锁
在缓存失效后,通过加锁或者队列来控制读和写数据库的线程数量。比如:对某个key只允许一个线程查询数据和写缓存,其他线程等待。单机的话,可以使用synchronized或者lock来解决,如果是分布式环境,可以是用redis的setnx命令来解决。
(3)不同的key,可以设置不同的过期时间,让缓存失效的时间点不一致,尽量达到平均分布。
(4)永远不过期
redis中设置永久不过期,这样就保证了,不会出现热点问题,也就是物理上不过期。
(5)资源保护
使用netflix的hystrix,可以做各种资源的线程池隔离,从而保护主线程池。
23.复习一下Redis和RabbitMQ的常见情景。
24,锁
侵删。