JAVA重要知识点梳理(一)

2023-05-16

1、Struts2和SpringMVC的区别

(1)设计理念前者为有状态的Action(均为多例)Action对象属性字段承载请求、响应,后者一般为无状态的Controller,请求直接封装到方法的参数中;

(2)集中访问点不同都属于前端控制器,用于接收请求、处理请求和生成响应,但集中访问点不同,前者为Filter,后者为Servlet;

(3)请求处理粒度不同前者一个Action对应一个请求上下文,后者一个方法对应一个请求上下文,因此更容易实现Rest;

(4)拦截器机制不同Struts2和SpringMVC的拦截器机制均是对AOP理念的应用,但Struts2的interceptor机制是通过代理机制(ActionProxy)+责任链模式实现的,SpringMVC的interceptor机制实现比较简单,其通过循环的方式在handler处理请求前后分别调用preHandle()方法和postHandle()方法对请求和响应进行处理,与Spring AOP、责任链模式等基本无关;

(5)ajax的支持不同:前者需要插件或者手动转化,而后者集成了对Ajax请求的处理(HttpMessageConverter);

(6)Spring的整合:前者需要插件,后者无缝整合(子容器);

(7)配置/效率:后者几乎是零配置,开发效率更高。

2、Spring中IOC的理解

(1)超级大工厂对象控制权由调用者移交给容器,使得调用者不必关心对象的创建和管理,专注于业务逻辑开发;

(2)优秀的解耦方式解耦对象间的依赖关系,避免通过硬编码的方式耦合在一起;

(3)底层实现:反射机制;

3、Spring中AOP的理解

(1)一种新的模块化方式,专门处理系统各模块中的交叉关注点问题,将具有横切性质的系统级业务提取到切面中,与核心业务逻辑分离(解耦);

(2)便于系统的扩展,符合-闭原则;

(3)动态AOP的实现,Java动态代理(接口代理)cglib(类代理),具体由Bean后处理器生成代理;

(4)AOP理念实践:Spring AOP,Java Web FilterStruts2 Interceptor SpringMVC Interceptor

4、JVM 基础

4.1内存模型

(1)程序计数器:线程私有,CPU调度的基本单位,用于保证线程切换(程序能够在多线程环境下连续执行);

(2)(服务Java方法虚拟机栈、服务Native方法的本地方法栈):线程私有,局部变量/引用,栈深度(SOF)/无法申请内存(OOM);

(3)(Java代码可及的Java堆JVM自身使用的方法区):线程共享,对象分配和回收主要区域,OOM

4.2垃圾回收机制

(1)Stop-the-World

    JVM由于要执行GC而停止了应用程序的执行称之为Stop-the-World,该情形会在任何一种GC算法中发生。当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态直到GC任务完成。事实上,GC优化很多时候就是指减少Stop-the-world发生的时间,从而使系统具有高吞吐 、低停顿的特点。

(2)JAVA堆的回收

关于Java对象的回收主要考虑以下两个问题:哪些对象可以被回收、怎么回收(有哪些回收算法以及有哪些垃圾回收器)。

判断对象是否可被回收:引用计数法(相互引用)、可达性算法(对象的引用链是否可达,GCRoots)

垃圾回收算法:标记-清除算法(内存碎片)、复制算法(垃圾回收较为频繁、对象存活率较低的新生代)、标记-整理算法(垃圾回收不频繁、对象存活率较高的老年代)、分代收集算法

垃圾回收器:串行收集器(新生代、老年代)、并行收集器(新生代、老年代)、并行清除收集器(并发,新生代,追求高吞吐)、CMS收集器(并发,老年代,标记-清除算法,追求低停顿)、G1垃圾收集器(整个堆,追求低停顿)

附:

GC Roots一般包括虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中类静态属性引用的对象、方法区中常量引用的对象。

附:

GC Roots一般包括虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中类静态属性引用的对象、方法区中常量引用的对象。

分代收集算法的基本思想是不同的对象的生命周期(存活情况)是不一样的,而不同生命周期的对象位于堆中不同的区域,因此对堆内存不同区域采用不同的策略进行回收可以提高 JVM 的执行效率。Minor GC 发生频率较高,不一定等 Eden区满了才触发;Major GC在老年代满时触发,对年轻代和老年代进行回收。

