
Java
文章平均质量分 85
-=Leessang=-
努力怀挺!!!
展开
-
sleep以及如何正确终止线程
如果线程被中断,即中断状态为true,则 interrupted() 方法会返回true,并且会将中断状态重置为false。如果线程没有被中断,即中断状态为false,则 interrupted() 方法会返回false。比如在调用 interrupt() 的时候,其实就是想尽快地结束线程,所以,继续的 sleep 是没有意义的,应该尽快结束。这个方法原本是设计用来停止线程并抛出线程死亡的异常,但是实际上它是不安全的,因为它是直接终止线程解放锁,这很难正确地抛出线程死亡的异常进行处理。原创 2023-08-15 16:56:39 · 830 阅读 · 1 评论 -
Java知识补充
Java笔记复习原创 2023-03-03 16:47:02 · 655 阅读 · 0 评论 -
int 转 String 的方法效率对比
在写 leetcode 的题目时,需要将 int 型的 val 转换为 String 型。自己图方便,直接使用的path += root.val; 。提交后执行用时 11ms,但对比答案后发现答案使用的是path +=String.valueOf(root.val);,把自己的代码仅将path += root.val;改成path +=String.valueOf(root.val);后发现执行用时变为了 2ms !!!击败了 95% 的用户。总结加分析一下,int 类型转 String 类型有以下三种原创 2020-08-19 10:24:47 · 902 阅读 · 0 评论 -
ArrayList 迭代器 产生 ConcurrentModificationException 异常
之前学习 fail-fast 时了解了 ArrayList 里的一些方法和成员变量:fail-fast(快速失败)机制hasNext 方法补充 ArrayList 的内部类private class Itr implements Iterator<E> 的 hasNext 方法:产生异常在下面一段代码中会报出异常 ConcurrentModificationException原因:集合每次调用 add 方法时,modCount 都会自增(4)在获取迭代器的时候,会把 mod原创 2020-08-17 17:29:02 · 362 阅读 · 0 评论 -
fail-fast(快速失败)机制
笔记摘自公众号愚公要移山 !!!简介在系统设计中,快速失效系统一种可以立即报告任何可能表明故障的情况的系统。快速失效系统通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。这种设计通常会在操作中的多个点检查系统的状态,因此可以及早检测到任何故障。快速失败模块的职责是检测错误,然后让系统的下一个最高级别处理错误。—— 维基百科fail-fast 机制是 Java 集合(Collection) 中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。演示原创 2020-08-13 11:20:38 · 1632 阅读 · 0 评论 -
Arrays.asList() 使用指南
笔记总结自公众号 JavaGuide,感谢Guide哥!简介Arrays.asList() 可以将一个数组转化为一个 List 集合 String[] arr = {"aaa","bbb"}; List<String> list = Arrays.asList(arr); //上面两行等价于下面一条语句 List<String> list1 = Arrays.asList("aaa", "bbb");JDK 源码: public st原创 2020-08-10 17:38:59 · 381 阅读 · 0 评论 -
Java 8 & 9 & 10 & 11 新特性
Java 81. Lambda 表达式Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。实质可以理解为函数式接口(只有一个抽象方法的接口)的实例2. 函数式接口只包含一个抽象方法的接口,成为函数式接口可以通过 Lambda 表达式创建该接口的对象可以在接口上使用 @FunctionalInterface注解,检查是否是一个函数式接原创 2020-07-31 10:55:35 · 785 阅读 · 0 评论 -
Queue中 的方法的区别
offer,add一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。poll,removeremove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此..原创 2020-07-19 14:42:32 · 211 阅读 · 0 评论 -
Java多线程之 Java内存模型
说到 Java 内存模型,很多人马上想到的是 JVM 里面的方法区、堆等,这里所讲的内容更准确来说是 Java 线程内存模型。1.现代计算机多核并发缓存架构计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中。处理器的运算速度相比物理内存的读写速度要快得多因此为了提高计算机的运算速度,现在的计算机系统为处理器添加了一层读写速度尽量接近处理器的高速缓存2.Java内存模型——JMMJava 内存模型与 CPU 缓存模型类似原创 2020-07-14 15:45:31 · 244 阅读 · 0 评论 -
Java多线程之 ThreadLocal
1. ThreadLocal 是什么ThreadLocal 叫做线程变量,意思是ThreadLocal 中填充的变量属于当前线程,该变量对其他线程而言是隔离的。这些变量与普通变量不同,每个线程都可以通过其 get 或 set方法来访问自己的独立初始化的变量副本。ThreadLocal 为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联原创 2020-07-12 09:29:31 · 636 阅读 · 1 评论 -
HashMap 中的死循环
笔记摘录自疫苗:JAVA HASHMAP的死循环1.存在的问题单线程的程序使用 HashMap 没有问题,但是由于程序性能的需求,程序由单线程变为多线程,这时使用 HashMap 就可能会产生问题。程序经常占了100%的CPU,查看堆栈,你会发现程序都 Hang 在了 HashMap.get() 这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。Java的文档说HashMap是非线程安全的,应该用ConcurrentHashMap。2. HashMa原创 2020-07-06 10:14:29 · 4705 阅读 · 2 评论 -
JDBC 部分源码中的细节
最近看了《码农翻身》这本书,感觉很有意思,里面讲到了 JDBC 里面的部分细节,以下是总结:先看几个重要的类(以下代码仅为示例代码,没有考虑例外情况、结程安全等因素)DriverManager 的实现:包含一个 ArrayList,里面是通过 register 函数注册(add)进来的 DrivergetConnection 函数会遍历各个注册过的 Driver 去尝试获得 Connectionpublic class DriverManager{ private static Li原创 2020-06-25 12:00:29 · 189 阅读 · 0 评论 -
Java笔记(六)从 JVM 角度分析多态
1. 多态多态是面向对象语言的重要特性,允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定类内部之间的多态:Java 的方法重载类的内部可以具有相同的方法名,但参数列表唯一,返回类型和修饰符可以不同类之间的多态:Java 的方法重写两种方式:继承和接口(与继承类似,只是父类是接口)2. JVM 内存程序运行时,底层虚拟机如何区分方法名称相同的函数的?Java 文件想要运行,需要通过 Java 编译器译成 .class 文件,然后类装载器将 .class原创 2020-06-16 20:27:57 · 371 阅读 · 0 评论 -
Java笔记(五)forName()与classloade & StringBuilder与StringBuffer
forName()与classloade类加载机制jvm加载类大致5个阶段:加载:Java类运行的时候会产生一个class字节码文件,加载的过程就是去寻找这个class文件链接:把class文件加载到Java虚拟机初始化:在虚拟机中根据class文件进行初始化使用卸载对于class.forName和classloader来说针对的就是第一个加载的过程区别class.forName除了将该类的.class 文件加载到 jvm 中之外,还会对类进行解释,执行类中的静态代码块,初始原创 2020-06-11 19:30:28 · 251 阅读 · 0 评论 -
Java笔记(四)JavaWeb四大域对象 & 转发与重定向
四大域对象ServletContext 当web应用被加进容器时,创建代表整个web应用的ServletContext对象,当服务器关闭,或web应用被移除时,ServletContext对象跟着被销毁。 由于一个web应用中的所有Servlet共享同一个ServletContext对象:因此Servlet对象之间可以通过ServletContext来是实现通讯。ServletContext对象通常也被称为context域对象。ServletRequest 在service方法调用前原创 2020-05-25 19:45:02 · 559 阅读 · 1 评论 -
软工实验:常见的代码坏味道以及重构举例
一、常见的代码坏味道及其重构方法1.神秘命名(Mysterious Name)整洁代码最重要的一环就是好的名字,好的名字要让人见名知意,所以我们要深思熟虑如何给函数、模块、变量和类命名,使它们能清晰地表明自己的功能和用法。因此,改名可能是最常用的重构手法,包括改变函数声明(用于给函数改名)、变量改名、字段 改名等。2. 重复的代码(Duplicated Code)重复的代码的三种类型以及重构方法:于同一个类:提炼成新方法进行调用位于 不同的子类:提炼成方法放进父类位于完全不相干的类:提炼出原创 2020-05-24 15:46:51 · 3643 阅读 · 0 评论 -
JDBC中的SQL注入
狭义的 SQL注入称之为狭义,是指我在深入了解前自己对SQL注入的理解,也就是在练习JDBC操作数据库时接触到的SQL注入。1.1 JDBC先介绍一下JDBC的概念:JDBC是sun公司(已被Oracle收购)制定一系列接口标准,由不同数据库厂商(Oracle、MySQL等)实现接口方法并封装成驱动文件,供开发人员操作数据库。也就是说,开发人员可采用统一的代码来操作不同的数据库,而无需关注驱动文件的内部实现。通俗的理解就是JDBC是规范、是接口,不同的数据库厂商要据此编写各自的操作实现。1.2 S原创 2020-05-22 14:40:12 · 1033 阅读 · 0 评论 -
Java笔记(三)三种移位运算
<<表示左移移,不分正负数,低位补0; 注:以下数据类型默认为byte-8位左移时不管正负,低位补0正数:r = 20 << 2 20的二进制补码:0001 0100 向左移动两位后:0101 0000 结果:r = 80负数:r = -20 << 2 -20 的二进制原码 :1001 0100 -20 的二进制反码 :1110 1011 -20 的二进制补码 :1110 1100 左移两位后的补码:1011 0000转载 2020-05-21 14:48:47 · 376 阅读 · 0 评论 -
Java笔记(二) 代码块 & 类初始化顺序
首先先看几个定义及结论:静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。构造函数的作用是用于给对象进行初始化。一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数则会被视为不原创 2020-05-19 16:56:50 · 350 阅读 · 0 评论 -
Java笔记(一) contains()方法、finally中的语句、length与length()
contains方法先看一段代码//创建集合对象Collection c = new ArrayList();//向集合中添加对象String s1 = new String("abc"); //s1 = 0x1111c.add(s1);String s2 = new String("def"); //s2 = 0x2222c.add(s2);//元素个数为2System.out.println("元素个数", c.size()) //2//创建新的String对象String x原创 2020-05-18 15:54:12 · 381 阅读 · 0 评论