面试总结

目录

1.SpringBoot的注解

2.Redis的数据类型:

    Redis支持五种数据类型:

3.Mybatis如何加索引:

4.Spring配置如何实现热更新:

5.Eureka与Zookeeper的区别:

6.什么是注册中心:

7.spring设计模式:

8.MySQL优化:

9.jquery相关:

10.ElasticSearch原理:

11.ArrayList和LinkedList区别:

12.MySQL外连接查询:

13.Ajax同步和异步请求的区别:

14.Java基础:

15.SpringMVC:


1.SpringBoot的注解

    @RequestMapping:

         这个注解可以用于类和方法上,用于类上,表示父路径,如类上是hello,方法上是/demo,那么访问路径就是hello/demo

    @PathVariable:

        对应路径上的变量,用在参数前,路径上的变量名需和参数名称一致。

    @RequestParam:        

       和以下代码的作用相同。

       String name =request.getParameter("name ")。

    @RequestBody:(一般用于Restful风格)

        是指方法参数被绑定到HTTP请求Body上,前端就不能用表单的方式提交了,需要用json的方式提交。

    @ResponseBody:

        表示输出的是json格式的数据。

    @Autowired:

        属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值。

    @Service:

        标注一个业务逻辑组件类。

    @Controller:

        标注一个控制器组件类。

        在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。

        若返回json等内容到页面,则需要加@ResponseBody注解。

    @RestController:

        标注一个控制器组件类。

        相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。

    @SpringBootApplication:

        包含@Configuration、@EnableAutoConfiguration、@ComponentScan,通常用在启动类上。

2.Redis相关:

    1.为什么用redis:

  • 高性能::当用户访问数据库中的某些数据,是直接从硬盘上读取的,这个过程是比较慢的.如果将用户访问的这些数据放入缓存中,用户访问数据时,就直接读取缓存中的数据,这样直接操作内存,速度会快很多.
  • 高并发:当多用户访问时,直接操作缓存能够承受的请求是远远大于直接访问数据库的,我们讲热点词放到缓存中,会大大减少数据库的任务量。

    2.为什么redis这么快?

    (一)纯内存操作
    (二)单线程操作,避免了频繁的上下文切换
    (三)采用了非阻塞I/O多路复用机制

    3.Redis支持五种数据类型:

        string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

  • String(字符串):

        string 是 redis 最基本的类型,一个 key 对应一个 value。

        注意:一个键最大能存储 512MB。

  • Hash(哈希):

        Redis hash 是一个键值对集合。

        Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

        注意:每个 hash 可以存储 232 -1 键值对(40多亿)。

  • List(列表):

        Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

  • Set(集合):

        Redis 的 Set 是 string 类型的无序集合。

        集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

  • zset(sorted set:有序集合) :

        Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

        不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

        zset的成员是唯一的,但分数(score)却可以重复。

 

3.Mybatis如何加索引:

    //TODO

4.Spring配置如何实现热更新:

    1.引入spring-boot-starter-actuator依赖

    2.在配置文件中增加刷新接口refresh

    3.在需要修改配置文件的控制器中加入注解@RefreshScope

5.Eureka与Zookeeper的区别:

    https://blog.csdn.net/java_xth/article/details/82621776

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

6.什么是注册中心:

    在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。

7.spring设计模式:

    1.工厂设计模式:

        Spring使用工厂模式可以通过BeanFactory或ApplicationContext创建bean对象。

        ApplicationContext :容器启动的时候,不管你用没用到,一次性创建所有 bean 。BeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以一般开发人员使用ApplicationContext会更多。

    2.单例设计模式:

        Spring中bean的默认作用域就是singleton.
    3.代理设计模式:

        Spring AOP就是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP会使用JDK Proxy去创建代理对象,而没有实现接口的对象,无法使用JDK Proxy。

    4.模板设计模式:

        Spring中jdbcTemplate等对数据库操作的类,他们就是用到模板模式。

    5.装饰者模式:

        装饰者模式可以动态的给对象增加额外的属性或者行为。相比于使用继承,装饰者模式更加灵活。

    6.控制反转(IOC)和依赖注入(DI):

        IOC是Spring中一个非常重要的概念,它主要的目的是借助于Spring的IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度。他不是一个模式,而是一种设计原则。

        DI(Dependecy Inject,依赖注入)是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去。

8.MySQL优化:

        1.Like查询走不走索引的问题:

        https://blog.csdn.net/zxssoft/article/details/79651889

9.jquery相关:

  • 获取dom节点有几种方式:

              jQuery中包裹后的DOM对象实际上是一个数组,

              要获得纯粹的DOM对象可以有两种方式:

             1、使用数组索引方式访问,例如:

                  var dom = $(dom)[0];

                   如: $("#id")[0] 

             2、使用函数get()访问,例如:

                  var dom = $(dom).get(0);

                  get()函数中的参数为索引号。

  • DOM中获取元素的不同的方式:

                 document.getElementById();

                 document.getElementsByTagName();

                 document.getElementsByClassName();

                 document.getElementsByName();

                 document.querySelector();选择器

                 document.querySelectorAll();选择器

10.ElasticSearch原理:

    http://developer.51cto.com/art/201904/594615.htm

11.MySQL外连接查询:

    1.左外连接:

        left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。

        左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

    2.右外连接:

        right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。

        与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。

12.Ajax同步和异步请求的区别:

