自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(40)
  • 收藏
  • 关注

转载 Java创建字符串

原理1:当使用任何方式来创建一个字符串对象s=X时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一...

2019-07-09 20:49:00 323

转载 syncronized 与 Lock 的区别

Lock是个接口;synchronized是Java中的关键字,内置语言实现synchronized发生异常时,会自动释放线程占有的锁,因此不会发生异常死锁;lock发生异常时,如果没有主动通过unlock()方法释放锁,那么就会一直占用锁,发生死锁,因此需要在finally块中释放锁l...

2019-07-09 18:58:00 267

转载 Java 中 CAS 原理

CAS 有三个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相等时,将内存值V修改成B。这是一种乐观锁的思路,他相信在它修改之前,没有其他线程去修改他。CAS 的缺陷:ABA 问题。CAS 是在更新值时,检查值有没有发生变化,如果没发生变化就执行更新操作。但是如果...

2019-07-09 18:33:00 126

转载 Java 中 wait 与 sleep 的区别以及 notify 与 yield

来自不同的类,sleep 与 yield 来自 Thread 类,和 wait 与 notify 来自 Object 类。是否释放锁,sleep 没有释放锁,wait 释放了锁 使得其他线程可以执行同步块或者方法。sleep 不出让系统资源,wait 进入线程等待池等待,出让资源。使用范...

2019-07-09 18:15:00 155

转载 介绍乐观锁和悲观锁

乐观锁,每次拿数据时都认为别人不会修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有更新这个数据。可以使用版本号机制和CAS算法实现。乐观锁适用于写比较少的情况,这样可以省去锁的开销,加大系统的吞吐量。如果经常发生冲突,上层应用会不断的进行retry,这样反而是降低了性能,...

2019-07-09 17:59:00 132

转载 Java 中 Thread 与 Runnable 的区别

实现Runnable接口相比继承Thread类有如下好处:避免单点继承的局限,一个类可以继承多个接口。适合于资源的共享 转载于:https://my.oschina.net/u/...

2019-07-09 17:41:00 73

转载 m阶B+树与m阶B树的区别

在B+树中,具有n个关键字的节点只含有n棵子树,即每个关键字对应一个子树;而在B树中,具有n个关键字的节点只含有n+1棵子树。在B+树中,每个结点(非根节点)关键字个数n的范围是m/2(向上取整)<=n<=m(根结点:1<=n<=m);在B树中,每个结点(非根节点)...

2019-07-09 17:32:00 4021

转载 Java开发中遇到过哪些Exception

java.lang.NullPointerExceptionjava.lang.ClassNotFoundExceptionjava.lang.ArrayIndexOutOfBoundExceptionjava.lang.NoSuchMethodErrorjava.lang.OutO...

2019-07-09 09:35:00 200

转载 Java 中的深拷贝和浅拷贝

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。Java中clone方法是浅拷贝。深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。如果需要拷贝一个对象,那么一定要实现 clonable 接口。 ...

2019-07-08 21:42:00 63

转载 JVM内存布局

JVM内存:堆、方法区、虚拟机栈、本地方法栈、程序计数器堆和方法区线程共享,后面三个线程私有。堆:存放实例对象以及数组对象,GC的主要区域。堆为对象分配内存的方法:碰撞指针和空闲列表。 对象访问方式:句柄和直接访问。方法区:存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代...

2019-07-08 21:16:00 65

转载 实现堆的插入和删除操作

最大堆的插入//向最大堆中插入元素, heap:存放堆元素的数组 public static void insert(List<Integer> heap, int value) { //在数组的尾部添加 if(heap.size()==0...

2019-07-08 20:58:00 393

转载 游戏排名,可以使用什么数据结构

平衡二叉树把[0,1000000)作为一级区间,再把一级区间分为两个二级区间[0,500000)和[500000,1000000),然后再把二级区间二分为4个三级区间,以此类推。最后会得到1000000个21级区间[0,1),[1,2)...[999999,1000000)。这实际上是把区间...

2019-07-08 18:59:00 1392

转载 有了二叉查找树、平衡树(AVL)为啥还需要红黑树?

平衡树(AVL)是为了解决 二叉查找树(BST)退化为链表的情况。红黑树(RBT)是为了解决 平衡树 在删除等操作需要频繁调整的情况。红黑树5个特征每个节点要么是黑色,要么是红色。根节点是黑色。每个叶子的节点都是黑色的空节点(NULL)。每个红色节点的两个子节点都是黑色的。...

2019-07-08 18:20:00 691

转载 HashMap的初始容量为什么设为16

