自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 hashCode()和equals()

equals()的作用equals()用来判断两个对象的内存地址是否相等Object类定义了equals,意味着所有的Java类都实现了equals()方法比较两个对象是否相等。Object源码中,默认的equals方法等价于 ==所以,通常会重写equals方法,比如String类库里的equals比较两个对象的内容相等。类是否覆盖equals()方法没有重写equals方法import java.util.*;import java.lang.Comparable;/** *

2020-11-24 11:17:57 129

原创 字符型常量与字符串型常量

形式上:1. 字符常量是单引号括起来的一个字符2. 字符串常量是双引号括起来的0个或多个字符含以上:1. 字符常量相当于一个整型值(ASCII值),可以参加表达式运算2. 字符串常量代表一个地址值(该字符串在内存中的存放位置)占内存大小:1. 字符常量只占2个字节2. 字符串常量占多个字节注意:char在Java中占两个字节字符封装类 Character 有个一成员常量 Character.SIZE 值为16,单位是 bites,该值除以8(1byte = 8bits)后就得到2个字节

2020-11-23 15:03:31 4597

原创 Java内存区域

1. 运行时数据区域Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK 1.8之前JDK 1.8线程私有的:程序计数器虚拟机栈本地方法栈线程共享的:堆方法区直接内存(非运行时数据区的一部分)1.1 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器通过改变成计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理、线程恢复等功能。在多线程下,程序计数器用于记录当

2020-10-10 15:05:06 221

转载 (转载)重新认识HashMap

Java为数据结构中的映射定义了一个接口 java.util.Map此接口主要有四个常用的实现类,分别是 HashMap、HashTable、LinkedHashMap和TreeMap。下面对各个实现类做一些说明:HashMap(1)它根据键的hashCode值存储数据,可直接定位到值,访问速度快,但遍历顺序不确定。(2)HashMap最多只允许一条记录的键为null,允许多条记录的值为null。(3)HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据不

2020-10-09 10:48:20 110

原创 HashMap源码攻陷

简介HashMap 主要用来存放键值对,基于哈希表的Map接口实现JDK1.8 之前 HashMap 由 数组+链表 组成数组是HashMap的主体,链表则是为了解决哈希冲突(“拉链法”解决冲突)JDK1.8 之后 当链表长度大于阈值(默认为8)时转为红黑树转为红黑树前会判断当前数组长度,如果数组长度小于64,则会先进行数组扩容底层数据结构分析JDK1.8 之前JDK1,8之前 HashMap 底层是 数组+链表结合在一起使用(链表散列)。HashMap 通过 key 的 hashCode

2020-09-25 17:25:01 146

原创 LinkedList源码攻陷

简介LinkedList 实现了List接口和Deque接口的双端链表底层链表,支持高效的插入和删除实现Deque,支持队列非线程安全如果想让LinkedList编程线程安全,可以调用静态类Collections类中的synchronizedList方法:List list=Collections.synchronizedList(new LinkedList(...));LinkedList类有一个 内部私有类Node:private static class Node<E>

2020-09-25 11:23:30 107

原创 ArrayList源码攻陷

ArrayList简介底层是数组,容量动态增长。继承 Abstract 实现 List、RandomAccess、Cloneable、java.io.Serializable接口ArrayList 继承 AbstractList,实现 List 是一个数组队列 提供相关的添加、删除、修改、遍历等功能ArrayList 实现 RandomAccess 接口,RandomAccess是一个标志接口,表明实现这个接口的List集合是支持快速随机访问的,即可以通过元素的序号快速获取元素对象。ArrayL

2020-09-18 16:02:21 144

原创 枚举

1.简单示例定义一个简单的枚举类型 pizza 订单的状态package shuang.kou.enumdemo.enumtest;public enum PizzaStatus { ORDERED, READY, DELIVERED; }可以通过枚举避免定义常量System.out.println(PizzaStatus.ORDERED.name());//ORDEREDSystem.out.println(PizzaStatus.ORDERED);//ORDE

2020-09-14 21:51:57 280

原创 Java代理模式

1. 代理模式我们使用代理对象来代替对真实对象的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后可以增加一些自定义操作。2. 静态代理从实现和应用角度来说静态代理中,我们对目标对象的每个方法的增强都是手动完成的,非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)从JVM层面来说静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的class文件。静态代理实

2020-09-14 17:09:17 221

原创 Java反射

一、反射机制介绍Java反射是在运行状态中的动态的获取类的信息和调用对象的方法属性对于任意一个类,都能知道这个类的所有属性和方法对于任意一个对象,都能调用它的任意一个方法和属性二、获取Class对象的两种方式如果我们动态的获取到这些信息,需要依靠Class对象。Class对象将一个类的方法、变量等信息告诉运行的程序。Java提供了两种方式获取Class对象:知道具体类的情况下可以使用:Class alunbarClass = TargetObject.class;但是我们一般是不知道具

2020-09-07 22:20:12 112

原创 自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来拆箱:将包装类型转换为基本数据类型基本数据类型包装类型byteBytebooleanBooleanshortShortcharCharacterintIntegerlongLongfloatFloatdoubleDouble一、什么是装箱?什么是拆箱在 Java SE5 之前,生成一个数值为10的Integer对象:Integer i = new Integer(10).

2020-09-02 20:57:32 91

原创 ==和equals

一、==和equals的区别==它的作用是判断连个对象的地址是否相等。即判断两个对象是否同一个对象(基本数据类型比较值,引用数据类型比较内存地址)因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是比较引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。equals()它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。equals() 方法存在于 Object 类中,而 Object 类是所有类的直接或间接父类。public boo

2020-09-01 22:25:46 100

原创 Java泛型

一、Java泛型Java泛型是JKD1.5引入的一个新特性,泛型提供了编译时安全监测机制,该机制允许程序员在编译时检测非法的类型。泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。泛型一般有三种使用方式:泛型类//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型//在实例化泛型类时,必须指定T的具体类型public class Generic<T>{ private T key; public Generic(T ke

2020-09-01 21:52:19 120

原创 Java并发机制的底层实现原理

偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁。一个对象刚开始实例化的时候,没有任何线程来访问它的时候。它是可偏向的,意味着,它现在认为只可能有一个线程来访问它,所以当第一个线程来访问它的时候,它会偏向这个线程,此时,对象持有偏向锁。偏向第一个线程,这个线程在修改对象头成为偏向锁的时候使用CAS操作,并将对象头中的ThreadID改成自己的ID,之后再次访问这个对象时,只需要对比ID,不需要再使用CAS在进行操作。一旦有第二个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象时偏向

2020-08-25 17:11:19 248

原创 线程(二)- 线程间通信

volatile 和 synchronized关键字关键字 volatile 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量的访问间的可见性。举个例子,定义一个表示程序是否运行的成员变量 boolean on = true, 那么另一个线程可能对它进行关闭操作(on = false),这里涉及多个线程对该成员变量的读写,因此需要用volatile进行修饰。关键字synchronized可以修饰方法或者以同.

2020-08-18 16:51:44 103

原创 线程(一)- 线程基础

什么是线程线程是现代操作系统的最小调度单元,这些线程拥有各自的计数器、堆栈和局部变量等属性,并能够访问共享的内存变量。public class MultiThread { public static void main(String[] args) { //获取Java线程管理MXBean ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); //不需要获取同步的mon.

2020-08-10 17:24:54 141 1

原创 Lock接口

synchronized关键字属于隐式的在获取锁,固化的先获取后释放,扩展式远不如显示的锁获取和释放,比如Lock。我们先来看一下Lock的使用方式:public void test (){ //不要把获取锁的过程放在try内,会导致获取锁时发生异常导致锁无故释放 Lock lock = new ReentrantLock(); lock.lock(); try { //do something... }fina

2020-07-08 10:52:21 116

原创 synchronized的实现原理与应用

利用synchronized实现同步:Java的每个对象都可以作为锁。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是synchronized括号里配置的对象。Synchronized在JVM里的实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。代码块同步是使用 monitorenter 和 monitorexit 指令实现。方法同步虽没有详细说明,但也可以使用这两个指令实现。monitorenter 指令是在编译

2020-07-04 22:44:01 110

原创 Java并发机制的底层实现原理(volatile)

Java代码代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的的并发机制依赖于JVM的实现和CPU的指令volatile的应用volatile是轻量级的synchronize,它保证了多线程开发中保证了共享变量的可见性。可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。以下是与实现原理相关的.

2020-07-04 16:25:11 105

原创 什么是集合的快速失败?

什么是快速失败(fail-fast)快速失败(fail-fast)是Java集合的一种错误检测机制。在使用迭代器对集合进行遍历的时候,我们在多线程下操作非安全失败(fail-safe)的集合类可能就会触发fail-fast机制,导致抛出ConcurrentModificationException异常。在单线程下,如果在便利的时候对集合对象的内容进行了修改情况下也会触发fail-fast机制。为什么呢?每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCoun

2020-06-29 23:12:57 587

原创 ArrayList的扩容机制(源码)

ArrayList的构造方法ArrayList的三种初始化构造方法: /** * Default initial capacity. * 默认初始化容量大小 */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array instance used for default sized empty instances. We * distinguis

2020-06-21 02:21:56 146

原创 springContext.xml找不到引入配置文件路径

Spring上下文配置文件springContext.xml找不到引入配置文件路径springContex.xml文件中&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; &lt;property name=...

2019-01-21 11:21:47 1621

空空如也

空空如也

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

TA关注的人

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