Java基础
文章平均质量分 60
See_NUMB
这个作者很懒,什么都没留下…
展开
-
Dockerfile ADD failed : No Source files were specified
学习使用 idea 中的插件 docker 实现远程自动部署时,遇到这个问题弄了好久。。Dockerfile ADD failed : No Source files were specified意思是添加源文件失败。在 idea Run/Debug Configurations里配置Dockerfile 路径的时候,idea 自动给我指定了Context foder路径,导致出现错误。应该自己指定 jar 包的路径,如下图。Dockerfile 文件FROM java:8VOLUME /tm原创 2021-09-15 21:29:01 · 5816 阅读 · 0 评论 -
final、finally、finalize区别
final、finally、finalize区别finalfinal 关键字可以对类、方法、变量进行修饰。对类进行修饰,表示该类不能继承;对方法进行修饰,表示该方法不能被重写;对变量进行修饰,表示该变量不可变(引用变量不一样)。final修饰的类,可以防止API 使用者更改基础功能,比如 String 类是不可变的,如果String不用final修饰,可能就会出现意料之外的错误,这样在某些程度上,可以保证平台的安全。使用final修饰参数和变量,让数据不可变,避免后序因为改变数值而造成程序错误,有原创 2021-09-03 21:47:15 · 225 阅读 · 0 评论 -
java 中对 Exception 和 Error的理解
java 中 Exception 和 Error在java中 Exception 和 Error 都是继承 Throwable ,说明他们是可以被捕获和抛出的。Exception 是程序运行时可以预料的情况,并且应该捕获,做出对应处理,例如NullPointerException。Error 可能是不常出现的情况,发生Erro 可能导致程序不能正常运行,所以不便于也不建议捕获Error,例如OutOfMemoryError。Exception 又分为可检查和不可检查的异常。不可检查异常,又叫原创 2021-09-03 15:16:03 · 355 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayListCopyOnWriteArrayList类是 JUC 下面的一个并发 List ,适用于对读要求高的场景,因为CopyOnWriteArrayList类读取数据的时候是不加锁的,写入不会阻塞读取操作,只有写与写之间会阻塞,读的性能得到了大幅提升。public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Seria原创 2021-09-01 20:21:36 · 97 阅读 · 0 评论 -
JDBC破坏双亲委派机制--源码解析
JDBC破坏双亲委派机制java有自己的一套 资源管理服务JNDI 等等,是由启动类加载器加载的,说明类是放在rt.jar包中。java提供Driver接口,厂商根据自己的需求实现功能。双亲委派机制:当前类加载器收到类加载的请求后,先不自己尝试加载类,而是先将请求委派给父类加载器,调用父类的 loadClass() 方法,这是一个递归的过程(因此,所有的类加载请求,都会先被传送到启动类加载器),只有当父类加载器加载失败时,当前类加载器才会尝试自己去自己负责的区域加载。所以判断是否破坏双亲委派机制的一个原创 2021-09-01 19:08:00 · 493 阅读 · 1 评论 -
在JDBC中发现SPI服务
什么是SPI?SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。在Dubbo、JDBC中都使用到了SPI机制,java就是通过 ServiceLoader.load() 方法获取到实现类的实例的,达到调用外部服务接口的目的。简单看看在JDBC是如何实现SPI服务的。JDBC连接准备 String url = "jdbc:mysql.原创 2021-08-31 16:48:15 · 133 阅读 · 2 评论 -
Java集合(List、Set、Map)总结一览图
个人主页:www.seeyj.top原创 2021-08-30 14:49:24 · 200 阅读 · 1 评论 -
HashMap头插法多线程形成环,导致死循环
过程在 jdk 1.7 及以前HashMap使用头插法,多线程的情况下容易形成环。假设在下标为1处有一个长度为2的链表,如果再次插入一个节点,就需要resize()扩容。此时两个线程A和B执行put()操作,A线程先执行,执行完transfer () 中的Entry<K,V> next = e.next;被挂起,此时e指针指向5,next指向7,如图所示。此时线程B执行,将数组扩大两倍,链表仍散列在下标为1处,由于使用了头插法,节点位置将会交换,如图所示。这时候线程A又执行,原创 2021-08-29 19:13:41 · 1801 阅读 · 0 评论 -
位图-在20亿个随机整数中找出某个数m是否存在其中?
在20亿个随机整数中找出某个数m是否存在其中。基于这个问题,我们可以使用位图来解答。大致思路是将20亿个无序数映射到二进制数组(位图)中去,再去查看数组中是否存在m数,即某位是否为1。所以最重要的是如何映射?实现在Java中,int占4字节,1字节 = 8位(1 byte = 8 bit)如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为原创 2021-08-29 18:53:16 · 311 阅读 · 0 评论 -
Lambda表达式(如何使用Lambda进行排序)
Lambda表达式简介Lambda表达式也被称为箭头函数、匿名函数、闭包。箭头为操作符。Lambda表达式体现的是轻量级函数编程思想。Model Code as Data,编码及数据尽可能轻量级的将代码封装为数据。通常的解决方式是通过接口和实现类来实现,这样存在语法冗余、this关键字、变量捕获的问题。Lambda表达式是JDK8的一个新特性,可以代替匿名内部类写出优雅的Java代码。函数式接口的理解被@FunctionalInterface注解的接口都是函数式接口。函数式接口只包含一..原创 2021-04-04 11:03:48 · 3022 阅读 · 2 评论 -
PriorityQueue(优先队列)的用法
和普通队列相同的是,PriorityQueue也是满足FIFO(先进先出)的原则,不然就不是queuePriorityQueue提供了更加高级的功能,就是自动将队列里的元素进行排序例子,我们学习中,各科都有一些作业,一些科目先布置了作业,我们就可以先完成,但有时候作业总是堆在了最后才想起要做作业了。我们可以盲目的去做,但可能聪明的人会按照一定的顺序去完成他们,比如越早交的,我们就先完成。虽然感觉有点不恰当,但是可以吧说明队列中的元素可以默认自然排序,也可以通过传入的compartor进行.原创 2021-03-24 21:25:34 · 1201 阅读 · 1 评论 -
线程与进程的区别
假设每个小孙悟空都要与100个踢人打仗public class Monkey { private String name; public Monkey(String name){ this.name = name; } public void fight(){ for (int i = 0; i < 100; i++) { System.out.println(name+"正在与第"+i+"战斗"); .原创 2020-09-15 09:34:16 · 194 阅读 · 0 评论 -
BigDecimal的加减乘除及应用
首先为什么会使用BigDecimal,而不使用Double或者float进行计算,因为Double和Float的计算结果会出现误差(底层为二进制进行计算),而BigDecimal底层不是使用二进制进行计算的。所以进行比较大的数之间的计算时,需要精确计算,可以使用BigDecimal。BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。1. BigDecimal的加减乘除 BigDecimal .原创 2020-06-15 09:16:13 · 719 阅读 · 0 评论