【Java面试题汇总】设计模式篇(2023版)

2023-10-26

  导航: 

【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud+黑马旅游+谷粒商城+学成在线+设计模式+牛客面试题

目录

谈谈你对设计模式的理解?

谈谈你对单例模式的理解?

手写一下单例模式

谈谈你对工厂模式的理解?

谈谈你对代理模式的理解?

谈谈你对模板模式的理解?

谈谈你对观察者模式的理解?

职责链模式

谈谈JDK中用到的设计模式?

谈谈Spring中用到的设计模式?


谈谈你对设计模式的理解?

关键字:总结的设计经验、通用解决方案、维护性通用性扩展性、降低复杂度、具体问题具体分析;七大原则、三种类型。

设计模式:

设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验。模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式的本质提高软件的维护性、通用性和扩展性,并降低软件的复杂度。

过度地使用设计模式可能会导致代码的过度抽象,增加了代码的维护难度和学习成本。因此,在使用设计模式时需要根据具体的项目需要和实际情况进行选择。

七大原则:

  • 单一职责原则:一个类应该只负责一项职责。提高可读性维护性、降低耦合。
  • 接口隔离原则:类之间的依赖关系应该建立在最小的接口上。例如实现类只能用到接口的部分方法,为了降低冗余提高可维护性,对原接口进行合理的拆分和组合。
  • 依赖倒转原则:高层模块不应该直接依赖于低层模块,两者都应该依赖于抽象。即详细应该依赖于抽象。在调用链上,调用者属于高层,被调用者属于低层。例如controller层不能直接依赖于service层,他们都应该依赖于抽象,即service接口。
  • 里氏代换原则:子类引用指向父类对象后功能未变,子类中尽量不要重写父类的方法。
  • 开闭原则:软件对扩展开放,对修改关闭。提高扩展性和可维护性。
  • 迪米特法则:最少知道原则,一个类对自己依赖的类知道的越少越好,只与直接的朋友(成员变量,方法参数,方法返回值的类)通信。
  • 合成复用原则:尽量使用聚合或组合的方式,而不是使用继承。也就是把需要用到的类作为本类的参数、成员变量、局部变量。

类之间关系:

  • 依赖:我用到了你,我就依赖你。例如你是我的成员变量、成员方法的参数返回值中间变量等。
  • 泛化:泛化就是继承。
  • 实现:实现类实现了接口。
  • 关联:类与类之间的关系,可以一对一、零对一、一对多等。例如学生和学号是关联的。
  • 聚合:整体和部分可以分割。例如电脑USB接口聚合了鼠标,鼠标是电脑的成员方法。
  • 组合:整体和部分不能分割。例如把鼠标焊死在电脑上,他们就是组合关系了。

设计模式类型:

  • 创建型模式:用于对象的创建,包括单例、工厂等模式。
  • 结构型模式:用于描述对象之间的组合关系,包括代理、享元等模式
  • 行为型模式:用于描述对象之间的通信和责任分配。包括模版方法、观察者、责任链等模式

谈谈你对单例模式的理解?

关键字:概念(一个实例、一个静态方法)、实现方案、优缺点(节省资源、避免重复创建对象、管理全局变量、注意线程安全)、场景(重量级对象)

保证一个类只有一个实例,并且只提供一个取得对象实例的静态方法。

实现方式: 

  • 饿汉:构造器私有化、类内部创建私有静态常对象、静态公共方法返回这个实例。线程安全(类加载器加载类是线程安全的),没用到会浪费内存(类加载过程会给类变量赋初值)。
  • 懒汉:类内部创建私有静态对象引用、静态公共方法判空再实例化再返回。懒加载,线程不安全,可以方法加synchronized锁实现同步但效率低。
  • 双重检查:优化懒汉,类内部引用volatile修饰,双层判空中间synchronized类级别锁。线程安全,延时加载,效率高,推荐。
  • 静态内部类:在静态内部类里面创建实例。线程安全,延时加载,效率高,推荐。
  • 枚举:提倡。枚举类的常量是单例的。

