Java基础与八股
文章平均质量分 71
主要存储一些容易产生误导点的java基础知识与八股文
Artisan_w
这个作者很懒,什么都没留下…
展开
-
ThreadLocal与FastThreadLocal
FastThreadLocal 真的一定比 ThreadLocal 快吗?答案是不一定的,只有使用FastThreadLocalThread 类型的线程才会更快,如果是普通线程反而会更慢。FastThreadLocal 会浪费很大的空间吗?虽然 FastThreadLocal 采用的空间换时间的思路,但是在 FastThreadLocal 设计之初就认为不会存在特别多的 FastThreadLocal 对象,而且在数据中没有使用的元素只是存放了同一个缺省对象的引用,并不会占用太多内存空间。原创 2024-04-11 16:50:43 · 1192 阅读 · 0 评论 -
拒绝服务攻击(Dos)与Tomcat的解决方法
拒绝服务攻击(Denial of Service,DoS)是一种网络攻击,旨在使目标系统无法提供正常的服务,使其无法响应合法用户的请求。这种攻击通过消耗目标系统的资源,例如带宽、处理能力或存储空间,来实现其目的。拒绝服务攻击的主要目标是瘫痪目标系统,使其对合法用户不可用。拒绝服务攻击可以采用多种方式实施,其中一种常见的方法是通过向目标系统发送大量无效的请求,使其资源耗尽。另一种常见的方法是利用系统的漏洞或弱点来使其崩溃或无法正常工作。原创 2024-04-02 16:39:17 · 1218 阅读 · 0 评论 -
getInputStream流只能读取一次问题
InputStream默认不实现reset的相关方法,而ServletInputStream也没有重写reset的相关方法,这样就无法重复读取流,这就是我们从request对象中获取的输入流就只能读取一次的原因。需要读取request的输入流 ,因为 ServletRequest中getReader()和getInputStream()只能调用一次。正常普通接口请求,request.getParameter()可以获取,能多次读取。如果我们的接口是用@RequestBody来接受数据,那么我们在拦截器中。原创 2024-04-02 16:36:10 · 533 阅读 · 0 评论 -
Java的SPI机制与实例
SPI是一种JDK内置的服务提供发现的机制,能够启动框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql。Driver接口。Java机制的核心思想就是将装配的控制权转移到Java之外,核心思想是解耦。原创 2024-03-15 16:54:16 · 393 阅读 · 0 评论 -
CMS垃圾回收器
CMS GC的官方名称为“Mostly Concurrenct Mark and Sweep Garbage Collector”(最大-并发-标记-清除-垃圾收集器)。作用范围: 老年代算法: 并发标记清除算法。启用参数:-XX:+UseConMarkSweepGC默认回收线程数:(处理器核心数量 + 3)/4Java9之后使用CMS垃圾收集器后,默认年轻代就为ParNew收集器,并且不可更改,同时JDK9之后被标记为不推荐使用,JDK14就被删除了。原创 2024-02-26 15:43:07 · 599 阅读 · 0 评论 -
ThreadLocal作用实例
ThreadLocal表示线程的“局部变量”,它确保每个线程的ThreadLocal变量都是各自独立的,它提供了一种方法来创建只能被当前线程访问的变量。7、探测式清理,其实这也是非常耗时。输出结果如下,正常情况为true,如果两个线程分别修改了数据,那么可能是false,当然,由于还处在中间过程,还会导致异常情况,那么该如何解决这个问题呢,就需要ThreadLocal了。在代码中每个线程都会 对f进行操作,会导致f这个对象发生变化,由于f这个对象是共享变量,各个线程之间互相影响,由此产生了三种情况。原创 2024-01-31 10:56:04 · 336 阅读 · 0 评论 -
sychnorized积累
锁对象不能为空,因为锁的信息都保存在对象头里作用域不宜过大,影响程序执行的速度,控制范围过大,编写代码也容易出错避免死锁在能选择的情况下,既不要用Lock也不要用synchronized关键字,用java.util.concurrent包中的各种各样的类,如果不用该包下的类,在满足业务的情况下,可以使用synchronized关键,因为代码量少,避免出错。如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁,那锁计数器就会累加,变成2,并且随着重入的次数,会一直累加。原创 2024-01-23 17:30:15 · 384 阅读 · 0 评论 -
Java 数据结构集合
队列的头部是队列中时间最长的元素。为了降低这部分的开销,在 Java8 中,当链表中的元素达到了 8 个时,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。计算 key 的 hash 值,根据 hash 值找到对应数组下标: hash & (length-1)判断数组该位置处的元素是否刚好就是我们要找的,如果不是,走第三步判断该元素类型是否是 TreeNode,如果是,用红黑树的方法取数据,如果不是,走第四步遍历链表,直到找到相等(==或equals)的 key。原创 2024-01-23 15:51:54 · 1239 阅读 · 0 评论 -
JMM内存模型
Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。对于 Java 来说,你可以把 JMM 看作是 Java 定义的并发编程相关的一组规范,除了抽象了线程和主内存之间的关系之外,其还规定了从 Java 源代码到 CPU 可执行指令的这个转化过程要遵守哪些和并发相关的原则和规范,其主要目的是为了简化多线程编程,增强程序可移植性的。原创 2024-01-05 15:41:25 · 972 阅读 · 0 评论 -
Java构件技术
Tomcat 是一个主要用于运行 Servlet 和 JSP 的 Servlet 容器,而 WebLogic 是一个全功能的 Java EE 应用服务器,支持 EJB 和 Servlet 构件,以及其他 Java EE 构件,提供更多的企业级功能和性能调优选项。RESTful Web Services 是一种构建 Web 服务的架构风格,它使用标准的 HTTP 方法(如 GET、POST、PUT 和 DELETE)来进行通信,并遵循一组规范,使得服务具有可伸缩性、可扩展性和松耦合性。原创 2023-12-11 17:11:54 · 453 阅读 · 0 评论 -
JSON数据的基本用法
JSONJSON实际上是JavaScript的一个子集。在JSON中,一共就这么几种数据类型:number:和JavaScript的number完全一致;boolean:就是JavaScript的true或false;string:就是JavaScript的string;null:就是JavaScript的null;array:就是JavaScript的Array表示方式——[];object:就是JavaScript的{ … }表示方式。JSON还定死了字符集必须是UTF-8,表示多语言就原创 2022-04-16 10:46:07 · 1048 阅读 · 0 评论 -
JVM调优
JVM调优不是常规手段,性能问题一般第一选择是优化程序,最后的选择才是进行JVM调优。JVM的自动内存管理本来就是为了将开发人员从内存管理的泥潭里拉出来。即使不得不进行JVM调优,也绝对不能拍脑门就去调整参数,一定要全面监控,详细分析性能数据。原创 2024-01-04 19:14:05 · 1003 阅读 · 0 评论 -
JVM钩子
在Java应用程序中,可以通过注册关闭钩子(Shutdown Hook)函数来实现在JVM关闭时执行特定的代码。关闭钩子是一种用于在JVM关闭时执行清理任务的机制,它允许开发者在JVM关闭之前执行一些必要的清理工作,如关闭资源、保存状态等。JVM 关闭可以分为三种正常关闭:当最后一个非守护线程结束或调用 System.exit() 或通过其他特定平台的特定方式关闭强制关闭:通过调用 Runtime.halt() 或在操作系统中直接 kill JVM进程。原创 2023-12-26 17:26:58 · 961 阅读 · 0 评论 -
Java的CAS原理与应用
CAS是一种无锁算法,该算法关键依赖两个值——期望值(旧值)和新值,底层CPU利用原子操作判断内存原值与期望值是否相等,如果相等就给内存地址赋新值,否则不做任何操作。使用CAS进行无锁编程的步骤大致如下:1、获得字段的期望值(oldValue)。2、计算出需要替换的新值(newValue)。3、通过CAS将新值(newValue)放在字段的内存地址上,如果CAS失败就重复第1步到第2步,一直到CAS成功,这种重复俗称CAS自旋。原创 2023-12-25 16:31:15 · 1164 阅读 · 0 评论 -
java的atomic原子引用
在Java中,java.util.concurrent.atomic 包提供了一些原子类,主要用于在不需要显式加锁的情况下执行原子操作。这些原子类提供了原子性的复合操作,可用于并发编程,避免了显式使用锁时可能出现的竞态条件。它们在需要在没有显式同步的情况下执行原子操作的场景中特别有用。5、在 AtomicReference 的基础上添加了一个时间戳,用于解决ABA问题。提供对通用对象引用的原子操作。提供对长整数的原子操作。提供对布尔值的原子操作。提供对整数的原子操作。原创 2023-12-25 15:51:47 · 451 阅读 · 0 评论 -
Java序列化与反序列化
Java序列化是将对象转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输。序列化是指将Java对象转换为字节序列的过程,而反序列化则是将字节序列转换为Java对象的过程。Java对象序列化是将实现了Serializable接口的对象转换成一个字节序列,能够通过网络传输、文件存储等方式传输 ,传输过程中却不必担心数据在不同机器、不同环境下发生改变,也不必关心字节的顺序或其他任何细节,并能够在以后将这个字节序列完全恢复为原来的对象(恢复这一过程称之为反序列化)。原创 2023-12-25 10:28:19 · 756 阅读 · 0 评论 -
Java的抽象类(abstract)
定义抽象类的时候需要用到关键字 abstract,放在 class 关键字前,就像下面这样。抽象类命名要使用 Abstract 或 Base 开头定义抽象类的时候需要用到关键字 abstract,放在 class 关键字前,就像下面这样。抽象类命名要使用 Abstract 或 Base 开头。原创 2023-12-22 16:11:22 · 587 阅读 · 0 评论 -
Java的ThreadLocal
ThreadLocal 是 Java 中一个非常有用的类,它允许你创建线程局部变量。线程局部变量是指每个线程都有自己独立的变量副本,互不干扰。ThreadLocal 主要用于解决多线程环境下共享数据的线程安全性问题。原创 2023-12-11 17:12:43 · 364 阅读 · 0 评论 -
Java队列--LinkedBlockingQueue
无参定义,默认构造方法,队列容量为Integer.MAX_VALUE指定队列容量的构造方法基于集合构建队列,默认容量为Integer.MAX_VALUEtry {int n = 0;++n;可以看到,第一第三种方式都是设置大小为Integer.MAX_VALUE,这容易导致堆栈溢出,因此一般建议使用自定义大小的方式来定义。原创 2023-12-11 17:10:06 · 746 阅读 · 0 评论 -
final的安全发布
两个关键字“发布”“安全”所谓发布通俗一点的理解就是创建一个对象,使这个对象能被当前范围之外的代码所使用比如Object o = new Object();然后接下来使用对象o但是对于普通变量的创建,之前分析过,大致分为三个步骤:1、分配内存空间2、将o指向分配的内存空间3、调用构造函数来初始化对象这三个步骤不是原子的,如果执行到第二步,还没有进行初始化,此时对象已经不是null了,如果被其他代码访问,这将收获一个错误的结果。原创 2023-12-11 17:09:19 · 840 阅读 · 0 评论 -
Java堵塞队列--LinkedBlockingQueue
无参定义,默认构造方法,队列容量为Integer.MAX_VALUE指定队列容量的构造方法基于集合构建队列,默认容量为Integer.MAX_VALUEtry {int n = 0;++n;可以看到,第一第三种方式都是设置大小为Integer.MAX_VALUE,这容易导致堆栈溢出,因此一般建议使用自定义大小的方式来定义。原创 2023-10-31 19:55:21 · 394 阅读 · 0 评论 -
频繁GC问题原因总结
此外,合理的内存管理和代码优化也是减少频繁垃圾回收的关键。使用不合理的垃圾回收策略:Java提供了不同的垃圾回收器,每个回收器适用于不同的场景。内存分配过多:如果应用程序频繁地分配新的对象而不释放旧的对象,堆内存将快速用满,触发频繁的垃圾回收。堆内存不足:如果为Java应用程序分配的堆内存不足以容纳应用程序所需的数据,垃圾回收将更频繁地运行,以尝试释放未使用的内存。使用了大量的弱引用或软引用:虽然弱引用和软引用对于某些应用程序非常有用,但过度使用它们可能导致垃圾回收更频繁,因为这些引用的对象更容易被回收。原创 2023-10-13 11:11:50 · 1283 阅读 · 0 评论 -
Java--日志管理
设置日志级别,决定什么日志信息应该被输出、什么日志信息应该被忽略。原创 2023-09-05 19:47:03 · 1154 阅读 · 0 评论 -
Java--ProcessBuilder中的字节流
ProcessBuilder是建立一个新进程,并且能够获取环境的信息,这些信息会通过字节流的方式输入获取,接下来讨论获取字节流要进行的操作。原创 2023-08-29 14:25:01 · 230 阅读 · 0 评论 -
Java IO操作——BufferedReader
System.in本身表示的是InputStream(字节流),现在要求接收的是一个字符流,需要将字节流转为字符流才可以,InputStreamReader。之前的StringBuffer,缓冲区中的内容可以更改,可以提高效率。BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中。如果想接收任意长度的数据,而且避免乱码的产生,就可以使用BufferedReader。Java IO操作——BufferedReader(缓冲区读取内容,避免中文乱码)原创 2023-08-29 14:24:20 · 1119 阅读 · 0 评论 -
Java流数据
处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及DataInputStream和DataOutputStream,使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。他们都属于过滤流。原创 2023-08-29 14:22:50 · 111 阅读 · 0 评论 -
Java注解原理与应用
注解的本质就是一个继承了 Annotation 接口的接口。一个注解准确意义上来说,只不过是一种特殊的注释而已,如果没有解析它的代码,它可能连注释都不如。而解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。典型的就是注解 @Override,一旦编译器检测到某个方法被修饰了 @Override 注解,编译器就会检查当前方法的方法签名是否真正重写了父类的某个方法,也就是比较父类中是否具有一个同样的方法签名。原创 2023-08-29 14:21:02 · 114 阅读 · 0 评论 -
Java 线程池
Java 线程池是一种多线程处理技术,它可以在程序中预先创建一定数量的线程,将任务提交到线程池中,线程池会自动调度线程执行任务。通过使用线程池,可以避免反复创建和销毁线程的开销,提高程序性能,同时也能够避免线程资源的浪费和过度使用。原创 2023-08-29 14:20:34 · 100 阅读 · 0 评论 -
Java进程的两种启动方式
jvm的关闭方式有三种:正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(发送SIGINT,SIGTERM信号等)强制关闭:通过调用Runtime.halt方法或者是在操作系统中直接kill(发送SIGKILL信号)掉JVM进程异常关闭:运行中遇到RuntimeException异常等。原创 2023-08-29 14:17:54 · 1054 阅读 · 0 评论 -
Java路径问题
开发环境时,user.dir 指向的是项目的根目录windows,将项目部署到tomcat下,user.dir指向的路径是当前用户的桌面linux环境下,将项目部署到tomcat中,user.dir指向的路径为tomcat的bin。原创 2023-08-29 14:17:06 · 132 阅读 · 0 评论 -
Java--static加载顺序与final
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。2、执行子类的静态代码块和静态变量初始化。3、执行父类的实例变量初始化4、执行父类的构造函数5、执行子类的实例变量初始化6、执行子类的构造函数。原创 2023-08-29 14:16:24 · 774 阅读 · 0 评论 -
Java--定位线程冲高问题
1.使用top 定位到占用CPU高的进程PID。2、获取线程信息,并找到占用CPU高的线程。3、将需要的线程ID转换为16进制格式。4、打印线程的堆栈信息。原创 2023-08-25 10:10:50 · 87 阅读 · 0 评论 -
Java--abstract class 与 interface的区别
interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也 不能声明实例变量。而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;原创 2023-08-25 10:10:09 · 167 阅读 · 0 评论 -
Java核心类--JavaBean
getPropertyName():举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。setPropertyName():举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。setPropertyName():举例来说,如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。一个 JavaBean 对象的属性可以是可读写,或只读,或只写。原创 2023-08-25 10:09:14 · 141 阅读 · 0 评论 -
Java的锁大全
乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。原创 2023-08-25 10:07:54 · 290 阅读 · 0 评论 -
Ant的安装使用
首先需要从官网下载apache ant,地址为: http://ant.apache.org/bindownload.cgi。原创 2023-08-25 09:58:45 · 127 阅读 · 0 评论 -
JSON数据详解
JSON实际上是JavaScript的一个子集。在JSON中,一共就这么几种数据类型:number:和JavaScript的number完全一致;boolean:就是JavaScript的true或false;string:就是JavaScript的string;null:就是JavaScript的null;array:就是JavaScript的Array表示方式——[];object:就是JavaScript的{ … }表示方式。原创 2023-08-25 09:57:49 · 358 阅读 · 0 评论 -
Java的类加载器
每个编写的".java"拓展名类文件都存储着需要执行的程序逻辑,这些".java"文件经过Java编译器编译成拓展名为".class"的文件,“.class"文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class"文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载,这里我们需要了解一下类加载的过程,如下:既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢?原创 2023-08-25 09:52:11 · 266 阅读 · 0 评论 -
不解压的方式直接更新jar包内部的内容
如果线上直接更新一个class,可以不用解压,直接利用jar命令直接更新jar报的资源和内容原创 2023-08-25 09:47:57 · 1817 阅读 · 0 评论 -
Java--常用jar命令
通过这种方式,可以把配置文件放在/etc/config/目录中,java代码扫描classpath下的配置文件时,就会以-Xbootclasspath/p:指定的目录做为优先查找路径。以下的内容会介绍如何执行jar包,Main.class作为可执行的入口类,先给出Main.java的源码,如下所示。-cp是-classpath的缩写形式,如果jar包还依赖了其他第三方jar包,列出来即可,如下所示。执行后,我们解压jar包,可以看到META-INF/MANIFEST.MF文件多出了一行。原创 2023-08-25 09:44:36 · 1788 阅读 · 0 评论