Java
文章平均质量分 79
xiongyuqing
看见我请叫我学英语
展开
-
24.两两交换链表中的节点
一条链表,从头节点开始,以两个节点为单位的遍历,当遍历到链表末端,没有节点或者只有一个节点的时候返回当前节点此时返回的节点returnNode是前两个节点的下一个节点,设前两个节点是 swap1Node,swap2Node此时swap2Node 被换到前面去了,所以作为了新的头节点,将作为前两个的下一个节点返回。原创 2023-12-30 13:25:42 · 460 阅读 · 1 评论 -
206.反转链表
用三个节点分别保存前一个节点,当前节点,后一个节点提前存储 nextNode 可以简化代码因为遍历到最后一个元素时 curNode 会指向 null,而 nextNode 就无法获取了,如果写在最后,就会报错另一个角度:通过curNode获取nextNode更好,可以用curNode是否为空判断是否有nextNode通过nextNode获取nextNode还需要额外判断nextNode是否为空。原创 2023-12-30 00:33:11 · 450 阅读 · 0 评论 -
Spring基础IoC(控制反转)与DI(依赖注入)
Spring 是一个开源的轻量级的 Java 开发框架,可以帮助开发人员更高效的进行开发,主要优势在于简化开发和框架整合。Spring框架整合了很多模块,这些模块可以协助我们开发。例如Spring中的两大核心技术:IoC (Inversion of Control:控制反转) 和 AOP (Aspect-Oriented Programming : 面向切面编程),可以很方便的支持对数据库的访问,并集成第三方组件(例如调度,缓存等等),还支持单元测试。原创 2023-12-29 22:12:01 · 1010 阅读 · 0 评论 -
Java 类加载与字节码技术
什么时候需要自定义类加载器1)想加载非 classpath 随意路径中的类文件2)都是通过接口来使用实现,希望解耦时,常用在框架设计3)这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器继承 ClassLoader 父类要遵从双亲委派机制,重写 findClass 方法注意不是重写 loadClass 方法,否则不会走双亲委派机制读取类文件的字节码调用父类的 defineClass 方法来加载类。原创 2023-12-29 22:10:25 · 956 阅读 · 0 评论 -
Java虚拟机中的垃圾回收
如果一个对象被另一个对象引用,那么它的引用计数加一,如果那个对象不再引用它了,那么引用计数减一。当引用计数为 0 时,该对象就应该被垃圾回收了。但是下面这种互相引用的情况就无法回收了:两个对象的计数都为1,导致两个对象都无法被释放。原创 2023-12-29 22:08:23 · 1224 阅读 · 0 评论 -
707.设计链表
单链表的创建需要一个头节点,它不存储值但指向第一个元素,便于后续的增删改查操作的实现。没有注意双链表的特性,依然用单方向的遍历实现。双链表的实现,需要头,尾节点。原创 2023-12-29 22:06:01 · 383 阅读 · 0 评论 -
Java 虚拟机中的内存结构
Java Virtual Machine Stacks (Java 虚拟机栈)每个线程运行时所需要的内存,称为虚拟机栈每个栈由多个栈帧(Frame)组成,对应着每次方法调用所占用的内存每个线程只有一个活动栈帧,对应当前正在执行的那个方法栈:线程运行需要的内存空间栈中存储着多个栈帧,每个栈帧对应着一个调用过的方法,栈顶为活动栈帧,是当前正在运行的函数;当一个方法运行完成,这个方法对应的栈帧就会出栈问题辨析垃圾回收是否涉及栈内存?不需要,每次方法结束时,栈内存就被回收掉了,不需要等待垃圾回收。原创 2023-12-22 21:27:18 · 1033 阅读 · 0 评论 -
Java AQS 阻塞式锁和相关同步器工具的框架
Java 并发工具包。原创 2023-12-21 22:25:46 · 1068 阅读 · 0 评论 -
Java 并发编程中的线程池
在『任务调度线程池』功能加入之前,可以使用 java.util.Timer 来实现定时功能,Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。如果阻塞队列也满了,就会交给救急线程运行,当救急线程运行完了就会结束,但是核心线程会一直执行,不会结束(即使没有任务)。自己创建一个单线程串行执行任务,如果任务执行失败而终止那么没有任何补救措施,而线程池还会新建一个线程,保证池的正常工作。原创 2023-12-21 22:20:32 · 852 阅读 · 0 评论 -
Java 并发编程中的不可变设计
SimpleDateFormat 不是线程安全的,可以用 synchronized 加锁解决问题,但带来的是性能上的损失如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改啊!不可变对象,实际是另一种避免竞争的方式。原创 2023-12-21 22:18:24 · 406 阅读 · 0 评论 -
Java 并发编程中的无锁实现
compareAndSet,它的简称就是 CAS (也有 Compare And Swap 的说法),它必须是原子操作。获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。它可以用来修饰成员变量和静态成员变量,避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。即一个线程对 volatile 变量的修改,对另一个线程可见。原创 2023-12-21 22:17:08 · 903 阅读 · 0 评论 -
Java 内存模型 与 volatile原理
JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面。原创 2023-12-21 22:14:37 · 886 阅读 · 0 评论 -
Java 线程管理中的锁
obj.wait()让进入 object 监视器的线程到 waitSet 等待在 object 上正在 waitSet 等待的线程中挑一个唤醒让 object 上正在 waitSet 等待的线程全部唤醒以上方法的调用必须是先获得锁(成为 Owner以后);log.debug("执行....");// 让线程在obj上一直等待下去log.debug("其它代码....");log.debug("执行....");原创 2023-12-21 22:08:37 · 1108 阅读 · 0 评论 -
Java 线程安全问题
如果多个线程同时对共享变量读写,其中一个线程还没来得及将更改后的共享变量更新到主内存中,就切换到另一个线程从主内存中读该共享变量,此时读取的共享变量的值就是错的。而且切换回原来的线程后,之前被另一个线程更新后的共享变量的值也会被当前切换回来的线程所继续写的值给覆盖。这里的共享变量 counter 的自增,自检并不是原子操作。是由多个步骤组成的,如果一个线程执行到其中一个步骤就停止了,另一个线程并不会接着上一个线程继续,而是重新开始算法(因为线程之间没有设置同步),此时获取到的counter值就不是最新的。原创 2023-12-15 11:32:25 · 891 阅读 · 0 评论 -
Java 线程运行方法和原理
栈与栈帧:Java 虚拟机栈会为每个启动的线程分配一块栈内存,其中存储着栈帧(Frame)原创 2023-12-14 17:04:33 · 1135 阅读 · 0 评论 -
Java 线程创建的方法和原理
优点:任务类只是实现接口,可以继续继承其他类,实现其他接口,扩展性强。创建Runnable接口的匿名内部类对象,重写其中的 run 方法。其中 Runnable接口只有一个方法,被注解为。类的 run 方法中会判断是否存在。,所以可以用 lambda表达式简化。方法重写,就等于覆盖了下面的方法。变量,如果存在则优先执行。原创 2023-12-14 11:55:51 · 420 阅读 · 0 评论 -
Java Static
仅创建一个空指针,而不赋值。当有人获取对象时,判断类变量是否为null再决定是否创建。(懒汉单例设计模式)原创 2023-10-16 21:24:57 · 129 阅读 · 0 评论 -
Java 内部类:成员内部类 静态内部类 匿名内部类
匿名内部类本质是一个子类(实现类),可以更方便的创建一个子类对象。特殊创建的局部内部类;匿名是指创建的这个内部类没有名字;局部内部类定义在方法中,代码块中,构造器等执行体中的类。类中的一个普通成员,类似普通的成员变量和成员方法。内部类如何访问其他类中的数据成员?内部类的对象如何创建?通常作为参数传递给方法。原创 2023-12-14 10:42:49 · 357 阅读 · 0 评论