优点:

  • 节省资源:单例模式实例只有一个,可以避免重复创建对象,从而节省了资源,提高了系统性能。
  • 管理全局变量:单例模式可以用于管理全局状态和变量,方便在整个系统中共享数据
  • 简化系统架构:使用单例模式可以简化系统架构,减少类的数量和接口的复杂度。

缺点:

  1. 可能引发并发问题:单例模式在多线程中使用时,需要保证线程安全,否则可能会引发并发问题。
  2. 内存泄漏问题:单例对象是类变量,属于GC Roots,它和它引用的对象即使不再被引用,也不会被JVM垃圾回收。
  3. 可能增加系统复杂性:过度使用单例模式可能会增加系统复杂性,导致代码难以维护。
  4. 难以调试:由于单例模式全局共享状态,可能会导致调试过程中的问题难以定位和测试。

使用场景:

  • 需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多但又经常用到的对象(即:重量级对象)、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)
  • JDK中 java.lang.Runtime类就是饿汉式单例模式。

手写一下单例模式

实现方式: 饿汉懒汉、双重检查、静态内部类、枚举。

饿汉(静态常量版):线程安全,没用到会浪费内存。

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部创建对象
    private static final Singleton instance = new Singleton();

    // 3、向外暴露一个静态的公共方法
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉(同步方法版):懒加载,线程安全,但效率低(每次获取实例都要加锁),不推荐。

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部声明对象
    private static Singleton instance;

    // 3、向外暴露一个静态的公共方法,加入同步处理的代码,解决线程安全问题
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检查:线程安全、懒加载

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部声明对象,同时用`volatile`关键字修饰,为了保证可见性。
//原子性、可见性(修改立即更新到内存)、有序性
    private static volatile Singleton instance;

    // 3、向外暴露一个静态的公共方法,加入同步处理的代码块,并进行双重判断,解决线程安全问题
    public static Singleton getInstance() {
        if (instance == null) {    //第一次检查,可能有多个线程同时通过检查
//类级别的锁对象,锁对象是全局的,对该类的所有实例均有效。回顾锁对象是this时仅限于锁当前实例
            synchronized (Singleton.class) {    
                if (instance == null) {   //第二次检查,只会有1个线程通过检查并创建实例
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类:线程安全、延迟加载、效率高。

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、定义一个静态内部类,内部定义当前类的静态属性
    private static class SingletonInstance {
        private static final Singleton instance = new Singleton();
    }

    // 3、向外暴露一个静态的公共方法
    public static Singleton getInstance() {
        return SingletonInstance.instance;
    }
}

枚举:线程安全,延迟加载。

public enum Singleton {
    INSTANCE;
}

谈谈你对工厂模式的理解?

工厂类创建对象、工厂、抽象工厂 、复用性可维护性、具体问题具体分析。

以提高复杂性为代价,提高可维护性和复用性。 

工厂模式是一种创建型设计模式,它主要解决了对象的创建过程中的灵活性和可维护性问题。

工厂模式允许在不暴露对象创建逻辑的情况下,统一由工厂类负责创建对象并返回,从而降低了代码的耦合性。

简单工厂模式:工厂类的静态方法根据情景创建并返回不同实例

public class PizzaFactory {
    public static Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if("芝士披萨".equals(orderType)) pizza = new CheesePizza();
        //else if()... else....
        return pizza;
    }
}

工厂方法模式:抽象工厂里定义返回抽象产品实例的抽象方法,各具体工厂类决定要实例化的具体产品类实例。

public abstract class OrderPizza {
    public abstract Pizza createPizza(String orderType);
    // ...
}

抽象工厂模式:抽象工厂接口定义返回产品实例的方法,各具体工厂类决定要实例化的具体产品类实例。

重写回顾:重写时返回值类可以是原返回值类的子类、访问权限不能比其父类更为严格、抛出异常不能比父类更广泛。

public interface AbsPizzaFactory {
    Pizza createPizza(String orderType);
}

优点:

  • 可维护性:可以避免直接使用new关键字创建对象带来的耦合性,提高了代码的可维护性;
  • 复用性:可以将对象的创建逻辑封装到一个工厂类中,提高了代码的复用性;
  • 方便维护和升级:可以对对象的创建逻辑进行统一管理,方便代码的维护和升级。

缺点:

  • 代码规模:增加了代码的复杂度,需要创建工厂类,会增加代码规模;
  • 耦合性:如果产品类发生变化,需要修改工厂类,可能会影响到其他代码的功能。

综上所述,工厂模式是一种常用的创建型设计模式,可以提高代码的可维护性、复用性和灵活性。但是,在使用时需要权衡利弊,避免过度使用,增加代码的复杂度。

谈谈你对代理模式的理解?

关键字:结构性、代理对象、增强、控制远程对象、安全控制;静态代理、相同代理接口;JDK动态代理、反射、内存、代理工厂、Proxy.newProxyInstance()、Spring AOP;Cglib 代理、子类对象、代理工厂、ASM框架、MethodInterceptor接口的intercept()方法、cglib包的Enhancer工具类

代理模式是结构型设计模式(用于描述对象之间的组合关系)。

代理模式:在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。主要包括静态代理、JDK动态代理、Cglib 代理。

静态代理:目标对象与代理对象实现租同的接口或抽象父类,通过实现方法进行增强。在编译时生成代理对象。

JDK动态代理:目标对象实现代理接口,简单工厂类返回Proxy.newProxyInstance(类加载,类class对象,实现了invoke()方法的InvocationHandler对象)方法创建的代理对象。利用Java反射机制在运行时动态地在内存中生成代理对象。Spring AOP采用了JDK动态代理的方式,在运行时动态的创建代理对象来实现增强。

//代理接口 ITeacherDao,目标对象TeacherDao,目标对象实现了代理接口
/**
 * 代理工厂
 */
public class TeacherFactory {
    /**
     * 目标对象
     */
    private Object target;
 //构造参数是目标对象
    public TeacherFactory(Object target) {
        this.target = target;
    }
 
    public Object newProxyInstance() {
//1。ClassLoader loader : 指定当前目标对象使用的类加载器,获取加载器的方法固定
//2,Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型
//3。InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法,会把当前执行的目标对象方法作为参数传入
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK代理授课开始...");
                Object returnVal = method.invoke(target, args);
                System.out.println("JDK代理授课结束...");
                return returnVal;
            }
        });
    }
}
//创建目标对象
ITeacherDao target = new TeacherDao();
//给目标对象,创建代理对象,可以转成 ITeacherDao
ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();