length 的值为 2 的整数次幂,h & (length - 1)相当于对 length 取模。这样提高了效率也使得数据分布更加均匀。为什么会更加均匀?length的值为偶数,length - 1 为奇数,则二进制位的最后以为为1,这样保证了 h & (length -...

2019-07-08 18:09:00 137

转载 产生死锁的四个必要条件

互斥条件:一个资源每次只能被一个进程使用请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放不剥夺条件:进程已获得的资源,在未使用完之前,不得强行剥夺循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系 ...

2019-07-08 18:03:00 106

转载 请实现单例模式

要点某个类只能有一个实例构造器私有化它必须自行创建这个实例含有一个该类的静态变量来保存这个唯一实例必须自行先整个系统提供这个实例对外提供获取该实例对象的方式直接暴露用静态变量的 get 方法获取常见几种形式饿汉式:直接创建对象不存在线程安全问题...

2019-07-08 17:57:00 96

转载 jdk8新特性

默认方法。一个在接口里面有了一个实现的方法。只需在方法名前面加个 default 关键字即可实现默认方法。lambda表达式。Lambda 允许把函数作为一个方法的参数传递进方法中。它实际上是个匿名函数。方法引用。java8 允许使用 :: 关键字来传递方法或者构造函数引用。函数式接口...

2019-07-08 17:52:00 59

转载 HashMap存储自定义类,需要重写自定义类的哪些方法?

重写 hashcode 与 equals 方法。hashCode() 方法是一个本地 native 方法,返回的是对象引用中存储的对象的内存地址,而 equals 方法是利用 == 来比较的,也是对象的内存地址。HashMap 中 Key 是这样比较的,先求出 Key 的 hashc...

2019-07-08 17:15:00 474

转载 ArrayList 和 LinkedList 区别

ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。对于随机访问,ArrayList优于LinkedList对于插入和删除操作,LinkedList优于ArrayListLinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数...

2019-07-08 16:46:00 64

转载 HashMap是线程安全的吗?为什么?那些是线程安全的容器?以及HashMap与HashTable的区别?...

HashMap 不是线程安全的。HashMap 做 put 操作时,两个线程同时进入 addEntry 操作,计算出相同的 hash 值,A线程写入头节点之后,B线程也写入头节点,那么A的操作就会被覆盖,造成A的写入操作丢失。Vector 和 HashTable,concurrentHa...

2019-07-08 16:39:00 754

转载 Java中的异常

ThrowableErrorOutOfMemoryErrorThreadDeathException运行时异常非运行时异常Error 是程序无法处理的错误。发生时,一般jvm会终止线程。Exception 是程序本身可以处理的异常。程序中应该尽可能去处理...

2019-07-08 16:33:00 76

转载 jdk7和jdk8中hashMap实现的区别

jdk7:采用的是位桶(数组)+链表的方式,即我们常说的散列链表的方式。节点的实现类时Entry类jdk8:采用的是位桶+链表 / 红黑树的方式.当某个位桶的链表的长度 >8 的时候,这个链表就将转换成红黑树。节点的实现类时Node类hash值的计算不一样补充:为什么会采用...

2019-07-08 16:19:00 131

转载 Java中散列表、树所对应的容器类。HashMap如何解决hash冲突的

散列表(哈希表)对应的容器HashMap、hashset、HashTable、concurrentHashMap树对应的容器treemap、treeset什么是Hash冲突两个不同的 key 计算出来的 hashcode 值相同。解决方法开放定址法 key=(f(key)+di...

2019-07-08 15:54:00 216

转载 简述Java中的内部类

为什么使用内部类?  每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类没有影响。成员内部类内部类对于外部类来说,相当于一个成员变量。内部类可以使用任意访问控制符内部类的方法可以直接访问外部类的数据,而不受访问控制符的影响创建...

2019-07-03 22:03:00 103

转载 Java Object类中的方法有哪些

waitnotifynotifyAllclonehashcodetoStringfinalizeequals 转载于:https://my.oschina.net/u/...

2019-07-03 11:07:00 122

转载 用Java实现生产者消费者的三种方法

使用 wait 与 notify使用 wait 与 signal使用阻塞队列代码链接 转载于:https://my.oschina.net/u/4141148/blog/306...

2019-07-03 11:01:00 245

转载 Java中的泛型擦除

Java 中的泛型只在源码中存在,在编译后的字节码文件中就已经替换为原生类型。并在相应的位置插入强制类型转化。当泛型遇到重载容易出现问题,编译不通过。 public class Generic4 { public void test(ArrayList<Integer&g...

2019-07-02 22:14:00 59

转载 Java对象的内存布局

对象头用于存储对象自身的运行时的数据,比如哈希码、分代年龄、锁状态标志等信息类型指针,指向其类元信息的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例如果对象是个数组,那么对象头中还有一个记录对象数组长度的数据实例数据对其填充 ...

2019-07-02 21:49:00 59

转载 简述分派

分派包括静态分派和动态分派静态分派:依赖静态类型来定位方法的执行版本的分派,称为静态分派。发生在编译时期。典型应用为方法的重载。动态分派:在运行期根据实际类型确定方法执行版本的分派,称为动态分派。程序运行期间才能确定类型。典型应用是子类对父类方法的重写。 ...

2019-07-02 21:23:00 169

转载 双亲委派模型:启动类加载器、扩展类加载器、应用程序类加载器

Java中的类和类加载器一起 唯一确定类在jvm中的一致性。BootStrapClassLoader <- ExtClassLoader <- AppClassLoader <- 自定义类加载器启动类加载器:主要负责加载 java.home 下的 lib 目录下的...

2019-07-02 20:58:00 568

转载 Java中的类加载机制

加载、连接(验证 准备 解析)、初始化阶段加载:根据类的全限定名来获取此类的二进制字节流;将这个字节流代表的静态存储结构转化为方法区中的动态存储结构;在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的访问入口。验证(连接):确保加载的类信息符合jvm规范...

2019-07-02 17:17:00 61

转载 HashMap源码,问map源码问题?以及LinkedHashMap,TreeMap不同

HashMap 中的 put 方法。put 时先判断是否为空,不为空就计算 hash 值,再使用 indexFor()方法计算数组下标。该方法仅有一条语句:h & (length - 1),这除了取模提高运算效率之外,还会使数据均匀分布在table数组上,充分利用空间。Linked...

2019-07-02 00:43:00 73

转载 简单叙述深度优先和广度优先遍历,以及区别

深度优先遍历的非递归做法时采用栈;广度优先遍历的非递归做法时采用队列深度优先遍历是把每个分支深入到不能深入为止。具体的有先序遍历、中序遍历、后序遍历;广度优先遍历又称层序遍历,从上往下一层一层遍历 ...

2019-07-01 18:51:00 1509

转载 Java中创建子类实例时会创建父类实例吗

不会构建一个对象时,jvm会在堆中给对象分配空间。这些空间用来存储当前对象实例属性以及其父类的实例属性(这些属性都是从方法区中获得)。这里不仅仅会给当前对象的实例属性分配空间,还需要给父类的实例属性分配空间。总之,会为父类分配堆内存,但是这块堆内存属于子类的堆内存。每个类的这些元...

2019-07-01 18:27:00 220

转载 Java中的引用(强引用、软引用、弱引用、虚引用)

强引用:常见的Object obj = new Object();只要强引用还在,垃圾回收器就永远不会回收掉此对象。软引用:用来描述一些有用但非必要的对象。在内存即将发生泄露之前,会把这些对象列进回收范围之中进行二次垃圾回收。如果这次回收还没有足够的内存,那么才会发生内存溢出。软引用可以用...

2019-06-30 20:24:00 64

转载 简单可达性分析

首先有一系列GC root根节点。然后从根节点开始,一路向下遍历,走过的路称为引用链。但一个对象到GC root没有引用链时,则称这个对象不可活。如果这个对象不可活,仍可以通过finalize()方法自救。可以作为GC root的对象包括方法区中常量引用的对象方法区中静态属性引用的对...

2019-06-30 17:47:00 195

转载 Java中<init>方法与<clinit>方法

<init>方法Java在编译之后会在字节码文件中生成<init>方法,这称为实例构造器。它会将变量初始化、语句块、调用父类的构造器等操作收敛到<init>方法中。收敛顺序为:父类变量初始化、父类语句块、父类构造函数、子类变量初始化、子类语句块、子类构造函...

2019-06-30 17:32:00 463

转载 Java重载与重写的区别

Java重载是由静态类型确定的,在类加载的时候即可确定,属于静态分派;重写是由动态类型确定,在运行时确定,属于动态分派。动态分派的实现方法是虚方法表,这里面存着各个方法的实际入口地址。没重写,子类与父类的方法表地址相同,否则不同。重载是同一个方法名,但是参数类型或者个数不同,这可以理解为一...

2019-06-29 22:46:00 69

转载 Java 对象的创建过程

判断是否加载。检查常量池中是否可以定位到指定类的符号引用。可以定位:类已加载到jvm中。不能定位:说明没有加载,要先进行加载操作。分配内存(指针碰撞/空闲列表)初始化零值设置对象头(实例是哪个类的实例,类元信息位置,GC分代年龄等)<init>方法...

2019-06-29 19:45:00 85

转载 Java中接口与抽象类的区别

一个类只能继承一个 abstract 类;可以实现多个 interface抽象类里面,可以定义普通成员变量、静态变量,方法可以是 abstract,也可以是非 abstract接口里面,成员方法必须是 abstract,成员变量必须为 static final(一般不定义成员变量)...

2019-06-29 15:24:00 75

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除