查漏补缺复盘10.17

1.取整数a的十位数。

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
View Code

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是否相等

String a=new String("abc"); 
String b=new String("abc");
 a.equals(b);
View Code

8.n1,n2相加,用递归

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;
    }
}
View Code

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,锁

侵删。

猜你喜欢

转载自www.cnblogs.com/fzzzjjj/p/11694430.html