Cglib 代理:简单工厂类实现方法拦截器接口(MethodInterceptor),重写intercept()方法编写增强逻辑,并通过增强器类(Enhancer)基于反射和ASM框架操作原始对象这个成员变量,创建并返回代理对象实例。在内存中构建一个子类对象从而实现对目标对象功能扩展。ASM框架主要用来操作字节码文件,可以直接生成字节码,也可以通过访问现有字节码来修改它。

/**
 * 代理工厂类,实现MethodInterceptor 接口
 */
public class ProxyFactory implements MethodInterceptor {
    /**
     * 目标对象
     */
    private Object target;
 
    /**
     * 构造函数
     *
     * @param target
     */
    public ProxyFactory(Object target) {
        this.target = target;
    }
 
    /**
     * 返回代理对象实例。不是静态方法
     *
     * @return
     */
    public Object getProxyInstance() {
        // 1、创建工具类
        Enhancer enhancer = new Enhancer();
        // 2、设置父类
        enhancer.setSuperclass(target.getClass());
        // 3、设置回调函数
        enhancer.setCallback(this);
//或者
//      enhancer.setCallback(new MethodInterceptor() { 
//        @Override 
//        public Object intercept(Object obj, Method method, 
//            Object[] args, MethodProxy proxy) throws Throwable { 
//          return method.invoke(obj, args); 
//        } 
//      }); 

        // 4、创建子类对象,即代理对象
        return enhancer.create();
    }
 
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib代理开始...");
        Object retVal = method.invoke(target, args);
        System.out.println("cglib代理结束...");
        return retVal;
    }
}

谈谈你对模板模式的理解?

行为型模式:用于描述对象之间的通信和责任分配。

