java基础
文章平均质量分 70
静看星辰变
我要成为像凯撒一样的男人
展开
-
【多、单】生产者消费者模式——Java
实现代码下面是多生产者多消费者的实现,import java.util.ArrayDeque;import java.util.Deque;/**生产者、消费者。单生产者、消费者,多生产者消费者。要注意以下三点: * 如果队列为空,则消费者阻塞 * 如果队列满了,则生产者阻塞 * 任何时候,只能有一个生产者或者消费者访问队列 * @author zkw * @date 2021/1/4 10:07 */public class ProducerAn原创 2021-01-04 11:54:49 · 882 阅读 · 0 评论 -
Hashmap底层实现 JDK8
hashmap的底层实现(jdk1.8)数据结构底层真正存储数据的是一个table数组,实际的数据结构是一个散列表,用链表来处理冲突,散列表相关知识可查阅数据结构教材(盗个图)。Node<K,V>结构如下:Put(K,V)方法分析 public V put(K key, V value) { return putVal(has...原创 2019-03-31 10:12:47 · 273 阅读 · 0 评论 -
Java中的Arrays.sort(int[])
Arrays.sort(int[])Arrays.sort(int[])使用的是quicksort+merge sort。使用quicksort:当数组长度比较小(right-left<286),或者数组有序的程度不是很高(见下面代码),使用quicksort。 使用mergesort:当数组长度较长且有序程度较高时,使用。static void sort(int[] a, int left, int right, int[] work, int原创 2020-12-27 17:15:15 · 1162 阅读 · 0 评论 -
【转载】有状态的bean和无状态的bean的区别
有状态对象(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。无状态对象(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能.转载 2020-07-11 21:53:23 · 1075 阅读 · 0 评论 -
Java 泛型小结
目录泛型的定义泛型分类限定泛型类型变量泛型的意义泛型的原理泛型中的约束和局限性泛型的定义泛型,即“参数化类型”。就是将程序需要的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。一些常用的泛型类型变量:E:元素(Element),多用于java集合框架K:关键字(Key)N:数字(Number)T:类型(Type)V:值(Value)泛型分类泛型分为“泛型类”、“泛型接口转载 2020-07-07 16:54:12 · 161 阅读 · 0 评论 -
Java中的异常(checked异常和unchecked异常)
Java的异常层次结构要想明白Java中checked Exception和unchecked Exception的区别,我们首先来看一下Java的异常层次结构。 这是一个简化的Java异常层次结构示意图,需要注意的是所有的类都是从Throwable继承而来,下一层则分为两个结构,Error和Exception。其中Error类层次描述了Java运行时系统的内部错误和资源耗尽错误,这种错误除了简单的报告给用户,并尽力阻止程序安全终止之外,一般也米有别的解决办法了。最常用的五种Runti...转载 2020-07-05 21:18:27 · 4399 阅读 · 0 评论 -
单例模式三种实现
单例模式的三种实现方式,分别是:饿汉式、懒汉式和静态内部类实现。饿汉式即在一开始就将单例对象初始化,这样后面用户调用获取对象的方法时直接返回创建好的对象引用就行。优点是当用户第一次获取单例对象时可以节省时间,缺点是若单例对象创建后迟迟不被获取就会占用内存空间。/** 饿汉式 * @author zkw * @date 2020/7/5 8:30 */public class Singleton1 { // 不注释的话可以通过反射获取和修改obj属性 private原创 2020-07-05 10:37:37 · 1027 阅读 · 0 评论 -
【Java基础】代理模式、静态代理、动态代理、JDK与CGLIB代理区别、在spring AOP中的应用
目录代理模式静态代理和动态代理静态代理动态代理JDK动态代理CGLIB动态代理动态代理在Spring AOP中的应用场景本人运行环境为JDK8,CGLIB版本为3.1。在某些情况下,客户不想或者不能直接引用另一个对象,这时候可以创建一个目标对象的代理对象,在客户端和目标对象之间起到中介的作用。“代理”即为目标对象提供一种代理以控制对这个对象的访问。代理模式如果你学过设计模式,你应该会知道“代理模式”,即在不用修改原类代码的前提下对原类的一些方法进行功能增强,比如s原创 2020-05-07 17:46:57 · 340 阅读 · 0 评论 -
instanceof关键字(Java SE8官方文档)
Java SE8语言规范的介绍根据《Java语言规范 基于Java SE8中文》一书,instanceof是一个类型比较操作符,表达式为: 关系表达式(RelationalExpression) instanceof 可具化的引用类型(Reifiable ReferenceType)其中左边的关系表达式为null或引用类型,右边的可...原创 2020-04-22 14:27:20 · 421 阅读 · 0 评论 -
Java反射的原理及反射创建类实例的三种方式
目录什么是反射反射原理应用场景基本用法反射机制的相关类Class类Field类Method类Constructor类示例什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射原理...转载 2020-04-21 20:03:19 · 13884 阅读 · 0 评论 -
【Java NIO】网络IO模型与Java中的NIO之间的联系
线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。NIO执行通道的read方法不用阻塞,所以可以用此方法去检测通道中是否有另一端写入的数据而不会阻塞(应该是select实现的),这样就可以做到通道里面有数据才去读,节约了轮询检测等待IO操作的时间,selector可以去执行那些已就绪通道的IO操作。不像普通IO一旦执行r...原创 2020-04-17 19:58:19 · 820 阅读 · 0 评论 -
如何理解Java的一次编译,到处运行?
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。——《深入理解Java虚拟机》程序语言分为机器语言、汇编语言和高级语言,历史的发展演变也是从机器语言到高级语言的过程。现在几乎没有程序员的工作是编写机器语言,都是使用高级语言如C、Java来编程。计算机只能识别和执行仅含0和1的机器语言,所以我们使用高级语言编写的程序必须经过编译器变成机器语言才能被处...原创 2020-04-11 13:35:57 · 1357 阅读 · 0 评论 -
Java中的Unsafe
Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数...转载 2020-03-16 08:56:48 · 307 阅读 · 0 评论 -
源码反码补码、进制转换、Java中的运算符
1 负数的二进制我们知道计算机只认识0和1,数字在计算机中就是以二进制表示的。这里提到三个概念:原码、反码和补码。数字的表示形式就是补码。1.1 正数正数的原码、反码和补码都是一样的,比如int值5的的原码、反码和补码都是:00000000 00000000 00000000 00000101所以5在计算机中的表示也是00000000 00000000 00000000 000...原创 2020-03-10 21:29:39 · 1215 阅读 · 2 评论 -
Java源码中的{@docRoot}
在看jdk源码时看到这个注释,本想直接点进去,没想不行,只能自己在浏览器里面输入地址。 * See the KeyPairGenerator section in the <a href= * "{@docRoot}/../technotes/guides/security/StandardNames.html#KeyPairGenerator">经过查找,...原创 2020-02-22 14:20:25 · 1233 阅读 · 2 评论 -
Java的Serializable序列化机制
。。。转载 2020-02-21 13:49:41 · 156 阅读 · 0 评论 -
Java远程调用 RMI
Java 远程处理 Java远程方法调用(RMI)提供了Java程序语言的远程通讯功能,这种特性使客户机上运行的程序可以调用远程服务器上的对象,使Java编程人员能够在网络环境中分布操作。 创建一个简单的Java分布式远程方法调用程序可以按以下几个步骤操作,一、定义远程接口: 在 Java 中,远程对象是实现远程接口的类的实例, 远程接口声明每个要远程调用的方法。在需要创...转载 2020-02-20 15:16:16 · 175 阅读 · 0 评论 -
TreeSet底层原理
1 前言本人使用的是jdk1.8版本。2 List集合继承结构3 底层实现TreeSet的底层是TreeMap,添加的数据存入了map的key的位置,而value则固定是PRESENT。TreeSet中的元素是有序且不重复的,因为TreeMap中的key是有序且不重复的。具体参考:TreeMap的底层原理。public class TreeSet<E> ext...原创 2020-02-19 21:15:45 · 7467 阅读 · 3 评论 -
【集合】TreeMap底层原理
1 前言本人使用的是jdk1.8版本。2 Map集合继承结构3 底层原理TreeMap底层使用红黑树的结构进行数据的增删改查,红黑树是一种自平衡的二叉查找树,想了解红黑树推荐看看这篇博文:30张图带你彻底理解红黑树。学过数据结构的都知道二叉查找树是一种有序树,即进行中序遍历可以得到一组有序序列,所以TreeMap也是有序的Map集合。在红黑树的加持下,TreeMap的众多方...原创 2020-02-19 20:14:02 · 2053 阅读 · 0 评论 -
【集合】HashSet底层原理
1 前言本人使用的是jdk1.8版本。2 List集合继承结构3 底层实现原创 2020-02-19 18:11:02 · 404 阅读 · 0 评论 -
Vector底层原理
1 前言本人使用的是jdk1.8版本。2 List集合继承结构3 ArrayList与Vector的异同ArrayList与Vector高度相似,了解下面的不同点之后可以参考ArrayList。相同点ArrayList和Vector的底层接口都是一个Object[],并且提供的add、get、remove等方法逻辑代码实现都差不多。不同点Vector中对底层数组...原创 2020-02-18 18:20:45 · 1444 阅读 · 0 评论 -
【集合】LinkedList底层原理
1 前言本人使用的是jdk1.8版本。2 List集合继承结构3 底层实现LinkedList的底层是一个双端链表,每个节点有prev和next两个前、后指针。同时用first和last指针分别指向链表的头尾节点,方便对链表收尾进行插入删除等操作。因为是链表,所以LinkedList没有初始默认长度。public class LinkedList<E> ...原创 2020-02-18 17:58:00 · 521 阅读 · 0 评论 -
【Java关键字】Java中transient关键字
根据The Java Language Specification, Java SE 8 Edition:变量如果被transient关键字修饰,那么当对这个类的实例进行持久化(Serializable)保存时,这个被修饰的变量不会被持久化。比如有一个Point类的实例,当被持久化保存时,只有x、y会被持久化,rho、theta变量会被忽略。class Point { int x...原创 2020-02-18 17:40:56 · 121 阅读 · 0 评论 -
Java中集合使用增强for循环进行遍历抛出ConcurrentModificationException
在ArrayList底层原理中,介绍了:使用集合的迭代器类对集合进行迭代时,迭代器会记录下当前modCount(每当调用add等方法时,modCount会+1)的值,在通过迭代器遍历集合容器的过程中(使用迭代器的next、previous、set、remove、add方法),会一直判断modCount与一开始记录的值是否相同,若不同则抛出ConcurrentModificationExceptio...原创 2020-01-26 14:40:19 · 1130 阅读 · 0 评论 -
【Java集合】ArrayList底层原理
1 前言本人使用的是jdk1.8版本。2 List集合继承结构3 底层实现可以看到底层是通过一个Object[] elementData来存储数据的,在不指定初始容量的情况下(空参构造)默认容量为10,不过要在第一次add操作时才会为elementData变量赋值(懒扩充)。public class ArrayList<E> extends AbstractL...原创 2020-01-26 10:46:06 · 546 阅读 · 0 评论 -
【Java字符串】String、StringBuilder和StringBuffer
前言本人使用的jdk8。StringString是Java中最常用的类,这个类并不是Java基础类型,它的底层是char数组实现的,然后提供了众多操作这个char数组的方法。String类是final的,即不能被继承的,String中的字符串也是不可变的。1. 底层实现下面是String类的一点注释介绍:所有的字符串字面量(string literals)如“abc”,都被实现...原创 2020-01-22 19:48:42 · 212 阅读 · 0 评论 -
为什么重写equals方法时也要重写hashCode方法
本人用的jdk版本为1.8。hashCode是Object类中的一个本地方法,这意味着所有的对象继承了它的hashCode方法。废话不多说,先看Object类中对hashCode方法的介绍: /** * Returns a hash code value for the object. This method is * supported for the benef...原创 2020-01-13 17:42:30 · 162 阅读 · 0 评论 -
【Java基础】==和equals的区别
这里记录下自己的研究思路,我总体上是通过看jdk源码的方式来学习的,这里我的jdk版本是1.8。==不废话,直接上jdk源码,下面是Object对象中equals方法的源码及注释介绍,equals方法中只有return (this==obj)这一行代码,也就是说在Object中,equals方法等价于==(重写equals方法的类另当别论,这里是没有重写的情况)。 /** ...原创 2020-01-13 14:42:11 · 160 阅读 · 0 评论