美文网首页
一些Java基础问题

一些Java基础问题

作者: SHAN某人 | 来源:发表于2021-09-18 12:15 被阅读0次

    Java 接口和抽象类的区别

    接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。
    接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;
    同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。
    Java 标准类库中,定义了非常多的接口,比如 java.util.List。
    抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。
    除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可
    以没有抽象方法。抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,
    然后通过继承的方式达到代码复用的目的。
    Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如 java.util.AbstractList。

    注意JDK9开始接口有了方法实现

    Java8新增特性

    lamda
    接口支持默认方法
    Stream支持
    Optional 类
    线程安全的时间转换类 DateTimeFormate
    https://blog.csdn.net/yczz/article/details/50896975

    MQ怎么保证消息不丢失

    消息生产三个阶段

    生产者丢失消息
    怎么破呢?永远使用带有返回值值的消息发送方式,即 producer.send(msg,callback)
    通过callback可以准确的告诉你消息是否发送成功了,发送失败了你也可以有处置方法;
    网络抖动: 重发
    发送消息超出大小:调整消息大小进行发送
    这种情况并不是broker丢失消息了,是producer的消息没有提交成功。
    消费者丢失消息


    说明时候消费者丢失数据呢?即先更新位移,再消费消息,如果消费程序出现故障,没消费完毕,则丢失了消息,此时,broker并不知道。
    怎么破?总是先消费消息,再更新位移;这种可能带来消息重复消费的问题,但是不会出现消息丢失问题;
    关闭自动提交offset,在自己处理完毕之后手动提交offset,这样就不会丢失数据。
    broker丢失消息*
    一般要求设置4个参数来保证消息不丢失:
    ①给topic设置 replication.factor参数:这个值必须大于1,表示要求每个partition必须至少有2个副本。
    ②在kafka服务端设置min.isync.replicas参数:这个值必须大于1,表示 要求一个leader至少感知到有至少一个follower在跟自己保持联系正常同步数据,这样才能保证leader挂了之后还有一个follower。
    ③在生产者端设置acks=all:表示 要求每条每条数据,必须是写入所有replica副本之后,才能认为是写入成功了
    ④在生产者端设置retries=MAX(很大的一个值,表示无限重试):表示 这个是要求一旦写入事变,就无限重试

    匿名类是什么

    匿名内部类是局部内部类的更深入一步。假如只创建某类的一个对象时,就不必将该类进行命名。匿名内部类的前提是存在一个类或者接口,且匿名内部类是写在方法中的。只针对重写一个方法时使用,需要重写多个方法时不建议使用格式:new 类名或接口名(){
    重写方法;
    }; //注意分号
    //以上就是内部类的格式,其实这整体就相当于是new出来的一个对象下面举个多线程中的例子new Thread(){
    public void run(){
    System.out.println(getName());
    }
    }.start();
    上面例子,如果去除.start()就是一个线程的匿名内部类【创建匿名内部类的同时,也会创建一个
    对象】所以上文中的.start()就相当于调用了Thread的start方法
    ==============================
    https://www.runoob.com/java/java-anonymous-class.html

    线程池种类,怎么确定线程池中的线程数量

    线程池拒绝策略

    Spring中有哪些注入方式

    构造注入
    set 注入

    接口有多个实现类,如何确定注入哪个实现类

    事务隔离级别,分别解决了哪些问题

    image.png

    Spring bean中有哪些可选的scope

    1. singleton作用域(scope 默认值)
      当一个bean的作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把 一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都 将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中 只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时 候,spring的IOC容器中只会存在一个该bean。

    配置实例:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
    或者
    <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

    1. prototype
      prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。 清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)

    配置实例:
    <bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
    或者
    <beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>

    1. request
      request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:

    <web-app>
    ...
    <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    ...
    </web-app>
    如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:

    <web-app>
    ..
    <filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
    </web-app>
    接着既可以配置bean的作用域了:

    <bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>

    1. session
      session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:配置实例:和request配置实例的前提一样,配置好web启动文件就可以如下配置:

    <bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>

    1. global session
      global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。配置实例:和request配置实例的前提一样,配置好web启动文件就可以如下配置:

    <bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>

    相关文章

      网友评论

          本文标题:一些Java基础问题

          本文链接:https://www.haomeiwen.com/subject/euxdgltx.html