实现方式:抽象类有一个模板方法和其他行为方法,模板方法按流程调用各行为方法(抽象或非抽象);具体子类重写抽象的行为方法。 

/**
 * 抽象方法
 */
public abstract class SoyaMilk {
    /**
     * 模板方法,定义为final禁止覆写
     */
    public final void make() {
        System.out.println(">>>>>>豆浆制作开始<<<<<<");
        useSoyBean();
        addIngredients();
        soak();
        mash();
        System.out.println(">>>>>>豆浆制作结束<<<<<<");
    }
// 同包可见、对其他包下的子类可见。
    protected void useSoyBean() {
        System.out.println("Step1. 选用上好的黄豆.");
    }
//添加原材料是抽象方法,因为不同豆浆原材料不一样
    protected abstract void addIngredients();
 
    protected void soak() {
        System.out.println("Step3. 对黄豆和配料进行水洗浸泡.");
    }
 
    protected void mash() {
        System.out.println("Step4. 将充分浸泡过的黄豆和配料放入豆浆机中,开始打豆浆.");
    }
}
/**
 * 花生豆浆
 */
public class PeanutSoyaMilk extends SoyaMilk {
    public PeanutSoyaMilk() {
        System.out.println("============花生豆浆============");
    }
    @Override
    protected void addIngredients() {
        System.out.println("Step2. 加入上好的花生.");
    }
}
/**
 * 红豆豆浆
 */
public class RedBeanSoyaMilk extends SoyaMilk {
    public RedBeanSoyaMilk() {
        System.out.println("============红豆豆浆============");
    }
    @Override
    protected void addIngredients() {
        System.out.println("Step2. 加入上好的红豆.");
    }
}

优点:

  1. 可重用性和可维护性:由于算法的骨架在父类或者抽象类中实现,因此可以避免在每个子类中重复编写相同的代码,提高了代码的可重用性和可维护性;
  2. 可扩展性:由于子类只需要实现特定的部分而不需要修改算法的整体结构,因此可以提高代码的安全性和可扩展性;
  3. 一致性和稳定性:可以在父类或者抽象类中控制算法的结构和执行流程,从而保证算法的一致性和稳定性。

应用场景:

AQS是基于模板方法模式进行设计的。锁的实现类需要继承AQS并重写它指定的方法。

AQS的模板方法将“管理同步状态的逻辑”提炼出来形成标准流程,这些方法主要包括:独占式获取同步状态、独占式释放同步状态、共享式获取同步状态、共享式释放同步状态。 

谈谈你对观察者模式的理解?

关键字: 行为型、一对多、两个接口、主题、注册、移除、通知观察者更新;观察者、更新;耦合、开闭原则、复杂度;JDK、Observable、Observer

观察者模式:当主题对象状态发生改变时,它的观察者对象都能得到通知并自动更新。行为型设计模式(描述对象之间的通信和责任分配)。

实现方法:

  • 主题对象实现主题接口的注册、移除、通知方法,并管理资源和观察者列表
    • 注册:将参数传来的观察者对象添加到观察者列表里。
    • 通知:循环调用所有观察者更新方法。
  • 观察者对象实现观察者接口的更新方法,并管理资源;
/**
 * 主体对象接口,有注册、移除和通知功能;
 */
public interface Subject {
//注册某观察者
    void registerObserver(Observer o);
//移除某观察者
    void removeObserver(Observer o);
//通知
    void notifyObservers();
}
/**
 * 主体对象实现,聚合观察者列表,管理天气信息和观察者列表;
 */
public class WeatherData implements Subject {
//资源:温度、气压、湿度
    private Float temperature;
    private Float pressure;
    private Float humidity;
    private List<Observer> observerList;
 
    public WeatherData() {
        observerList = new ArrayList<>();
    }
 
    public Float getTemperature() {
        return temperature;
    }
 
    public Float getPressure() {
        return pressure;
    }
 
    public Float getHumidity() {
        return humidity;
    }
 
    /**
     * 推送天气数据到网站
     */
    public void dataChange() {
        notifyObservers();
    }
 
