面试知识点总结

1、基础

一、面向对象的特征?java

面向对象的三个基本特征是:封装、继承、多态。web

  • 封装: 也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。
  • 继承: 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可使用现有类的全部功能,并在无需从新编写原来的类的状况下对这些功能进行扩展。
  • 多态: 同一行为,经过不一样的事物,能够体现出来的不一样的形态;使用多态的前提:1. 存在继承或者实现关系;2. 子类或实现类必须重写父类方法;3. 父类引用指向子类对象

二、抽象类和接口有什么区别?spring

1)语法层面的区别:数据库

  • 抽象类能够提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  • 抽象类中的成员变量能够是各类类型的,而接口中的成员变量只能是public static final类型的;
  • 接口中不能含有静态代码块以及静态方法,而抽象类能够有静态代码块和静态方法;
  • 一个类只能继承一个抽象类,而一个类却能够实现多个接口。

2)设计层面的区别:编程

  • 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。

三、说说反射的用途及实现?设计模式

  • 概念: 在运行状态中,对于任意一个实体类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
  • 主要用途: 各种通用框架的功能实现上。
  • 实现: 经过 getClass();经过 Class.forName();使用类.class 类加载器实现,getClassLoader()

四、说说自定义注解的场景及实现数组

  • 概述: 注解其实就是代码里的特殊标记,它能够用于替代配置文件,
  • 使用场景: 类属性自动赋值;代替配置文件功能,像spring基于注解的配置;类属性的校验
  • 实现: java中有四种元注解:@Retention、@Inherited、@Documented、@Target
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
    public String name() default "zhangsan";
    public String email() default "hello@example.com";
}
复制代码
class  User{

    @MyAnno(name = "zhang")
    private String name;

    @MyAnno(name = "zhang@example.com")
    private String email;


    @MyAnno(name = "sayHelloWorld")
    public String sayHello(){
        return "";
    }
}
复制代码

五、HTTP 请求的 GET 与 POST 方式的区别?浏览器

mp.weixin.qq.com/s?__biz=MzI…安全

六、session 与 cookie 区别?bash

  • COOKIE: 在网站中,http请求是无状态的。也就是说即便第一次和服务器链接后而且登陆成功后,第二次请求服务器依然不能知道当前请求是哪一个用户。cookie的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,而后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器经过浏览器携带的数据就能判断当前用户是哪一个了。cookie存储的数据量有限,不一样的浏览器有不一样的存储大小,但通常不超过4KB。所以使用cookie只能存储一些小量的数据。

  • SESSION: session和cookie的做用有点相似,都是为了存储用户相关的信息。不一样的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有必定的弊端,就是会占用服务器的资源,但如今服务器已经发展至今,一些session信息仍是绰绰有余的。

  • COOKIE和SESSION结合使用: 存储在服务端:经过cookie存储一个session_id,而后具体的数据则是保存在session中。若是用户已经登陆,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户究竟是谁,以及以前保存的一些状态信息。

7. http与https的区别?

  • 主要区别:

    1)http是无状态的超文本传输协议,是明文传输的;而https至关因而http协议+ssl/tls协议。他是经过证书认证的安全加密密文传输协议。

    2)两种协议的的链接方式是彻底不一样的,端口号也不一样;http端口号是80;https是443.

  • 客户端使用https方式与web服务器通讯时的步骤:

    1)客户端使用https的url访问web服务器;要求与web服务器之间创建ssl通道。

    2)web服务器收到请求后,会向客户端发送一份网站证书(携带加密公钥)。

    3)客户端与web服务器协商ssl/tls加密等级。

    4)客户端根据协商的加密等级,创建会话秘钥,而后经过网站的公钥对 密钥进行加密,并传输给web服务器。

    5)web服务器根据手中的私钥解析出会话密钥。

    6)web服务器利用密钥和客户端通讯。

八、单例模式?

// 懒汉模式
public class Singleton{
    private Singleton () {}
    // 注意:须要关键字volatile修饰
    private volatile static Singleton singleton;
    // 注意:使用双重检验锁验证
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized(Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }   
        
        return singleton;
    }
}
复制代码
// 饿汉模式
public class Singleton{
    private Singleton (){}
    private static Singleton singleton = new Singleton();
    
