1007Java面试知识点准备

get请求和post请求之间的区别?参考文章链接

  1. GET请求参数地址会显示在url地址中,post则不会
  2. get请求数据量小1024个字节,也就是1KB,而post请求数据量大2MB左右
  3. get请求一般用于从服务端查询数据,而post请求可以用于增删改请求(RESTFUL接口设计规范就是这么来的)

Linux系统熟悉吗?常用的指令有哪些?查询系统负载的命令是哪个?(面试就是一个)
linux系统是目前主流的应用服务器,因为其在系统安全和性能方面比较强,所以是目前的主流服务器。过去接触过由Centos7系统,阿里云ECS服务器,Ubuntu16可视化系统都有过使用的经验.如linux系统下面的创建文件mkdir,删除文件rm,查看当前系统目录pwd,查看负载top,查看某个服务运行情况如ps -ef指令,另外如资源下载yum指令.文件压缩解压缩等指令zip unzip指令.

JVM中的内存模型指那些?垃圾回收机制有哪些?如何对JVM进行调优?
JVM中内存模型包含堆/栈.堆中存储对象,栈存储基本数据类型(如引用类型)
堆内存分为年轻代,年老代,持久代。年轻代的对象进过几次回收后,如果还存在则移入年老代.持久带则存储class,method,field等反射使用的类对象内存.

垃圾回收机制主要使用SUN回收机制,主要对年轻代和年老代中的活跃对象进行内存回收,主要回收算法有如下几种,年轻代串行/并行,年老代串行/并行/并发.目前主流的回收算法指的是年老代并发也就是CMS回收算法.

JVM调优主要对堆内存和回收算法进行配置.通过对jdk内存回收的日志进行分析,使用如jconsole,jprofile,VisualVm不断对堆内存进行持有分析优化.

总结如上:学到的新东西如堆内存中分为年轻代/年老代/持久代.持久代存储着如class,method.field等对象内存.而年轻代中对象如果在几次回收之后依然存在,则进入年老代.垃圾回收机制如SUN回收机制,主要针对的就是年轻代和年老代对象回收.同时回收机制使用的算法如年轻代串行/并行/年老代串行/并行/并发,一般使用的上就是CMS也就是年老代并发的回收算法.而面试中经常问的如JVM内存调优主要指的上就是对堆内存和回收算法的配置优化,通过分析jdk内存回收日志的分析,通过如Jconcole,jprofile,visualvm工具,对堆内存回收不断优化的过程.

分布式事务如何实现?
分布式事务采用分布式锁实现,通过zookeeper工具去实现,通过损耗一定系统性能的方式去实现,如京东下单不是立马通知成功,是需要等一下才会告诉你下单成功的.

关于java8的新特性都了解哪些 ?参考文章/有点多哦

  1. lambda表达式,java8中引入的重要概念,函数式编程概念,将函数看做一个方法或者参数.由逗号分隔的参数列表/->/函数体构成.为了配合函数式接口编程.引入了函数式接口概念,使用@FunctionInterface注解,用于修饰接口.表示只有一个方法的接口.如Runable接口就是这样,只有一个run方法.
    在这里插入图片描述
  2. 接口中可以创建默认方法和静态方法.接口中可以创建抽象方法的模式实现.这样实现该接口的类,就不用为默认的实现方法而操心了.同时接口中可以添加静态方法。
package java8;

/**
 * java8新特性  接口可以创建默认类实现方法和静态方法,这样在实现类中就不需要重复写代码了
 */
public interface DefaultAndStaticInterface {
    /*
    方法的默认实现类
     */
    default  void test(){
        System.out.println("抽象方法的默认实现");
    }

    /*接口中定义静态方法
     */
    static  void  test2(){
        System.out.println("接口中定义的静态方法");
    }
}

在这里插入图片描述

  1. 方法的引用.(包含构造方法+静态方法+成员方法等 通过CLASS:new/方法名的方式替换以往的对象创建)
  2. 重复注解的出现(@Annotition注解添加,可以在一个地方使用2个同样的注解)
  3. 注解的扩展(@Annotation注解 中@Target添加了2个类型)
  4. 更好的的类型判断

Java8库新增的类
optional判断对象是否为空/Stream/时间类Clock+LocalDate+LocalTime

总结上述Java8新增的特性除了lambda在集合中使用了之外,如函数式接口,函数式变成思想也是今天学到的,如@FunctionInterface注解函数式接口,只有一个方法的接口.接口中的静态方法和默认方法.方法的引用(构造方法 静态方法 方法Class:new/方法名)/重复注解的支持/注解类型的扩展/更好的类型判断,这些都是今天才学到的,真是有些惭愧了,更重要的是只知道的了这些特征,用起来更是一大难题.同时像java8新增的一些类如Optional判断是否为空/Stream(更好的处理集合中的数据)/时间Clock+LocalTime+LocalDate+LocalDateTime,当然还有很多其他的库类因为目前复习的内容比较多,所以仅限于了解,具体代码里面的使用还需要更多的时间去实践学习.

Java中的多线程和并发库相关知识点

创建线程的方式?

  1. 通过继承Thread类,重写run方法.

  2. 通过实现Runable接口,实现run抽象方法.
    本质上都是通过Runable接口中的run方法去实现线程的创建.因为创建Thread类的本质也是通过实现Runable接口去实现的.实际上创建Thread类的构造方法里面传入Runable接口也可以实现的.

  3. Time/TimerTask也可以达到创建线程的目的.

线程中的制约关系?
线程中分为间接相互制约和直接相互制约。这主要是线程并发执行时,由于资源共享和线程协作,存在以下2中制约关系.(直接相互制约可以理解为同步,多线程之间存在顺序,可以理解为同步. 而间接相处制约可以理解为互斥,指的是多个线程不能在同一个时间点执行,类似于互斥锁.)

  • 间接相互制约:指的是多个线程需要去同时操作一个共享资源,必须要有先后顺序.
  • 直接相互制约:指的是线程之间存在直接依赖关系,如B线程的执行必须要依赖与A线程.所以称这种制约关系为直接相互制约.

ThreadLocal有什么作用?具体应用的场景有哪些?

  • 作用:主要用於单线程数据共享和多线程数据隔离这个原因所以出现了ThreadLocal这个概念,每个线程都会调用全局ThreadLocal对象的set方法,为当前线程创建一个ThreadLocalMap对象,然后在这个map对象中插入一条记录,key表示ThreadLocal对象,而value就是需要在当前线程中共享的数据.所以实际上每个线程都有自己的ThreadLocalMap对象.(而且从文章里面总结的来看ThreadLocal分为全局的和局部的.全局是用于设置每个线程的ThreadLocalMap对象的,而局部的就是用从来保证保证线程数据共享的.).线程执行完毕后 可以调用Thread.remove()更快的回收内存.

  • 应用场景:商品订单下单,商品下单包含库存减少,添加下单记录,修改总账等操作.这几个操作要在一个事物里面进行的,如果后面的总账修改出现问题,那么前面的数据也需要回顾.通常来讲是这几个模块的修改都是在一处完成的,所以在这个线程里面连接数据库的对象也要是同一个.需要基于ThreadLocal保证数据库链接对象的共享.(同样的还有转账系统,这里不做赘述)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章