Java
福贵儿
Stay Hungry, Stay Foolish
展开
-
Java常见异常总结
1. java.lang.NullPointerException(空指针异常) 调用了未经初始化的对象或者是不存在的对象经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)。2. java.lang.ClassNotFoundExceptio.转载 2020-06-16 23:32:57 · 356 阅读 · 0 评论 -
说说线程安全问题
线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。在 Java 多线程编程当中,提供了多种实现 Java 线程安全的方式:最简单的方式,使用Synchronization关键字 使用java.util.concurrent.atomic包中的原子类,例如AtomicInteger 使用java.util.concur...原创 2019-06-01 19:27:50 · 2184 阅读 · 0 评论 -
synchronized 与 lock 的区别
synchronized 和 lock 的用法区别 synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。 lock(显示锁):需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生...转载 2019-06-01 19:31:09 · 1569 阅读 · 0 评论 -
CAS 乐观锁
CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS...转载 2019-06-01 19:32:03 · 1617 阅读 · 0 评论 -
ABA 问题
CAS 会导致“ABA问题”。CAS 算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 ...转载 2019-06-01 19:32:56 · 2068 阅读 · 0 评论 -
ArrayList 与 LinkedList 区别
因为 Array 是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array 获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。 相对于 ArrayList,LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入...转载 2019-05-29 19:21:24 · 1505 阅读 · 0 评论 -
HashMap 和 ConcurrentHashMap 的区别,哪个是线程安全的?
放入 HashMap 的元素是 key-value 对。 HashMap 是数据结构中所说的散列结构。 要将元素放入到 HashMap 中,那么 key 的类型必须要实现 hashcode 方法,默认这个方法是根据对象的地址来计算的,接着还必须覆盖对象的 equals() 方法。 ConcurrentHashMap 对整个桶数组进行了分段,而 HashMap 则没有 ConcurrentH...原创 2019-05-29 19:25:19 · 2445 阅读 · 0 评论 -
BeanFactory 和 ApplicationContext的区别
注:ApplicationContext会预先的将bean的定义加载和创建完成,如果注入不成功,会抛异常,BeanFacotry,等着调用getBean()方法的时候,才报异常。BeanFactory 可以理解为含有 bean 集合的工厂类。BeanFactory 包含了种 bean 的定义,以便在接收到客户端请求时将对应的 bean 实例化。 BeanFactory 还能在实例...原创 2019-06-08 22:02:49 · 1574 阅读 · 0 评论 -
聊聊同步/异步/阻塞/非阻塞(举栗子说明)
前言 这个几个名词,一开始接触的时候,很容易弄混。所以,总结一下。方便大家,方便自己。不正之处,请大家多多评论,共同探讨。正文同步/异步:关注的是消息通信机制阻塞/非阻塞:关注的是等待消息的状态举例就拿我们经常看到的例子吧,小明去烧水这个事情。1.同步阻塞 小明将水壶放在炉子上开始烧了,然后就在炉子旁边等着,等烧开了,再忙...原创 2019-06-20 17:07:14 · 1621 阅读 · 0 评论 -
equals 与 == 的区别
equals 与 == 的区别==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。 另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回 true。而equals()可以返回 true 或者 false 主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals...原创 2019-05-28 19:39:41 · 1561 阅读 · 0 评论 -
重载和重写的区别
温馨提示:返回值类型不同,是不能构成重载的,只有参数个数和类型不同。我最初学习这块的时候,就犯了这个错误。重载 Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。重写 Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,...原创 2019-05-28 13:31:52 · 1482 阅读 · 0 评论 -
JDBC编程的六个步骤
(1) 注册驱动 Class.forName("oracle.jdbc.OracleDriver"); (2) 连接数据库 String url = "jdbc:oracle:thin:@localhost:1521:xe"; //其中xe为sid String user = "XXX"; St...原创 2019-05-26 15:07:21 · 2656 阅读 · 0 评论 -
JVM、JRE、JDK三者的区别
JVM:就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。JRE – java runtime environment(JRE–>JVM)JRE是指java运...原创 2019-05-26 14:39:03 · 1445 阅读 · 0 评论 -
创建线程的常见方式以及相应的实现
继承 Thread 类创建线程类定义 Thread 类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 创建 Thread 子类的实例,即创建了线程对象。 调用线程对象的start()方法来启动该线程。通过 Runnable 接口创建线程类定义 Runnable 接口的实现类,并重写该接口的run...原创 2019-05-27 20:48:56 · 1475 阅读 · 0 评论 -
Java常见几种线程池
1.开篇笑话 线程池在面试中也是常问的,记得第一次面试的时候,面试官问我,请说一下有哪些常见的线程池,我就一本正经的回答到:C3P0,DBCP,巴拉巴拉,尴尬!(逃) 2.常见线程池 Java提供了四种线程池:newFixedThreadPool:创建固定大小的线程池。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结...原创 2019-05-27 20:56:22 · 1803 阅读 · 0 评论 -
浅谈类加载器
加载类的开放性 类加载器(ClassLoader)是 Java 语言的一项创新,也是 Java 流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在 Java 虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类。虚拟机规范并没有指明二进制字节流要从一个 Cla...原创 2019-05-30 22:51:16 · 1613 阅读 · 0 评论 -
浅谈双亲委派模型
双亲委派模型双亲委派模型过程某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。使用双亲委派模型的好处在于Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加...原创 2019-05-30 23:01:32 · 1555 阅读 · 0 评论 -
浅谈反射的用途及实现
反射的用途反射技术,应该是属于Java中的进阶技术,就我个人而言,平常写业务用到的不是很多,因为使用到的工具类,框架(Spring,MyBatis等)啥的,别人都给你封装好了,直接调用就好啦,但我们还是要了解和掌握,知其然,更要知其所以然。反射的应用举个栗子:Class c = Class.forName("com.yushuzi.test.User") ...原创 2019-05-28 13:18:10 · 1749 阅读 · 0 评论 -
final, finally, finalize 的区别
final用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.finallyfinally作为异常处理的一部分,只能用在try/catch语句快中,finally代码块中的语句一定会被执行,经常被用来释放资源,如IO流和数据库资源的释放。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可...原创 2019-05-28 13:22:40 · 1475 阅读 · 0 评论