    /**
     * 当天气数据发生变化时进行更新
     *
     * @param temperature
     * @param pressure
     * @param humidity
     */
    public void setData(Float temperature, Float pressure, Float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        dataChange();
    }
//注册某观察者
    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }
//移除某观察者
    @Override
    public void removeObserver(Observer o) {
        if(o!= null && observerList.contains(o)) {
            observerList.remove(o);
        }
    }
//通知
    @Override
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.update(temperature, pressure, humidity);
        }
    }
}
/**
 * 观察者接口,发起更新天气信息请求;
 */
public interface Observer {
    void update(Float temperature, Float pressure, Float humidity);
}
/**
 * 观察者实现,发起更新天气信息请求和使用天气
 */
public class CurrentConditions implements Observer {
    private Float temperature;
    private Float pressure;
    private Float humidity;
 
    @Override
    public void update(Float temperature, Float pressure, Float humidity) {
        // 更新最新天气数据
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        // 展示最新天气数据
        display();
    }
 
    /**
     * 公告板展示天气情况
     */
    public void display() {
        System.out.println("============最新天气============");
        System.out.println("*** 当前温度:" + this.temperature + " ℃ ***");
        System.out.println("*** 当前气压:" + this.pressure + " kPa ***");
        System.out.println("*** 当前湿度:" + this.humidity + " %RH ***");
    }
}

优点:

  • 降低耦合:降低了对象之间的耦合度,因为主题对象不需要知道观察者的具体实现,只需要知道观察者实现了一个特定接口即可。
  • 动态扩展:可以动态扩展观察者列表,方便灵活。
  • 开闭原则:实现了对象之间的一对多依赖关系,提高了系统的可维护性和可重用性。遵守了ocp原则(开闭原则:对扩展开放,对修改关闭)。

缺点

  • 通知耗时:当观察者过多时,通知过程需要花费较多的时间,会影响系统的性能。
  • 循环依赖导致死循环:如果观察者与主题对象之间存在循环依赖,可能会出现死循环

JDK:提供观察者模式基础功能的主题抽象类和观察者接口:

Observable抽象类简单实现了主题对象基础功能(注册、移除、通知);

Observer即观察者接口,具有update()方法  。

职责链模式

类似一个链表。

抽象处理人:成员变量是资源和下一个抽象处理人,通过setNext()设置下一个抽象处理人(后面会多态形式传参具体处理人)。

具体处理人:层层判断处理权限,没权限的话把请求交给下一个具体处理人,有权限就处理。

测试方法:创建每个具体处理人对象,通过setNext()按处理人权限把每个对象串起来。

/**
 * 抽象审批人对象
 */
public abstract class Approver {
    protected Approver nextApprover;
    protected String name;
 
    public Approver(String name) {
        this.name = name;
    }
 
    /**
     * 设置后继者
     *
     * @param nextApprover
     */
    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
 
    /**
     * 处理请求的方法
     */
    public abstract void processRequest(PurchaseRequest purchaseRequest);
}
/**
 * 教学主任审批人
 */
public class TeachDirectorApprover extends Approver {
    public TeachDirectorApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() <= 5000) {
            System.out.println("请求编号:" + purchaseRequest.getId() + ",处理人:" + this.name);
        } else {
            nextApprover.processRequest(purchaseRequest);
        }
    }
}
/**
 * 院长审批人
 */
public class DepartmentHeadApprover extends Approver {
    public DepartmentHeadApprover(String name) {
        super(name);
    }
 
    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 10000) {
            System.out.println("请求编号:" + purchaseRequest.getId() + ",处理人:" + this.name);
        } else {
            nextApprover.processRequest(purchaseRequest);
        }
    }
}
//创建一个请求。id是1,价格是31000.0f
PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000.0f);
 
//创建相关的审批人
TeachDirectorApprover teachDirectorApprover = new TeachDirectorApprover("童主任");
DepartmentHeadApprover departmentHeadApprover = new DepartmentHeadApprover("王院长");
ViceChancellorApprover viceChancellorApprover = new ViceChancellorApprover("钱副校长");
ChancellorApprover chancellorApprover = new ChancellorApprover("郑校长");
 