(3)方法区回收

对常量池的回收。

对类型的卸载:该类的所有实例被回收,该类的ClassLoader被回收,不存在对该类的Class对象的引用

4.3 OOM/SOF

1)OOM for Heap:内存泄露(GC Roots的引用链,对象的生命周期超出预期)或者内存溢出(调节JVM参数 -Xms,-Xmx 等)

2)OOM for Stack:一般在单线程程序中不会出现;在多线程环境下,无法申请到足够的内存去创建线程

3)SOF for Stack:程序是否有深度递归

4OOM for Perm :用到像Spring等框架的时候,常常会动态地生成大量的类导致永久代不够用而导致OutOfMemoryError: PermGen Space异常(调大 -XX:MaxPermSize)

5、JVM 调优

JVM 调优的主要目标是使系统具有高吞吐、低停顿的特点,其优化手段应从两方面着手:Java虚拟机Java应用程序前者指根据应用程序的设计通过虚拟机参数控制虚拟机逻辑内存分区的大小以使虚拟机的内存与程序对内存的需求相得益彰;后者指优化程序算法,降低GC负担,提高GC回收成功率。以下是一些常用的JVM调优工具:

(1)Jconsole 与 Visual VM

JConsole 与 Visual VM 都是JDK自带的 Java 性能分析器,可以从命令行或在 GUI shell 中运行,从而可以轻松使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码,其可以从JAVA_HOME/bin/这个目录下找到。使用 Jconsole 监测死锁示例如下:


(1)Jstack

JDK自带的命令行工具,可以查看某个Java进程内的线程堆栈信息,主要用于线程Dump分析。


(1)JPS

jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况及其id。


6、责任链(CoR)模式

目的:请求的发送者与请求的处理者解耦,便于动态的重新组织链和分配责任

角色:抽象处理者、具体处理者、客户端。

UML:


    传统责任链(CoR)模式的缺点在于:具体处理角色存在着共同的实现责任链结构的行为行为,即责任链的建立和指派包含在实现角色的类中,并没有抽象出来,这直接导致责任链的指派不够灵活。因此,改进的CoR模式为:使用AOP理念将责任链结构的实现用切面抽象出来,使得各个对象只关注自身必须实现的功能性需求,准确地分离出责任链模式中不同角色的共同行为,例如,


改进后责任链(CoR)模式的应用是比较广泛的,包括 Java Web Filter(链式调用),Struts2 Interceptor(Action代理)和SpringMVC等。

7、单例模式

    单例模式核心在于为整个系统提供一个唯一的实例,为整个系统提供一个全局访问点。单例模式从实现上可以分为饿汉式单例懒汉式单例两种,前者天生就是线程安全的,后者则需要考虑线程安全性,常见的线程安全的懒汉式单例的实现有内部类式和双重检查式两种。下面给出单例模式几种常见的形式:

(1) 饿汉式单例


(1) 懒汉式单例


(1) 线程安全的懒汉式单例 —— 内部类方式


内部类方式线程安全懒汉式单例的内在原理在于:虚拟机会保证一个类的类构造器<clinit>()在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的类构造器<clinit>(),其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。特别需要注意的是,在这种情形下,其他线程虽然会被阻塞,但如果执行<clinit>()方法的那条线程退出后,其他线程在唤醒之后不会再次进入/执行<clinit>()方法,因为在同一个类加载器下,一个类型只会被初始化一次。

(4) 线程安全的懒汉式单例——双重检查方式


8、类的生命周期及其初始化时机

类的生命周期主要包括加载、链接、初始化、使用和卸载五个阶段,如下图所示:


