
Java
文章平均质量分 60
xxx
奔跑的飞行兵
这个作者很懒,什么都没留下…
展开
-
java-库-String
存储一个字符,这样做的目的是为了节省内存,因为大量的长度较短的。类在内存中有不同的优化方式。具体来说,早期JDK版本的。内部的优化不影响任何已有代码,因为它的。仅包含ASCII字符,则每个。存储一个字符,否则,每两个。类型实际上就是两个字节的。对于不同版本的JDK,而较新的JDK版本的。原创 2023-08-22 16:23:12 · 56 阅读 · 0 评论 -
java-库-Object
equals()不相等,则hashCode()有可能相同(不同对象的哈希值可能冲突)。hashCode()不相同,则一定equals()不相等。equals()相等,则一定hashCode()相同。原创 2023-08-22 16:21:41 · 53 阅读 · 0 评论 -
java-库-Map
Map的key必须实现equals()方法和hashCode()方法,如果key被用于TreeMap,它必须实现Comparable。原创 2023-08-22 16:21:04 · 73 阅读 · 0 评论 -
java-库-BigDecimal
方法来比较,它根据两个值的大小分别返回负数、正数和。的值是否相等时,要特别注意,使用。,分别表示小于、大于和等于。的源码,可以发现,实际上一个。的值相等,还要求它们的。表示一个完整的整数,而。原创 2023-08-22 16:19:52 · 73 阅读 · 0 评论 -
java-库-BigInteger
【代码】java-库-BigInteger。原创 2023-08-22 16:19:13 · 109 阅读 · 0 评论 -
java-库-随机数
实际上有多种不同的底层实现,有的使用安全随机种子加上伪随机数算法来产生安全的随机数,有的使用真正的随机数生成器。的安全性是通过操作系统提供的安全的随机种子来生成随机数。这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”。无法指定种子,它使用RNG(random number generator)算法。原创 2023-08-22 16:17:13 · 96 阅读 · 0 评论 -
java-库-日志
Commons Logging的特色是,它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4j(Log4j是另一个流行的日志系统),如果没有找到Log4j,再使用JDK Logging。SLF4J类似于Commons Logging,也是一个日志接口,而Logback类似于Log4j,是一个日志的实现。Commons Logging,可以作为“日志接口”来使用。(1)默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来。原创 2023-08-21 08:28:19 · 62 阅读 · 0 评论 -
java-其他-Unsafe
在Java中创建的对象都处于堆内内存(heap)中,堆内内存是由JVM所管控的Java进程内存,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理堆内存。:与之相对的是堆外内存,存在于JVM管控之外的内存区域,Java中对堆外内存的操作,依赖于Unsafe提供的操作堆外内存的native方法。实现线程的阻塞和唤醒的,而LockSupport的park、unpark方法实际是调用Unsafe的park、unpark方式来实现。堆外内存的分配、拷贝、释放、给定地址值操作等方法。原创 2023-08-21 08:27:12 · 106 阅读 · 0 评论 -
java-其他-NIO
AIO:等待就绪事件是非阻塞的,实际读写过程也是异步的。是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。NIO:会一次获取多个就绪的读写事件,这个过程是阻塞的,然后读写也是同步的;BIO:执行某个读操作或写操作,会阻塞直到完成操作,所以为了同时进行多个读写操作需要创建多个线程。《不断升级,Java之BIO、NIO、AIO的演变》《Java 中 NIO 看这一篇就够了》阻塞:指等待IO事件发生的过程。原创 2023-08-21 08:26:31 · 49 阅读 · 0 评论 -
java-其他-jvm
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。原创 2023-08-21 08:24:27 · 78 阅读 · 0 评论 -
java-其他-junit5使用
cp 要包含 HelloTest.class,还要包含 Hello.class(因为HelloTest.class中有引用)。HelloTest.java 中引用了 Hello 和一些 junit 相关以依赖,要在 -cp 中指定。使用junit5实现类jar包(内部打包了所有junit相关依赖)来执行测试。目录下生成class文件。目录下生成class文件。把它放到工程同级目录下。原创 2023-08-21 08:23:43 · 76 阅读 · 0 评论 -
java-其他-java agent
Java agent是在JDK1.5引入的,是一种可以动态修改Java字节码的技术。java类编译之后形成字节码被JVM执行,JVM在执行这些字节码之前获取这些字节码信息,并且对这些字节码进行修改,来完成一些额外的功能,这种就是java agent技术。原创 2023-08-21 08:20:03 · 112 阅读 · 0 评论 -
java-工具-maven
这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。最全的maven的pom.xml文件详解:https://www.cnblogs.com/wkrbky/p/6357884.html。default(或build):部署项目(包含阶段:compile,test,package,install,deploy等)其实就是phase,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行。每个生命周期包含多个阶段。每个插件包含多个目标。原创 2023-08-21 08:16:53 · 59 阅读 · 0 评论 -
java-工具-jdb
JDB是java调试工具。查看jdwp的使用说明:java -agentlib:jdwp=help。原创 2023-08-21 08:16:20 · 360 阅读 · 0 评论 -
java-并发-AQS应用之Semaphore
本质:类似资源池,池中有n个资源,获取资源时如果不够则等待,释放资源时唤醒等待的线程原理:构造函数入参permits,表示资源个数。获取资源 acquire() 时,如果permits==0则等待,被唤醒后执行 permits = permits-1。释放资源 release() 时,执行 permits = permits + 1,唤醒其他线程。原创 2023-08-21 08:12:22 · 76 阅读 · 0 评论 -
java-并发-AQS应用之CyclicBarrier
本质:线程到达栅栏后等待,直到n个线程都到达,然后n个线程开始奔向下一个栅栏原理:使用ReentrantLock和Condition实现。原创 2023-08-21 08:11:46 · 62 阅读 · 0 评论 -
java-并发-AQS应用之CountDownLatch
本质:等待其他线程完成(有m个线程是做任务的,有n个线程在某个栅栏上等待这m个线程做完任务,当所有m个任务完成后,n个线程同时通过栅栏)原理:构造方法传入一个不小于0的整数,表示内部的state=n;countDown() 方法每次调用都会将 state 减 1,当 state 的值为 0 时唤醒所有阻塞在 await() 的线程;而 await() 是一个阻塞方法,当 state 减为 0 的时候,await 方法才会返回。CountDownLatch是一次性的,state值不能重置。原创 2023-08-19 18:46:55 · 107 阅读 · 0 评论 -
java-锁-自旋锁
原理:自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。原理:基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。原理:基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,直接前驱负责通知其结束自旋,减少缓存同步的开销。2、从自旋的条件来看,CLH是在前驱节点的属性上自旋,而MCS是在本地属性变量上自旋。适用:锁保护的临界区很小的情况。原创 2023-08-19 18:45:53 · 198 阅读 · 0 评论 -
java-锁-Lock
当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。(1)假设两个线程竞争同一个锁,如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,这将影响程序执行效率。当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。原创 2023-08-19 18:45:13 · 181 阅读 · 0 评论 -
java-锁-synchronized
的实现使用的是 monitorenter 和 monitorexit 指令,其中monitorenter指令指向同步代码块的开始位置,monitorexit指令则指明同步代码块的结束位置,当执行monitorenter指令时,当前线程将试图获取 objectref(即对象锁) 所对应的 monitor 的持有权,当 objectref 的 monitor 的进入计数器为 0,那线程可以成功取得 monitor,并将计数器值设置为 1,取锁成功。所以锁消除可以节省毫无意义的请求锁的时间。原创 2023-08-19 18:44:38 · 328 阅读 · 0 评论 -
java-锁-volatile
主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。可见性:保证共享变量对所有线程的可见性,当一个线程修改了共享变量的值,新值能立即同步到主内存,其它线程每次使用前立即从主内存刷新。A Happens-Before B,且 B Happens-Before C,那么A Happens-Before C。子线程start()后,子线程中能看到start()前的变量。原创 2023-08-19 18:43:33 · 112 阅读 · 0 评论 -
java-JDBC
幻读:没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了(因为本事务开始生成了查询快照,执行更新操作后就会重新生成一次查询快照,这时其他事务的更新就能够读到了)。脏读: 一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。SQL数据库对SQL语句相同,但只有参数不同的若干语句可以作为batch执行,即批量执行,这种操作有特别优化,速度远远快于循环执行每个SQL。原创 2023-08-19 18:41:21 · 64 阅读 · 0 评论 -
java-IO
下面的例子演示了如何编写一个int n;= -1) {// 为什么是继承 FilterInputStream,因为它已经帮我们实现了基本方法,并包含了内部 InputStreamsuper(in);if (n!if (n!原创 2023-08-19 18:40:45 · 47 阅读 · 0 评论 -
java-注解
1、由编译器使用的注解,这类注解不会被编译进入文件,它们在编译后就被编译器扔掉了。如、。2、由工具处理文件使用的注解,比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。3、在程序运行期能够读取的注解,它们在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。(1原创 2023-08-19 18:39:59 · 49 阅读 · 0 评论 -
java-正则表达式
(1)正则表达式默认使用贪婪匹配:任何一个规则,它总是尽可能多地向后匹配。如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个。记做一个分组,分组编号从 1 开始。仔细观察上述实际匹配结果,实际上它是完全合理的,因为。给定一个字符串表示的数字,判断该数字末尾。判断是否匹配成功,匹配成功后,才能调用。,而后再加上正则表达式,构成非捕获组。表示该括号只起包裹作用,不作为一组。的时候,我们传入的第二个参数可以使用。,实际上我们期望的结果是。尽量多匹配,我们就必须让。,而后才是正则表达式。原创 2023-08-19 18:39:10 · 42 阅读 · 0 评论 -
java-异常
表示严重的错误,程序对此一般无能为力。则是运行时的错误,它可以被捕获并处理。原创 2023-08-19 18:37:21 · 47 阅读 · 0 评论 -
java-序列化
毫无疑问,使用反射。(4)如果父类没有实现Serializable接口,但其子类实现了此接口,那么这个子类是可以序列化的,但是在反序列化的过程中会调用父类的无参构造函数,所以在其直接父类(注意是直接父类)中必须有一个无参的构造函数。(2)使用默认机制在序列化对象时,不仅会序列化当前对象,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。(2)因此,第一次写入对象后,修改对象,再写入,修改并不会生效,因为第二次写入的对象指向第一次写入的对象。原创 2023-08-18 08:22:03 · 58 阅读 · 0 评论 -
java-网络
【代码】java-网络。原创 2023-08-18 08:21:12 · 48 阅读 · 0 评论 -
java-日期与时间
(3)和旧的API相比,新API严格区分了时刻、本地日期、本地时间和带时区的日期时间,并且,对日期和时间进行运算更加方便。(5)最后,新API的类型几乎全部是不变类型(和String类似),可以放心使用不必担心被修改。(2)很难对日期和时间进行加减,计算两个日期相差多少天,计算某个月第一个星期一的日期等。(1)本地日期和时间通过now()获取到的总是以当前默认时区返回的,和旧API不同,(2)Duration 和 Period 的表示方法符合ISO 8601的格式,它以。相比,它提供了时区转换的功能。原创 2023-08-18 08:20:35 · 1532 阅读 · 1 评论 -
java-集合
Collection,它是除Map外所有其他集合类的根接口。原创 2023-08-18 08:19:03 · 53 阅读 · 1 评论 -
java-函数式
无状态(元素的处理不受前面元素的影响):unorded, filter, map, mapToInt, mapToLong, mapToDouble, flatMap, flatMapToInt, flatMapToLong, flatMapToDouble, peek。非短路(会处理完全部元素):forEach, forEachOrdered, toArray, reduce, collect, max, min, count。(这个注解不是必须的,只是在接口定义了多个抽象方法时报错)原创 2023-08-18 08:18:24 · 53 阅读 · 1 评论 -
java-泛型
/不兼容的类型: java.util.List<java.lang.Integer>无法转换为java.util.List<java.lang.Number>//泛型类型 是Number或其子类List<?这种使用的泛型定义称之为上界通配符(Upper Bounds Wildcards),即把泛型类型T的上界限定在Number了。//不兼容的类型: java.util.List<java.lang.Number>无法转换为java.util.List<java.lang.Integer>原创 2023-08-18 08:17:27 · 73 阅读 · 1 评论 -
java-反射
调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。(2)为了调用任意的构造方法,Java的反射API提供了Constructor对象,它包含一个构造方法的所有信息,可以创建一个实例。(1)JVM在执行Java程序的时候,并不是一次性把所有用到的class全部加载到内存,而是第一次需要用到class时才加载。是当前类定义的构造方法,和父类无关,因此不存在多态的问题。动态代理:JDK提供的动态创建接口对象的方式。实例,要判断一个向上转型是否成立,可以调用。原创 2023-08-18 08:16:51 · 51 阅读 · 1 评论 -
java-多线程
(3)线程的中断操作对于正在等待获取的锁对象的synchronized方法或者代码块并不起作用,也就是对于synchronized来说,如果一个线程在等待锁,那么结果只有两种,要么它获得这把锁继续执行,要么它就保存等待,即使调用中断线程的方法,也不会生效。在JVM中,所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。差不多,这是因为在x86的架构下,JVM回写主内存的速度非常快,但是,换成ARM的架构,就会有显著的延迟。运行中,等待另一个线程执行一个特定动作,但有超时时间,如。原创 2023-08-18 08:16:14 · 72 阅读 · 1 评论 -
java-断言
导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。(1)JVM默认关闭断言指令,即遇到。语句,必须给Java虚拟机传递。语句就自动忽略了,不执行。原创 2023-08-18 08:14:42 · 64 阅读 · 1 评论 -
java-基础知识
对于(1)而言,clone()方法来自于类MyObject2本身,因此其可见性为包p2及MyObject2的子类,虽然Test2是MyObject2的子类,但在Test2中不能访问基类MyObject2的protected方法clone(),因此编译不通过;(2)子类与基类不在同一包中:在子类中,子类实例可以访问从基类继承而来的protected成员,而不能访问基类实例的protected成员。.代表具体的要打包的class文件。多态:针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。原创 2023-08-18 08:13:54 · 77 阅读 · 1 评论 -
java单例模式
【代码】java单例模式。原创 2023-08-17 08:24:01 · 82 阅读 · 1 评论 -
java8到java17新特性
6、还可以在 Record 声明的类中定义静态属性、方法和示例方法。注意,不能在 Record 声明的类中定义示例字段,类也不能声明为抽象类等。5、类对象和属性被 final 关键字修饰,不能被继承,类的示例属性也都被 final 修饰,不能再被赋值使用。Record 类型允许在代码中使用紧凑的语法形式来声明类,而这些类能够作为不可变数据类型的封装持有者。封闭类,可以是封闭类和或者封闭接口,用来增强 Java 编程语言,防止其他类或接口扩展或实现它们。2、获取成员属性值的方法:name()、age()原创 2023-06-09 21:29:56 · 116 阅读 · 0 评论