    public static Singleton getInstance(){
        return singleton;
    }
}
复制代码
// 兼顾懒汉和饿汉模式(使用内部类的形式,线程安全,还实现了懒加载)
public class Singleton(){
    private Singleton () {}
    private static class SingletonHolder{
        private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance(){
        return SingleHolder.instance;
    }
}
复制代码

九、volatile 修饰符的有过什么实践?

实践一: volatile 修饰 64位的long 和 double 变量,使其能原子性的进行读写操做。由于这两种类型的操做是分为2部分的,第一次读取一个32位的,而后再读取剩下的32位的,这个过程并非原子性的。加上volatile关键字能够实现原子性操做(加锁)。

实践二:volatile修饰符经过设置内存屏障,实现变量的可见性。

十、快速排序

public class SuperClass {

    public static void main(String[] args) {
        int [] arr = {11, 4, 30, 2, -1, 9, 6, 7, 99, 77};
        SuperClass superClass = new SuperClass();
        superClass.sort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 递归排序
     * @param arry
     */
    public void sort(int [] arry, int low, int high){
        int pos = 0;
        if (low < high){
            pos = findPos(arry, low, high);
            this.sort(arry, low, pos - 1);
            this.sort(arry, pos + 1, high);
        }
    }

    /**
     * 寻找临界点
     * @param arr
     * @param low
     * @param high
     * @return
     */
    public int findPos(int [] arr, int low, int high){
        int val = arr[low];
        while (low < high){
            while (low < high && val <= arr[high]){
                high--;
            }
            arr[low] = arr[high];
            while (low < high && val >= arr[low]){
                low++;
            }
            arr[high] = arr[low];
        }
        // 找到第一个值,将第一个值做为临界点,将数组一分为二
        arr[low] = val;
        return low;
    }
}
复制代码

十一、说一下本身对 IOC 、AOP 的理解?

  • IOC(控制反转),它和DI(依赖注入)实际上是两个角度对同一件事的解释,能够简单理解为DI去实现ioc。控制反转其实就至关是把获取对象的控制反转过来,将对象的建立和获取交给ioc容器去完成。对象中只是被动的去接受依赖对象。获取依赖对象的过程反转了。
  • AOP(面向切面编程):是一种编程思想,经过分离横切关注点来加强模块性,在不改变现有代码的状况下,实现对功能的加强,动态的将代码切入到指定的方法的编程思想。
事务管理、日志的统一处理、权限的校验、异常的处理都是能够经过aop来进行统一处理。
复制代码

十二、Spring 中用到了那些设计模式,讲一下本身对于这些设计模式的理解?

  • 一、简单工厂模式
  • 二、工厂模式
  • 三、单例模式
  • 四、适配器模式
  • 五、包装器模式
  • 六、代理模式
  • 七、观察者模式
  • 八、策略模式
  • 九、模版方法模式

1三、Spring Bean 的做用域和生命周期了解吗?

  • 5种做用域:singleton、prototype、request、session、application做用域。

  • 生命周期:

-> 定义

-> 初始化(实现接口或配置init-method)

-> 使用

-> 销毁(实现接口或配置destory-method)

1四、事务的特性?

事务:是指逻辑上的一组操做,这组操做不能被分割,要么成功,要么失败。 四大特性:

  • 原子性:事务不能被分割,要么所有执行,要么所有不执行。
  • 一致性:事务执行先后,数据的必须保持完整性。
  • 隔离性:多个用户在执行数据库操做时,多个用户的事务执行,之间是不能有任何干扰的。
  • 持久性:一个事务被提交以后,对数据库的改变就是持久的。就算是数据库发生故障,也不该该对其有任何影响。

1五、Spring 事务中的隔离级别?

如不考虑事务的隔离级别,则会引发脏读、幻读、不可重复读。

  • 脏读: 一个事务读取了另外一个事务的还未提交的数据,一旦该事务回滚,则读取的数据就无效。
  • 幻读: 一个事务读取了几行记录以后,另外一个事务插入了几行数据,这时候幻读就发生了,在以后的查询中就会发现,有些记录不是第一个事务插入的。
  • 不可重复读: 在同一个事务中,由于是屡次读取,有可能前一个读取和后一个读取的数据,由于另外一个事务的更新产生不一致的状况。

1六、Spring 事务中的事务传播行为?

事务的传播行为:业务层方法之间的相互调用,事务的传递状况。

2、进阶

3、项目经验

相关文章
相关标签/搜索