$.ajax({ 

       type: "post", 

       url: "path", 

       cache:false, 

       async:false, 

        dataType: ($.browser.msie) ? "text" : "xml", 

         success: function(xmlobj){ 

                      function1(){};

        } 

});

    1.如何设置同步异步:

        修改ajax请求中的async参数即可,默认异步,async = false为设置同步请求。

    2.区别:

        同步请求提交请求后等待服务器处理,服务器处理完毕后才返回,这个期间客户端浏览器不能干任何事。

        异步请求通过事件触发,提交请求后服务器处理,这时候浏览器仍然可以做其他事情,不必等待返回结果,一般需要监听异步的结果。

        说简单点就是,同步是在一条直线上的队列;异步不在一个队列上,各走各的。

13.Java基础:

    1.Collections和Collection的区别:

    Collections是一个包装类,里面有各种关于集合操作的静态、多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

    Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

    2.ArrayList和LinkedList区别:

    1.一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构.但是他们都是List接口的实现类,前者是数组队列,后者为双向链表结构。

    2.当访问List时,ArrayList比LinkedList效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找.

    3.对数据进行增删时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,对其进行增删操作的时候,会对操作点之后的所有数据下标索引造成影响,需要进行数据的移动。

    4.ArrayList需要手动设置固定大小的容量,但是它使用方便,只需创建,添加数据,调用下标就能进行使用;

       LinkedList能够动态的随数据量的变化而变化,但是它不便于使用。

    3.反射:

//设置一个pojo对象

    private int id;
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

//1.通过反射获取类:
//1.1 Class.forName("xxx")   xxx对应自己的pojo路径
//  注意用此方法需要捕获异常
    try {
            Class<?> stu= Class.forName("pojo.Student");
            System.out.println(stu);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

//1.2 .class
// 此方法是我们经常用的获取类的方法
    Class<Person> stu = Student.class;
    System.out.println(stu);

//1.3 xxx.getClass 

        Student student= new Student();
        Class<? extends Student> s = (Class<? extends Student>) student.getClass();
        System.out.println(s);

//2. 同理可得类中所有的方法.
//注意: getMethods()是获取所有的公共方法
        getDeclaredMethods()获取当前类的所有方法

        Class<Student> stu= Student.class;
        Method[] methods1 = stu.getMethods();
        for (Method method : methods1) {
            System.out.println(method);
        }

        System.out.println("-----------");

        Method[] methods2 = stu.getDeclaredMethods();
        System.out.println(methods2);
        for (Method method : methods2) {
            System.out.println(method);
        }

 

14.SpringMVC:

    1.项目可以访问controller但是页面返回空白,没有任何报错,为什么?

  • 检查SpringMVC拦截器,拦截器代码可能有错,或干脆没写.
  • @RequestMapping注解里可能没有写Get Post方法.
  • 如果你写的是@RestController,方法会以返回字符串形式返回,如果写的是@Controller那么返回的是页面,将返回到jsp页面.  想返回字符串就用RestController,想返回页面就用Controller.
  • 没有在web.xml中添加DispatcherServlet.

15.日志相关:

    1.常见的日志级别:

  • DEBUG级别:记录调试程序相关的信息。

  • INFO级别:记录程序正常运行有意义的信息。

  • WARN级别:记录可能会出现潜在错误的信息。

  • ERROR级别:记录当前程序出错的信息,需要被关注处理。

  • Fatal级别:表示出现了严重错误,程序将会中断执行。

   Log4j建议只使用四个级别,优先级 从高到低分别是 ERROR、WARN、INFO、DEBUG。

    2.日志使用的优化:

    1、提前判断日志级别

    2、避免多余日志输出

    3、保证日志记录信息完整

    4、定义logger变量为static

    5、正确使用日志级别

    6、推荐使用slf4j+logback组合

    7、日志的聚合分析

16.事务相关:

    1.事务的四大特性:

    原子性:

        原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    一致性:

        事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

    隔离性:

        隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

    持久性:

        当事务正确完成后,它对于数据的改变是永久性的。

    2.嵌套事务:

    https://www.cnblogs.com/mcahkf/p/9228609.html

17.设计模式:

   1.单例设计模式:      

解决的问题:保证一个类在内存中对象的唯一性。

例如:多个程序读取一个配置文件时,建议将配置文件封装成对象,这样会方便操作其中数据。但是,又要保证多个程序读到的是同一个配置文件对象,这就需要该配置文件对象在内存中是唯一的了。

如何保证对象唯一性呢?

1.不让其它程序创建该类对象

2.在本类中创建一个本类对象

3.对外提供一个公有方法,让其它程序获取这个对象

单例设计模式分为两种表现形式:

懒汉式:

public Single1() {

}

private static Single1 s = null;

//懒汉式
public static Single1 getInstance(){
        if (s==null) {
            s = new Single1();
        }
        return s;
    }
//懒汉式-改良1 缺点 同一时间只能有一个线程访问 同时返回一个对象
public static synchronized Single1 getInstance(){
        if (s==null) {
            new Single1();
        }
        return s;
    }
//懒汉式-改良2 线程安全,效率高,可以有多个线程访问。
public static Single1 getInstance(){
        if (s==null) {
            synchronized (Single1.class){
                if (s==null) {
                    s = new Single1();
                }
            }
        }
        return s;
    }

饿汉式:

//饿汉式
public Single() {

}

private static Single s = new Single();

public static Single getInstance(){
        return s;
    }

实际开发中因懒汉式线程不安全,改良后代码复杂度变高,故一般选择饿汉式,但饿汉式虽然线程安全,但是因为一开始加载类就要new对象,所以效率比较低.

18.Tomcat修改端口号:

conf目录下找到server.xml,找到

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

修改port端口号即可

//TODO...未完待续

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值