面试题合集1

91 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

Java面向对象有哪些特征,如何应用

面向对象编程利用的是类和对象编程的一种思想,万物都可归类。类其实就是对事件事物的抽象,不同事物间有不太的关系。

Java面向对象有三个特征:封装继承多态。

封装说明的是应该类的行为和属性与其他类的关系,低耦合高内聚。继承是父类和子类的关系,多态是类和类之间的关系

封装隐藏了内部类的实现机制,给外界一个接口,外界只能通过接口使用整个功能,不需要关心接口内部怎么实现的,它保护了数据。

  • 属性的封装,使用者只能通过事先制定好的方法类访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作。
  • 方法的封装:使用者按照既定的方式调用方法,奴需要关系方法内部的实现,便于使用,便于修改,增强代码的可维护性

继承是从已有的类派生出新的类,即需要两个类,发生在父与子之间。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的属性方法。比如:父类是动物类,子类可以是猫类,狗类。Java通过extends关键字来实现继承,父类中通过private定义的变量和方法不会被继承,不能在子类中直接操作父类通过private定义的变量以及方法。

继承里面就涉及到方法的重写。子类重写父类的方法。需要满足:两小一大名参同

  • 两小:返回类型和异常比父类小
  • 一大:访问权限比父类大
  • 名参同:方法名,参数和父类一样

相比封装继承,多态是最难的,它是类和类之间关系。多态必备三个要素:继承,重写,父类引用指向子类对象。

ACID靠什么保证?

第一步介绍什么是acid

image.png

第二步他的依赖:

  • 原子性,由undolog日志保证,它记录回滚日志。当事务测序时候,回滚sql。
  • 一致性:由其他三大特征保证,程序代码需要保证业务一致性
  • 隔离性:由mvcc控制
  • 持久性:由redolog保证,mysql修改时候,会在其中记录,就算数据没有修改成功,业务有记录,使用不会进行数据的丢失。

创建线程的方式

  1. 继承thread类
public class myThread extends Thread{
    public void run(){
      System.out.println("thread");
     }
}

myThread my=new mythread();
my.start();

步骤:继承thread,重写run方法,创建子线程实例,调用start方法。

  1. 实现runnable接口。
class myThread implements Runnable{
    @Override
    public void run(){
      System.out.println("thread");
     }
}

public static void main(String[] args){
    myThread my=new Thread(new myThread());
    my.start();
}

步骤:实现runnable接口,实现run方法,传教runnable实例,并把他作为参数用来创建thread,调用start启动。

  1. 实现Callable接口,并通过FutureTask包装器来创建Thread线程
class myThread<Object> implements Callable<Object>{
    @Override
    public Object call() throws Exception{
      System.out.println("thread");
      return null;
     }
}

public static void main(String[] args){
    Callable<Object> one = new myThread<Object>();
        FutureTask<Object> oneTask = new FutureTask<Object>(one);
        Thread t = new Thread(oneTask);
        System.out.println(Thread.currentThread().getName());
        t.start();
}

步骤:实现callable接口,重写call方法,创建callable实例,并且以该实例作为参数,创建FutureTask对象,创建thread对象,然后启动线程

FutureTask参考: Future & FutureTask 使用详解 - 掘金 (juejin.cn)

实现接口比继承 Thread 类所具有的优势主要有:

  • 可以避免 JAVA 中单继承的限制;
  • 线程池只能放入实现 Runable 或 Callable类线程,不能直接放入继承 Thread 的类
  • 代码可以被多个线程共享,代码和数据独立,适合多个相同的程序代码的线程去处理同一个资源的情况
  1. 线程池 线程池:其实就是管理线程的容器。它可以管理线程,防止线程过多(避免无节制创建线程),导致系统崩溃。并且它可以让线程复用。

线程池需要依赖一些参数来控制任务的执行流程,其中最重要的参数有: corePoolSize(核心线程数)、workQueue(等待队列)、 maxinumPoolSize(最大线程数)、handler(拒绝策略)、 keepAliveTime(空闲线程存活时间) 步骤:

  • 判断线程数是不是达到核心线程数,如果没有,新建线程。如果已经到了,转下一步
  • 判断等待队列是不是满了,如果没有,放入等待队列,如果满了,进入下一步
  • 判断线程数是不是到了最大线程数,如果没有,新建线程,如果有,转下一步 因为已经到最大线程了,使用采用拒绝策略,拒绝该任务
  • 新建线程处理完当前任务后,不会立即关闭而是继续处理等待队列中的任务。
  • 如果线程的空闲时间达到了存活时间,则线程池会销毁一部分线程, 将线程数量收缩至核心线程数大小。