深入理解java
文章平均质量分 75
javaduqing
duqingfeng.net
展开
-
spring源码(10)从缓存中获取到单例bean的后续操作(对FactoryBean的处理)
从缓存中获取到实例,doGetBean第一步就是对我们输入的name做了处理。去除FactoryBean的修饰符,也就是name=”&a”,最终处理为name=”a”取指定别名最终所指向的beanName在从缓存中获取实例时,getSingleton(beanName),参数是已经处理的。我们知道如果想要获取FactoryBean getObject方法对应的实例,那么name需要加前缀&。所原创 2017-08-10 23:03:11 · 1094 阅读 · 0 评论 -
你是如何给在使用的方法增加参数的?
在我今天开发的时候,因为业务变动,需要给方法A增加一个参数,方法A在很多地方被使用,如何做才会改动最小。有些人可能会说,重新写个方法;有的人说,直接在原来的方法A中增加一个参数。例如:一个总价计算方法getTotal,该方法有两个参数,数量和单价:public class CalcUtils { public static int getTotal(int num,int price){原创 2017-08-21 23:29:31 · 1630 阅读 · 0 评论 -
java 安全管理器详解(1)
一、权限控制的最小单元java.security.Permission可以把Permission理解为java安全的最小单元,是权限的抽象代表。通常一个Permission子类构造器会有两个参数,一个是目标的名称(对谁进行权限控制);另外一个是对目标允许的操作(例如对一个文件读操作)。Permission是一个抽象类,包含的方法如下:abstract boolean equals(Object ob原创 2017-09-16 20:05:53 · 1047 阅读 · 0 评论 -
java 安全管理器详解(2)
一、运行时代码权限检测由一个名为 java.lang.SecurityManager 的类负责监督类是否越权。在默认情况下,不会进行权限检测。可通过两种方式开启权限检测:在启动时传递给 JVM 的、名为 java.security.manager 的环境变量【-Djava.security.manager-Djava.security.policy=[策略文件路径] 】动态设置Security原创 2017-09-16 20:21:01 · 1096 阅读 · 1 评论 -
实例分析Class字节码文件(一)
一、小试牛刀要分析的代码如下:package com.demo6; public class TestClass { private int m; public int inc(){ return m + 1; } }Class字节码文件部分转化为16进制如下:根据Class文件格式表:转换几个: 编码(16进制)原创 2017-10-09 20:49:41 · 453 阅读 · 0 评论 -
实例分析Class字节码文件(二)
上篇必看:实例分析Class字节码文件(一)四、字段表集合字段表(field_info)集合用于描述接口或者类中声明的变量。包括:类级变量 + 实例级变量(不包括局部变量) 注: ① 类级变量 = 类变量 = 静态变量 【static int a;】 存储在方法区; ②实例级变量 :没有static修饰符,只能通过实例对象访问;存储在对象中;描述一个字段包含的方面有:① 字段的原创 2017-10-10 00:17:28 · 431 阅读 · 0 评论 -
实例分析Class字节码文件(三)
六、属性表集合在前面介绍的,字段表集合和方法表集合中都有使用到属性表,结构均为:首先用2个字段标识属性表集合的大小,之后就是属性表的具体内容,属性表结构如下:attribute_name_index : 指向运行时常量池中的某个常量 attribute_length : 属性长度 info:属性具体内容下面开始介绍,java虚拟机可识别的属性1.Code属性Java程序方法体中代码经过编译后,最原创 2017-10-13 12:01:49 · 439 阅读 · 0 评论 -
volatile无法保证i++原子性的解决方案
一、阻塞算法与非阻塞算法1、阻塞算法以常见的同步实现方式synchronized为例,同一时间段,同一个锁,只能有一个线程获得,其他未获取到的线程阻塞,直到拥有锁的线程释放锁。下图演示了一个阻塞算法保证一个共享数据结构的行为:2、非阻塞算法线程A请求某种操作,如果系统无法响应;则通知A线程,A可先去执行其他操作;下图演示了一个非阻塞算法保证一个共享数据结构的行为:二、Volatile 变量存在的问题原创 2017-11-05 17:58:55 · 3391 阅读 · 2 评论 -
spring源码附录(1)java实现对XML格式的验证
最近在看spring源码,涉及到xml文档的解析、xml文档的格式验证,发现自己对xml解析的基础较为薄弱,本篇博客复习下DOM方式解析xml(即spring解析xml的方式)。DOM解析XML是将整个XML作为一个对象,占用内存较多。另外一个java官方的XML解析方式SAX是边扫描边解析,自顶向下依次解析,占用内存较少。一、java实现对XML格式的验证可以使用两种验证模式(DTD、XSD)保证原创 2017-07-16 19:10:19 · 1897 阅读 · 0 评论 -
Hashtable类注释翻译、源码分析
一、与HashMap的不同之处 HashMap Hashtable 线程同步 线程不同步 key可以为NULL key不可以为NULL 使用fail-fast迭代器 enumerator迭代器 继承AbstractMap 继承Dictionary我们在阅读源码的过程中可以着重分析HashTable的四个特点。二、类注释翻译This class implemen原创 2017-06-26 20:33:43 · 1233 阅读 · 0 评论 -
ArrayList类注释翻译、源码分析
一、类注释翻译/** * Resizable -array implementation of the <tt> List</tt> interface. Implements * all optional list operations, and permits all elements, including * <tt>null </tt> . In addition to imple原创 2017-06-30 10:40:28 · 1092 阅读 · 0 评论 -
HashMap源码分析
一、什么是哈希表1.定义哈希表(hash table、散列表),是一种常用的数据结构。通过数组+链表实现。 我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置。 其中,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。hash函数的种类有多种,HashMap种采用的直接寻址方式。 2.地址冲突举例:有两个元素A、B想要加入hash表,过程原创 2017-06-21 11:46:30 · 609 阅读 · 0 评论 -
LinkedList类注释翻译、源码分析
一、类注释翻译 * Doubly -linked list implementation of the {@code List} and {@code Deque} * interfaces. Implements all optional list operations, and permits all * elements (including {@code null}).使用“双向链表原创 2017-07-01 11:17:25 · 813 阅读 · 0 评论 -
java多线程(1)基础
一、创建线程的两种方法①继承Thread类class MyThread extends Thread{ @Override public void run(){ }}MyThread mt = new MyThread();mt.start();②实现Runnable接口class MyThread implements Runnable{ @Override原创 2017-01-28 21:39:41 · 393 阅读 · 0 评论 -
Java多线程(2)生产者消费者问题(一)
一、问题描述在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。如何用代码描述此类问题。二、一个消费者线程、一个生产者线程有几点需要强调: 1.main方法中的资源res的线程t1、t2共享的。所以原创 2017-07-02 18:34:55 · 610 阅读 · 0 评论 -
java多线程(3)生产者消费者问题(二)
一、疑问如果我们想执行具体唤醒哪个阻塞的线程,应该怎么做?在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题, 但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, 为了①更清晰的表达如何加锁和释放锁 ②指定具体唤醒哪个线程 JDK5以后提供了一个新的锁对象Lock。使用Lock改写生产者消费者问题(只改动了Resource类):package com.thread原创 2017-07-02 18:37:22 · 318 阅读 · 0 评论 -
java多线程(4)内存模型概述
一、可见性可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。java内存模型(JMM) java内存模型(java Memory Model)描述了java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。①所有变量都存储在主内存中原创 2017-01-28 23:44:02 · 437 阅读 · 0 评论 -
HashSet类注释翻译、fast-fail、源码分析
一、类注释翻译This class implements the <tt> Set</tt> interface, backed by a hash table(actually a <tt>HashMap </tt> instance). It makes no guarantees as to theiteration order of the set; in particular, it原创 2017-06-24 16:12:59 · 778 阅读 · 0 评论 -
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码(二)
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码 (一)这篇文章希望通过对 AbstractQueuedSynchronizer 内部类 ConditionObject 的探索,加深对阻塞唤醒机制的理解!一、await()方法流程ReentrantLock lock = new ReentrantLock(true);Condition con = lo原创 2017-11-21 20:29:58 · 557 阅读 · 0 评论 -
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码(一)
提起ReentrantLock,想必大家最熟悉的就是这lock()、unlock()这两个方法了,那今天就从这入手吧!一、类结构三个内部类:Sync、FairSync、NonfairSyncSync : 同步器基类 FairSync : 实现公平锁的同步器 NonfairSync : 实现非公平锁的同步器Sync 继承 AbstractQueuedSynchronizer;FairSync、No原创 2017-11-21 14:57:05 · 593 阅读 · 4 评论 -
AQS同步队列与条件队列的关系
本文图片来源: http://javadoop.com/post/AbstractQueuedSynchronizer-2 http://blog.csdn.net/tb3039450/article/details/69056169一、关系同步队列节点来源一:同步队列依赖一个双向链表来完成同步状态的管理,当前线程获取同步状态失败 后,同步器会将线程构建成一个节点,并将其加入同步队列中。同步队列原创 2017-11-21 21:08:36 · 8847 阅读 · 2 评论 -
ConcurrentHashMap源码理解(1.7)
请先阅读: HashMap源码分析 Hashtable类注释翻译、源码分析 一、前言先来复习下HashMap、HashTable。 HashMap是基于哈希表实现的。每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 数据结构可表示如下: HashTable是HashMap是线程安全版,但是使用synchronized来保证线程原创 2017-12-16 19:45:52 · 698 阅读 · 0 评论 -
B树(B-树)插入、删除操作
一、定义B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件: (1)每个结点至多有m个子结点; (2)除根结点和叶结点外,其它每个结点至少有ceil(m/2)个子结点; (3)根结点至少有两个子结点;(唯一例外的是根结点就是叶子结点) (4)所有的叶结点在同一层; (5)有k个子结点的非根结点恰好包含k-1个关键码,关键码按照递增次序进原创 2017-12-01 12:24:07 · 20649 阅读 · 5 评论 -
2-3树插入、删除操作
一、定义2-3查找树的定义如下:要么为空,要么:对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2-3节点,所有的值比key要大对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点。左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点原创 2017-12-26 11:40:15 · 4461 阅读 · 2 评论 -
B树(又称B-树)插入、删除操作
一、定义B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件: (1)每个结点至多有m个子结点; (2)除根结点和叶结点外,其它每个结点至少有ceil(m/2)个子结点; (3)根结点至少有两个子结点;(唯一例外的是根结点就是叶子结点) (4)所有的叶结点在同一层; (5)有k个子结点的非根结点恰好包含k-1个关键码,关键码按照递增...原创 2017-12-28 15:15:13 · 2384 阅读 · 1 评论 -
java类、对象加载机制题目汇总
第一题public class Test3 { public static Test3 t = new Test3(); { System. out .println("blockA" ); } public Test3() { } static{ System. out .println("block原创 2017-06-16 15:43:28 · 372 阅读 · 0 评论 -
final修饰变量 与 不可变对象
final修改基本数据类型,则基本数据类型的值不能修改final修改引用类型变量,则该引用不能修改,但是该变量可以修改。public class Test4 { public static void main(String[] args) { final int a = 10;// a = 20; 编译错误 final Test t = new Te原创 2017-06-16 14:50:55 · 1015 阅读 · 0 评论 -
关于String.intern()的思考
原文地址:http://www.cnblogs.com/grefr/p/6087987.html我们首先来看一个例子:// 1String str1 = new StringBuilder("ja").append("va").toString();System.out.println(str1.intern() == str1);// 2String str2 = new StringBu转载 2017-05-26 21:34:51 · 686 阅读 · 0 评论 -
知识点
1.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。 答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上转载 2016-06-14 16:27:46 · 472 阅读 · 0 评论 -
Properties 读取配置文件
private static String context; //文件路径 private static String fileBasePath; static { Properties pop = new Properties(); InputStream is = CreateHtmlUtil.class.getClassLoader().g原创 2016-08-08 20:19:39 · 344 阅读 · 0 评论 -
HashSet中的元素比较详解
引例public class Student{ private String name; private int age; Student(String name,int age){ this.name = name; this.age = age; }}class Demo{ list hs = new H...原创 2016-06-03 11:07:03 · 4449 阅读 · 0 评论 -
java中的匿名内部类总结
原文地址:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法abstract class Person { public转载 2016-11-03 13:45:10 · 382 阅读 · 0 评论 -
java Field类
原文地址:http://www.cnblogs.com/xinhuaxuan/p/6019510.html一、Field类是什么Field是一个类,位于java.lang.reflect包下。 在Java反射中 Field类描述的是 类的属性信息,通俗来讲 有一个类如下:package com.testReflect;public class FieldDemo { public int转载 2016-11-03 15:54:05 · 14263 阅读 · 2 评论 -
java static 详解
原文地址:http://www.cnblogs.com/dolphin0520/p/3799052.html一、static关键字的用途在《Java编程思想》P86页有这样一段话: “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”这转载 2016-10-16 13:18:41 · 365 阅读 · 0 评论 -
java split()函数用法分析
原文地址:http://swiftlet.net/archives/709在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,函数返回是一个数组。在其中每个出现regex的位置都要进行分解。 需要注意是有转载 2016-10-26 19:48:16 · 1098 阅读 · 0 评论 -
对象序列化 ObjectInputStream ObjectOutputStream
如果想把一个java对象持久化,可以用ObjectInputStream和ObjectOutputStream。下面看demo。//Person类public class Person implements Serializable{ //声明类的标识,也可以不写,系统会自动生成 static final long serialVersionUID = 42L; priva原创 2016-06-02 14:21:54 · 367 阅读 · 0 评论 -
Map集合的取值方式
方式//Map集合的取值原理:先将Map的键转成Set,再通过迭代器取出。public class MapDemo_1 { public static void main(String[] args) { Map<String,String> map = new HashMap<String,String>(); map.put("01","a");原创 2016-06-03 14:58:52 · 3199 阅读 · 0 评论 -
URL 编码与解码和escape,encodeURI,encodeURIComponet用法
js全局方法: escape,encodeURI,encodeURIComponent的区别一、escape和它们不是同一类简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。 编码之后的效果是%XX或者%uXXXX这种形式。 其中 ASCII字母 数字 @*/+ 这几个字符不会被编码,其余的都会。 最关键的是,当你需要对URL编码时转载 2016-06-27 16:31:35 · 4210 阅读 · 0 评论 -
JSON.parse()与JSON.stringify()
//实例1 var str = '{"name":"dqf","age":"23"}'; console.info(JSON.parse(str)); //实例2 //a是json对象 var a = {"a":"1","b":"2"}; console.info(JSON.stringify(a)) //实例3 var student =原创 2016-06-27 17:36:59 · 762 阅读 · 0 评论 -
接口的注意事项
接口的规范:接口之间可以继承(extends),接口之间不存在实现(implements)的关系,接口中不能有实现了的方法。<修饰符>interface<接口名>{ <常量申明> <抽象方法申明>} 接口的特点:1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用”_”分隔)2、J原创 2016-06-14 08:53:18 · 2013 阅读 · 0 评论