//设置后继者(处理人形成环形)
teachDirectorApprover.setNextApprover(departmentHeadApprover);
departmentHeadApprover.setNextApprover(viceChancellorApprover);
viceChancellorApprover.setNextApprover(chancellorApprover);
chancellorApprover.setNextApprover(teachDirectorApprover);
 
//发起一个请求
teachDirectorApprover.processRequest(purchaseRequest); //请求编号:1,处理人:郑校长

谈谈JDK中用到的设计模式?

单例模式:

JDK中 java.lang.Runtime类就是饿汉式单例模式。

静态简单工厂模式 

Calendar 类中,使用了静态简单工厂模式:由一个工厂对象(可以是抽象类,可以是非抽象类)决定创建出哪一种产品类的实例

Calendar 类是一个抽象的工厂类,用于根据时区和地区创建出具体的日期类对象。 

其中getInstance()静态方法用于返回具体日期类的实例,它调用createCalendar(时区,地区)方法创建具体日期类,例如JapaneseImperialCalendar日本国日期类

观察者模式

JDK提供观察者模式基础功能的主题抽象类和观察者接口:

Observable抽象类简单实现了主题对象基础功能(注册、移除、通知);

Observer即观察者接口,具有update()方法  。

谈谈Spring中用到的设计模式?

Spring AOP采用了JDK动态代理的方式,在运行时动态的创建代理对象来实现增强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java面试题汇总】设计模式篇(2023版) 的相关文章

  • Oracle的服务器JRE包含JDK?

    我刚刚下载了适用于 Java SE 7 的 Oracle Server JRE link http www oracle com technetwork java javase downloads server jre7 downloads
  • Jprofiler Linux 上的远程分析。如何更改探查器数据文件的路径

    我正在 Linux 盒子上运行 java java 6 应用程序并进行其他设置 agentpath home myuser jprofiler bin linux x64 libjprofilerti so nowait 端口 7777 在
  • 在远程 Tomcat 上自动部署 Java 应用程序

    我希望能够自动将 Java 应用程序部署到 tomcat 服务器 现在的情况 正在 Eclipse 中开发 Java 项目 Tomcat 服务器在另一台机器上运行 提供该项目的 WAR 文件 我的目标 可以轻松编译项目并将其部署到远程 To
  • Jersey 2 - ContainerRequestFilter get 方法注解

    我试图获取 ContainerRequestFilter 对象中的方法注释 控制器 GET RolesAllowed ADMIN public String message return Hello rest12 容器请求过滤器 Provi
  • java中的内联初始化块

    我有课 public class MyMain public static void main String arg Temp t new Temp System out println instance initialize class
  • JTable 中的格式化字段问题 - Integer 和 Double 之间的差异

    更新 已确认为错误当 columnClass 为 Double 时 JTable 无法将给定对象格式化为 Number 错误 ID 7051636 https bugs java com bugdatabase view bug bug i
  • 通过 jdbc 执行存储过程时获取网关超时

    我正在使用 struts2 框架 它基本上是这样的 ActionClass execute call function in business class which returns an object and store this obj
  • 如何向正在运行的 Linux 进程发送 Ctrl-Break?

    我正在调试在 Sun 的 JDK 1 4 2 18 上运行的应用程序中的内存泄漏 该版本似乎支持命令行参数 XX HeapDumpOnCtrlBreak 这可能会导致 JVM 在遇到控制中断时转储堆 如何将其发送到 Linux 机器上的后台
  • 如何在 Apache POI 中获取 Excel 空白单元格值?

    我有一个巨大的 Excel 文件 其中包含大量列 如下所示 Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr 这是我编写的用于打印这些值的代码 try FileInput
  • 字符串文字的行为令人困惑

    下面的代码中字符串文字的行为非常令人困惑 我可以理解第 1 行 第 2 行和第 3 行是true 但为什么是第 4 行false 当我打印两者的哈希码时 它们是相同的 class Hello public static void main
  • 配置 logback 以遵循 Java 配置,即 Logback 的纯 Java 配置

    我只是不喜欢 Logback 的 XML 或 Groovy 配置 更喜欢用 Java 进行配置 这也是因为我将在初始化后的不同时间在运行时更改配置 似乎对 Logback 进行 Java 配置的唯一方法是进行某种初始化劫持根追加器 http
  • Android文件上传器与服务器端php

    我几个小时以来一直在寻找解决方案 但找不到任何解决方案 基本上 我想从我的 Android 设备上传文件到 http 网站 但是 我不知道如何做到这一点 我在设备上使用java 并且我想在服务器端使用PHP 我只想上传文件 而不是在服务器上
  • Spring - 使用 new 是一种不好的做法吗?

    正在创建对象by hand 即使用new操作员而不是注册Springbean 和使用依赖注入被认为是不好的做法吗 我的意思是 确实Spring IoC容器必须了解应用程序中的所有对象吗 如果是这样 为什么 你希望 Spring 创建 bea
  • HTML 解析和删除锚标记,同时使用 Jsoup 保留内部 html

    我必须解析一些html并删除锚标记 但我需要保留锚标记的innerHTML 例如 如果我的 html 文本是 String html div p some text a href some link text a p div 现在我可以解析
  • Java HashSet 具有自定义相等标准? [复制]

    这个问题在这里已经有答案了 我一直在寻找类似于 Java TreeSet 在实例化时接收自定义比较器的能力 因此我不需要使用对象的默认相等 和哈希码 标准 我能想到的最接近的方法是将我的对象包装在一个私有的自定义类中 但这看起来很老套 这最
  • 用 org.Json 解析 Java 中的 JSON?

    我在这方面遇到了很多麻烦 我正在尝试进行更新 并且正在使用从 url 返回此内容的 api JSON downloadUrl URL fileName Name gameVersion Version name Name projectId
  • Spring MVC - 两次提供内容

    我已经花了一周时间寻找有关如何将内容服务器到我的网页的指导 两次 因为使用 Model 或 ModelAndView 切断内容一次可以工作 但如果用户再次与页面交互 我希望它加载更多内容同一页 Java Spring 后端方法 Get 有效
  • Android 中的 RoboSpice 库是什么

    我正在尝试了解 android 中的 RoboSpice 库 我在这里看到了在线文档 https github com stephanenicolas robospice wiki Starter Guide 我尝试过什么 我之前研究过使用
  • Java - 全局、可重用的加载对话框

    我正在尝试实现一个全局加载对话框 我想调用一些静态函数来显示对话框和一些静态函数来关闭它 与此同时 我正在主线程或子线程中做一些工作 我尝试以下操作 但对话框没有更新 最后一次 在再次隐藏之前 它会更新 private static Run
  • 如何将钱兑换成零钱

    尝试将输入的数字转换为 25 美分 50 美分 10 美分和 10 分 有几个问题 public class Coins public static void main String args private int quarters di