(1) 遇到new、getstatic、putstatic或invokestatic这四条字节码指令时注意,newarray指令触发的只是数组类型本身的初始化,而不会导致其相关类型的初始化,比如,new String[]只会直接触发String[]类的初始化,也就是触发对类[Ljava.lang.String的初始化,而直接不会触发String类的初始化时,如果类没有进行过初始化,则需要先对其进行初始化。生成这四条指令的最常见的Java代码场景是:

使用new关键字实例化对象的时候;读取或设置一个类的静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候;调用一个类的静态方法的时候。

(2) 对类进行反射调用时:使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

(3) 初始化子类时当初始化一个类时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

(4) 虚拟机启动时:当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

(5) 当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。

9、类加载过程中各阶段的作用

9.1加载(Loading)

1)通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取,可以从其他渠道,譬如:网络、动态生成、数据库等);

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3)在内存中(对于HotSpot虚拟而言就是方法区)生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;

9.2链接(Linking)

(1)验证:验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

(2)准备(Preparation):准备阶段是正式为类变量(static 成员变量)分配内存并设置类变量初始值(零值)的阶段,这些变量所使用的内存都将在方法区中进行分配。

(3)解析(Resolution):解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

9.3初始化

    初始化阶段是执行类构造器<clinit>()方法的过程。虚拟机会保证一个类的类构造器<clinit>()在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的类构造器<clinit>(),其他线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。特别需要注意的是,在这种情形下,其他线程虽然会被阻塞,但如果执行<clinit>()方法的那条线程退出后,其他线程在唤醒之后不会再次进入/执行<clinit>()方法,因为在同一个类加载器下,一个类型只会被初始化一次。

10、对象的创建过程

Java中,创建一个对象常常需要经历如下几个过程:父类的类构造器<clinit>() -> 子类的类构造器<clinit>() -> 父类的实例构造器(成员变量和实例代码块,父类的构造函数) -> 子类的实例构造器(成员变量和实例代码块,子类的构造函数)。其中,类构造器<clinit>()由静态变量和静态语句块组成,而类的实例构造器<init>()类的实例变量/语句块以及其构造函数组成

11、双亲委派模型

双亲委派模型很好地解决了类加载器的统一加载问题:越基础的类由越上层的加载器进行加载,进而保证Java类型体系中最基础的行为,防止应用程序变得混乱。比如,java.lang.Object 类总是由启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类型(是否是同一类型由类加载器与类本身共同决定)。

(1)BootStrap:引导类加载器:加载都是最基础的文JRE/lib/rt.jar