随机推荐

  • STL源码剖析-Allocator

    一 第一级配置器 顾名思义 Allocator是用来做内存分配的 第一级配置器指的是当需要128bytes以上的内存时直接使用malloc和realloc进行内存分配 代码如下 第一级配置器 2023 04 07 template
  • 解决M1处理器款mac安装PR闪退问题 Premier 2020 Mac(已适配M1芯片,支持最新款M1芯片Mac)可稳定运行

    苹果公司最新发布的基于M1芯片的Mac笔记本电脑应该很多小伙伴都入手了 但是最新的Mac由于采用的是基于ARM架构的核心 对很多基于Intel 英特尔 处理器的老款mac的软件应用兼容不太好 导致很多现有软件安装好后无法运行 或者报错和闪退
  • elasticsearch query related

    public abstract class EsBaseDaoImpl
  • 汽车电子_EMC测试_RE试验整改

    测试设备DUT状态 DUT带壳 未安装导电泡棉 辐射抗扰度试验 辐射抗扰度试验 270MHz频段出现画面卡死 试验暂停未继续 BCI试验 CBCI出现故障 RE试验 30 200M H方向 Frequency MHz MaxPeak dB
  • Maven高级:多环境配置与应用

    Maven高级 Maven高级 分模块开发 Maven高级 依赖管理 Maven高级 聚合和继承 Maven高级 根据需求完成生成 开发 测试环境 并在各个环境间切换运行 一 多环境配置与应用 这一节中 我们会讲两个内容 分别是多环境开发和
  • vue3 antd 表格点击和点击背景色

    页面
  • win7在64位系统下编译openssl

    以前在笔记本上配置过openssl 0 9 8g版本 今天在公司的台式机上配置死活没配置成功 机器的系统是win7 64位 编译openssl 1 0 1e出现各种莫名的错误 最后无意中编译了1 0 0 a版本编译成功了 如果出现ml找不到
  • Selenium-Server-Standalone搭建

    一 概述 先说说背景吧 Selenium是一个优秀的自动化测试框架 可以模拟浏览器的各种操作来代替人工操作 不同的浏览器有 不同的driver来驱动 之前项目中使用的firefoxDriver chromeDriver有一个缺点 就是浏览器
  • VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~

    VSCode配置MSVC VSCode使用easyx库 2021 5 13日配置 想必很多人和我一样 想用vscode编程c easyx库不支持MinGW 一般人都是直接使用vs2019安装easyx库用来GUI编程 那么爱折腾的VSCod
  • 使用PHP简单操作Memcached

    记得一定要先启动Memcached哦 root localhost usr bin memcached d l 127 0 0 1 p 11211 m 150 u root 使用ps命令查看一下运行状态 root localhost ps
  • 结构体内存对齐详解

    目录 一 结构体的对齐规则 二 修改默认对齐数 三 位段 四 枚举 五 联合 共用体 一 结构体的对齐规则 1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 对齐数 的整数倍的地址处 对齐数 编译器默认的一个
  • Ubuntu16.04 64位下安装VMware Tools过程

    因为在虚拟机下安装Ubuntu16 04 64位时无法进入全屏模式 采用另外一种方法解决了 但是还是想安装一下VMware Tools 防止以后出现相关问题 好啦 下面进入正题 1 在虚拟机下会看到安装 VMware Tools 单击安装
  • C# 各种符号用法

    参考 C 的7种用法 c 软泡芙的博客 CSDN博客 C 问号操作符详解 知乎 的7种用法 可空类型修饰符 int i num null 表示可空的整型 DateTime time dateTime null 表示可空的时间 三元 运算符
  • join(long millis)意思?join()作用

    join 作用 class JoinThread implements Runnable public void run for int i 0 i lt 100 i System out println Thread currentThr
  • FT2232作为JTAG烧录器的使用步骤详解

    FT2232作为JTAG烧录器的使用步骤详解 FT2232作为JTAG烧录器的使用步骤详解 配置OpenOCD环境 已经配置好的可以跳过 步骤 1 安装 FT2232HL 芯片的驱动 安装文件为 CDM21228 Setup exe 步骤
  • unity AR3D物体识别

    上篇讲到了各种AR插件的一些对比 因为上个项目需求用到3D物体追踪 所以使用了EasyAR和Vuforia两种进行了测试对比 因为如果需要AR识别 都需要有识别点 大致都是基于物体材质纹理来进行识别 1 先讲一下EasyAR的3D物体识别
  • 【百问网】物联网项目学习总结

    初步实现项目 项目程序流程图 TCP连接流程 模式1 站点模式 写代码去实现了这个TCP的连接流程 我们的思路就是 首先直接操作ESP8266 进行功能验证 ST Link Debugger 点击Settings 勾选Reset and R
  • 远程访问数据库出错的解决办法

    案例 在aws服务器中的项目访问在华为云中的测试服务器的数据库 报错 Access denied for user root ec2 XXX XXX XXX XXX cn north 1 compute amazonaws com cn u
  • Linux指令系统文件复制到U盘

    Linux指令系统文件复制到U盘 文章目录 Linux指令系统文件复制到U盘 1 建立U盘挂载点 2 查看U盘所在分区 3 查看U盘类型 4 挂载U盘 5 复制文件 6 移除U盘 1 建立U盘挂载点 在挂载点处建立文件夹 mkdir 路径
  • 【Java面试题汇总】设计模式篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 谈谈你对设计模式的理解 谈谈你对单例模式的理解 手写一