(2)ExtClassLoader:引导类加载器:加载都是最基础的文件JRE/lib/ext/*.jar

(3)AppClassLoaderClassPath指定的所有jar或目录。

12、异常机制

Java体系中异常的组织分类如下图所示,所有异常类型的根类为 Throwable,具体包括两大类:Error 与 Exception。其中,Error是指程序无法处理的错误,表示运行应用程序中较严重问题;Exception是指程序本身可以处理的错误,具体可分为运行时异常(派生于 RuntimeException 的异常)和其他异常。

此外,从异常是否必须需要被处理的角度来看,异常又可分为不受检查异常和受检查异常两种情况:

1不受检查异常:派生于 Error 或 RuntimeException 的所有异常

2)受检查异常:除去不受检查异常的所有异常。


finally子句,在对应的try子句执行的前提下,finally 子句总会被执行。并且,finally子句 总是在诸如return、break、throw和continue等控制转移语句之前执行。




13、六大设计原则

(1)单一职责原则:高内聚,一个类只做它该做的事情;

(2)接口隔离原则:接口小而专,避免大而全;

(3)依赖倒置原则:依赖抽象而非实现,面向接口编程;

(4)里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能;

(5)开闭原则:Open for Extension, Closed for Modification,例如AOP,代理模式,适配器模式就是其经典应用;

(6)迪米特法则:高内聚,低耦合;

14、代理模式

    根据代理类的创建时机和创建方式的不同,我们可以将代理模式分为静态代理和动态代理两种形式,其中,在程序运行前就已经存在的编译好的代理类是为静态代理,在程序运行期间根据需要动态的创建代理类及其实例来完成具体的功能是为动态代理。其中,代理对象的作用如下:

(1) 代理对象存在的价值主要用于拦截对真实业务对象的访问

(2) 代理对象应该具有和目标对象(真实业务对象)相同的方法,即实现共同的接口或继承于同一个类;

(3) 代理对象应该是目标对象的增强,否则我们就没有必要使用代理了。


    JDK 动态代理是动态代理模式的经典实现,主要包括三个角色对象:Subject (接口)、被代理的类以及InvocationHandler接口(一般持有被代理对象),例如:

(1)实现 InvocationHandler 接口


(2)Proxy.newProxyInstance


 但是,JDK动态代理只能完成对接口的代理,而不能完成对类的代理,关键原因为:Java只允许单继承。具体地,代理对象proxySubject的类型为“com.sun.proxy.$Proxy0”,这恰好印证了proxySubject对象是一个代理对象。除此之外,我们还发现代理对象proxySubject所对应的类继承自java.lang.reflect.Proxy类,这也正是JDK动态代理机制无法实现对class的动态代理的原因。

15、迭代器模式

迭代器模式是与集合共生共死。一般来说,我们实现一个容器,就需要同时提供这个容器的迭代器,使用迭代器的好处:封装容器内部的实现细节,对于不同的集合,可以提供统一的遍历方式,简化客户端的访问和获取容器内数据。


    特别需要注意的是,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的 —— 遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性,这被称为多态迭代。  

    在 Java Collection FrameWork中,提供的具体迭代器角色是定义在容器角色中的内部类,这样便保护了容器的封装。但是,同时容器也提供了遍历算法接口,并且你可以扩展自己的迭代器。大家考虑一个问题,为什么一定要去实现 Iterable 这个接口呢? 为什么不直接实现 Iterator接口呢?

    看一下 JDK 中的集合类,比如 List一族或者Set一族,都是实现了 Iterable 接口,但并不直接实现 Iterator 接口。仔细想一下这么做是有道理的:因为 Iterator接口的核心方法 next() 或者 hasNext() 是依赖于迭代器的当前迭代位置的。 Collection 直接实现 Iterator 接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么 next() 方法的结果会变成不可预知。除非再为 Iterator接口 添加一个 reset() 方法,用来重置当前迭代位置。但即使这样,Collection 也只能同时存在一个当前迭代位置(不能同时多次迭代同一个序列:必须要等到当前次迭代完成并reset后,才能再一次从头迭代)。 而选择实现 Iterable 接口则不然,每次调用都会返回一个从头开始计数的迭代器(Iterator),因此,多个迭代器间是互不干扰的。

16、适配器模式

    适配器模式将一个类的接口转换成客户期望的另一个接口,让原本不兼容的接口可以合作无间。也就是说,适配器模式用于实现新、老接口之间的转换与适配,其魅力在于:不改变原有接口,却还能使用新接口的功能。


适配器模式主要包含以下四个角色,其内涵分别为:

1)Target: 客户所期待的接口;

2)Adaptee: Adapter 所包装的对象,即被适配的类(适配者);

3)Adapter: 一个用于包装不兼容接口的对象的包装类,通过包装一个需要适配的对象,把原接口转换成目标接口;

4)Client:客户端;

适配器模式的三个特点:

适配器对象实现原有接口

适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象);

对适配器原有接口方法的调用被委托给新接口的实例的特定方法。


1、模板方法模式

    模板方法模式是一种基于继承的代码复用技术,是一种类行为型模式,其核心在于:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


18、策略模式

    策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,核心思想是:面向接口编程。   

    策略模式的经典应用包括Spring的PlatfromTransactionManager,JDK 排序策略 (不同的Comparator)等,其优点包括:

1)算法可以自由切换,避免使用多重条件判断;

2)扩展性良好。

    策略模式与模板方法的区别:

    对于策略模式而言,一个“策略”是一个整体的(完整的)算法,算法是可以被整体替换的;而模板方法只能被替换其中的特定点,算法流程是固定不可变的。在思想和意图上看,模板方法更加强调:

定义一条线(算法流程),线上的多个点是可以变化的(具体实现在子类中完成),线上的多个点一定是会被执行的,并且一定是按照特定流程被执行的。

②算法流程是唯一的入口,对于点的访问是受限的。

19、Java 自动装箱、拆箱机制

Java为每种基本数据类型都提供了对应的包装器类型。所谓自动装箱机制就是自动将基本数据类型转换为包装器类型,而自动拆箱机制就是自动将包装器类型转换为基本数据类型。在JDK中,装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的(xxx代表对应的基本数据类型)。但是,

1)Integer、Short、Byte、Character、Long 这几个类的valueOf方法的实现是类似的,共享[-128,127];

2)Double、Float的valueOf方法的实现是类似的,无限不可列举,不共享;

3)Boolean的valueOf方法的实现不同于以上的整型和浮点型,只有两个值,有限可列举,共享;

    什么时候装箱/拆箱?

    至于什么时候装箱,什么时候拆箱主要取决于:在当前场景下,你需要的是引用类型还是原生类型。(例如,使用equals方法时传进来原生类型的值);若需要的是原生类型,但传进来的值是引用类型,则自动拆箱(例如,使用运算符进行运算时,操作数是包装类型)。

20、内部类

    内部类指的是在一个类的内部所定义的类,类名不需要和源文件名相同。Java中,内部类是一个编译时的概念,一旦编译成功,内部类和外部类就会成为两个完全不同的类,共有四种类型:

(1)成员内部类:成员内部类是外围类的一个成员,是依附于外围类的,所以,只有先创建了外围类对象才能够创建内部类对象。也正是由于这个原因,成员内部类也不能含有 static 的变量和方法;

(2)静态内部类:静态内部类,就是修饰为static的内部类,该内部类对象不依赖于外部类对象,就是说我们可以直接创建内部类对象,但其只可以直接访问外部类的所有静态成员和静态方法;

(3)局部内部类:局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效;

(4)匿名内部类:定义匿名内部类的前提是,内部类必须要继承一个类或者实现接口,格式为 new 父类或者接口(){定义子类的内容(如函数等)}。也就是说,匿名内部类最终提供给我们的是一个匿名子类的对象

20.1内部类的作用

1)间接实现多重继承,例如:


2)内部类还可以很好的实现隐藏(一般非内部类,是不允许有private与protected权限的),但内部类可以。 

21、equals, hashCode, ==

(1)== 用于判断两个对象是否为同一个对象或者两基本类型的值是否相等;

(2)equals 用于判断两个对象内容是否相同;

(3)hashCode是一个对象的消息摘要函数,一种压缩映射,其一般与equals()方法同时重写;若不重写hashCode方法,默认使用Object类的hashCode方法,该方法是一个本地方法, Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数。

21.1 equals与hashCode的区别

1)一般来讲,equals 这个方法是给用户调用的,而 hashcode 方法一般用户不会去调用;

2)当一个对象类型作为集合对象的元素时,那么这个对象应该拥有自己的equals()和hashCode()设计,而且要遵守前面所说的几个原则。

21.2 HashMap中使用可变对象作为Key带来的问题

HashMap用Key的哈希值来存储和查找键值对,如果HashMap Key的哈希值在存储键值对后发生改变,那么Map可能再也查找不到这个Entry了。也就是说,在HashMap中可变对象作为Key会造成数据丢失。因此,

1)在HashMap中尽量使用不可变对象作为Key,比如,使用String、Integer等不可变类型用作Key是非常明智的或者使用自己定义的不可变类。

2)如果可变对象在HashMap中被用作键,那就要小心在改变对象状态的时候,不要改变它的哈希值了,例如,可以只根据对象的标识属性生成HashCode。


21.3 重新equals但不重写HashCode会出现的问题

    在使用Set时,若向其加入两个相同(equals返回为true)的对象,由于hashCode函数没有进行重写,那么这两个对象的hashCode值必然不同,它们很有可能被分散到不同的桶中,容易造成重复对象

的存在。

22、什么是不可变对象

一个不可变对象应该满足以下几个条件:

(1)基本类型变量的值不可变;

(2)引用类型变量不能指向其他对象;

(3)引用类型所指向的对象的状态不可变;

(4)除了构造函数之外,不应该有其它任何函数(至少是任何public函数)修改任何成员变量;

(5)任何使成员变量获得新值的函数都应该将新的值保存在新的对象中,而保持原来的对象不被修改。

23、Java的序列化/反序列化机制

    使用Serializable序列化/反序列化。将实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象,序列化可以弥补不同操作系统之间的差异。其中,需要注意以下几点:

(1)需要序列化的对象必须实现Serializable接口;

(2)只有非静态字段和非transient字段进行序列化,与字段的可见性无关;

(3)序列化/反序列化的实质上操纵的是一个对象图;


 此外,Java中常用到的序列化方法还有 XML、JSON 等,此不赘述。

24、Path及ClassPath环境变量  

1)Path系统用来指定可执行文件的完整路径。当在CMD中执行命令时,如果执行的可执行文件不在当前目录下,那么系统就会依次搜索PATH中设置的路径。如果在PATH中设置了JDK的安装目录(如在PATH中添加如下的路径——D:\ProgramFiles\Java\jdk1.8.0\bin;D:\ProgramFiles\Java\jdk1.8.0\jre\bin;),那么就可以在CMD中直接使用java、javac等命令,而不必在CMD中切换到JDK的安装目录下运行该命令。

2)ClassPath是指定程序中所使用的类文件所在的位置。ClassPath环境变量中点(“.”)的含义是:在当前路径下搜索Java类。如果编译器按照CLASSPATH指定的路径找不到所需要的类,则会提示“*类找不到”这样的错误。

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

JAVA重要知识点梳理(一) 的相关文章

  • 在 Java 中捕获(捕获)窗口中的鼠标光标

    我正在寻找一种方法 在鼠标进入窗口后捕获或捕获该窗口中的鼠标 就像鼠标被捕获在虚拟机窗口中一样 直到用户按 CTRL ALT DEL 或以其他方式释放鼠标 我如何在 Java 中实现这一点 全屏显示不是一个选择 EDIT 这里有一些 SSC
  • Java Swing BoxLayout 忽略 AlignmentX

    在下面的代码中 通过调用setAlignmentX with Component LEFT ALIGNMENT我希望在居中的滑块上获得左对齐的标签 由于某种原因 标签也居中 似乎与传递给 setAlignmentX 的值无关 我必须向 se
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • JAXB 继承冲突 - 重新注释子类

    目前我的项目中有这样的环境 public abstract class Foo private List
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 为什么 java.util.Arraylist#clear 按照 OpenJDK 中的方式实现?

    http grepcode com file repository grepcode com java root jdk openjdk 6 b14 java util ArrayList java 473 http grepcode co
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • 使用Tesseract-OCR识别图片中的文字并生成双层PDF

    识别图片中的文字并不是很困难 如果自己训练一个文字识别的深度学习程序去识别也是可以 xff0c 但是太费劲 Tesseract OCR是一个开源的文字识别引擎 xff0c 并且支持包括中文在内的多国语言 只要将语言配置上去 xff0c 就可
  • iptables(三)iptables命令详解

    一 语法规则 iptables t table COMMAND chain CONDITION j ACTION t table 是指 39 操作的表 39 filter nat mangle或raw 39 默认使用filter 39 CO
  • 单调栈lllll

    单调栈 xff0c 就是一个栈 xff0c 不过栈内元素保证单调性 即 xff0c 栈内元素要么从小到大 xff0c 要么从大到小 而单调栈维护的就是一个数前 后第一个大于 小于他的数 例题 xff1a P5788 模板 单调栈 例题就是一
  • cmake(六)Cmake添加工程子目录

    重点 xff1a 39 cmake3 39 和 39 make 39 命令 39 输出 39 的 39 深刻解读 39 备注 xff1a 当前阶段暂时不使用 39 IDE 39 工具 先 39 熟悉各指令 39 一 ADD SUBDIREC
  • nginx(二十七)长连接和短连接

    一 长连接和短连接 概念 1 39 HTTP 39 的长连接和短连接 39 本质 39 上是 39 TCP 39 长连接和短连接 2 在 39 HTTP 1 0 39 中默认使用 39 短 39 连接 解读 xff1a 客户端和服务器 39
  • nginx(七十四)nginx与跨域细节探究

    一 nginx配置跨域 知识铺垫 强调 xff1a 跨域是 39 浏览器 39 行为 39 不是 39 服务器行为 43 43 43 43 43 43 43 43 43 43 43 43 43 43 34 跨域的两种解决手段 34 43 4
  • HTTP1.1(一)HTTP协议

    一 HTTP协议定义 RFC7230定义 说明 xff1a 关注 39 红色关键字 39 无状态 解读 xff1a 连续的 39 两个 39 请求 后续的请求 39 不能依赖 39 前一个请求 各个请求是 39 相互独立 39 基于请求 相
  • nginx(七十五)nginx与Vary响应头细节探讨

    一 Vary nginx与Vary有关联的地方 nginx源码分析处理Vary响应头的逻辑 CORS和缓存 gzip vary 1 gzip vary on 如果设置为 39 开启 39 2 服务器 39 返回数据 39 时会在头部带上 3
  • JDK1.8之Lambada表达式一

    一 lambada表达式简介 我们知道对于Java变量可以赋给其一个值 而如果想将 34 一块代码 一个完整的方法 34 赋给一个Java变量 如下所示 xff0c 怎么做呢 xff1f 你可能认为 就是下面的方式来实现 很显然 xff0c
  • Oracle(三)

    一 概述 1 DML xff08 data manipulation language 数据操作语言 xff09 insert update delete 2 DDL data definition language 数据定义语言 crea
  • 项目中权限控制系统的设计

    RBAC 权限 xff1a 权利 能做的 和限制 不能做的 xff0c 在权限范围内做好自己的事情 xff0c 不该看的不看 机密 xff0c 不该做的不做 xff01 最开始真正有权限的概念是在Linux上关于文件和目录的权限 xff0c
  • 每天一个Linux命令之(read)

    一 概述 read命令特点 xff1a 1 接收 39 标准输入 键盘 39 的输入 或其它 39 文件 描述符 39 的输入 2 得到输入后 然后将数据 39 保存 39 一个 39 变量 39 中 核心点 xff1a 39 数据源 39
  • LInux shell之(for in 用法总结)

    一 语法 for 变量名 in 列表 do 程序段 command done 注意1 xff1a 是变量名 而不是 变量 xff01 注意2 xff1a 列表 可以做文章 xff01 二 应用 第一类 xff1a 数字性循环 gt seq
  • 一次性将所有变成 long long

    include lt bits stdc 43 43 h gt using namespace std const int N 61 100000 43 100 define int long long define fir i a b f
  • Linux基础命令(二十一)Linux中的磁盘管理(终)

    一 逻辑卷管理器 Logical Volume Manager 需求引入 xff1a 最初规划主机的时候 xff0c 只给了 home 100G的 xff0c 但是随着业务量的增大 xff0c 导致用户的增多 xff0c 这个文件系统不够
  • 【机器学习】DBSCAN聚类算法(含Python实现)

    文章目录 一 算法介绍二 例子三 Python实现3 1 例13 2 算法参数详解3 3 鸢尾花数据集 一 算法介绍 DBSCAN xff08 Density Based Spatial Clustering of Applications
  • Zookeeper深度解析(概念、原理机制、应用场景)

    1 Zookeeper是什么 xff1f 分布 开源的应用程序协调服务 它是集群的管理者 监视着集群中各个节点的状态 xff0c 根据节点的反馈进行下一步合理操作 主要解决分布式应用经常遇到的数据管理问题 如 xff1a 统一命名服务 状态
  • 计算机操作系统知识梳理

    1 进程和线程以及它们的区别 xff08 1 xff09 进程是对 运行时程序的封装 是系统进行资源 调度和分配的 基本单位 实现操作系统 的 并发 xff08 2 xff09 线程是进程的 子任务 是CPU调度和分派的基本单位 用于保证程
  • 数据库知识梳理

    概述 xff1a 对数据库索引 数据库锁 数据库事务 MySql优化等基础知识梳理 1 数据库范式 xff08 1 xff09 第一范式 xff1a 列不可分 eg 联系人 xff08 姓名 xff0c 性别 xff0c 电话 xff09
  • JAVA重要知识点梳理(一)

    1 Struts2和SpringMVC的区别 xff08 1 xff09 设计理念 xff1a 前者为 有状态的 Action 均为多例 xff0c Action对象属性字段 承载请求 响应 xff0c 后者一般为无状态的 Controll