分类:: Java

0

类文件结构

类文件结构 目录 Class类文件结构 特殊字符串概念 魔数与Class文件的版本 常量池 访问标志 类索引,父类索引与接口索引集合 字段表集合 方法表集合 属性表集合 类文件结构 Class文件结构只有两种数据类型:无符号数和表. 无符号数属于基本的数据类型,以u1, u2, u4, u8分别代表1个字节,2个字节,4个字节和8个字节的无符号数,它用来描述数字,索引引用,数量值或者

0

Java垃圾回收器

垃圾收集器目录 判定对象存活 引用计数法 可达性分析算法 再谈引用 强引用 软引用 弱引用 虚引用 生存还是死亡 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot的算法实现 枚举根节点 安全点 安全区域 垃圾收集器 Serial收集器 ParNew收集器 Parallel收集器 Serial Old 收集器 Parallel Old

0

Java内部类整理

内部类的定义 将一个类置于另外一个类内部, 这就是内部类. 内部类存在的意义 提供一种代码隐藏机制: 因为它允许将逻辑相关的类组织到一起, 并且可以控制内部类的可见性. 有效地实现了”多重继承”: 每个内部类都能独立地继承一个普通类, 抽象类或者实现一个接口. 内部类的特性: 内部类可以拥有多个实例, 每个实例都拥有自己的状态信息. 在单个外围类内, 可以让多个内部类以不同的方

0

深入理解Java集合-HashMap

前两篇文章分别介绍了ArrayList和LinkedList, 这次我们来分析另外一个key-value键值对的映射集合-HashMap.按照前面的习惯,我们先来看看HashMap的UML UML HashMap实现了Cloneable, Serializable, 所以HashMap支持克隆(浅克隆)和序列化. Map接口提供了一系列接口和三个视图. AbstractMap则是实现了Map接

0

Java注解处理器实战

注解处理器 注解强大的地方在于: 我们可以在运行时或者编译时处理注解. 在编译时或者运行时处理注解的机制都可以称为一个注解处理器. 注解处理器的类型 注解处理器的类型分为两大类: 运行时处理器: 这种机制是在程序运行时利用反射机制去处理注解. 编译时处理器: 这种机制是在程序编译时利用javac提供的一个apt工具来处理注解. 运行时处理器的特点: 该机制基于反射机制, 因此灵活性很

0

java反射的应用

什么是代理模式 代理模式是在不改变被代理类的代码的情况下, 对被代理的方法进行扩展, 这些扩展可以是打印日志, 控制访问等. 代理模式又分为静态代理和动态代理. 静态代理是指代理类在编译时, 就能够生成字节码被JVM识别. 而动态代理则是在运行时, 运用反射生成代理类字节码,最后被JVM识别. 静态代理静态代理比较简单, 下面给出一个例子, 然后分析它的缺点. 1234567891011121

0

java反射基础

什么是反射 在Java中, 每一个对象都对应有一个Class对象, 这个Class对象记录着对象的类型信息, 也就是类的内部结构. 我们知道, 我们编写的.java文件, 是需要被编译成.class文件, 然后才能被虚拟机加载执行. 正常情况下, .class是在编译期生成并且被JVM识别. 而反射机制则将.class文件的打开和检查推迟到运行时. 简单的说, 反射机制能让你在运行时操作一个类

0

Java注解基础

什么是注解 注解是一种元数据, 它能够让我们在代码中添加信息, 使得我们可以在稍后的某个时刻非常方便地使用这些数据. 使用场景 编译时生成一些配置文件或者部署文件 可以根据注解中的数据来生成模板代码, 从而减轻编写模板代码的负担 Java内置的3个注解 Java内置了3个注解, 他们是: Override: 表示当前方法定义将覆盖父类的方法. 如果你不小心拼写错误的话, 编译器会

0

J.U.C中的并发工具类

在Java的J.U.C包中提供了几个并发编程中非常有用工具类, 例如: Semaphore, CountDownLatch和CyclicBarrier. 这次准备来介绍这三个工具类. Semaphore Semaphore中文意思为: 信号量. 它主要用来维护一组有限的资源. 比如数据库连接, Socket连接. 信号量的使用方式很简单, 在构造函数中, 传入你需要维护的有限资源的数量, 每次

0

ReentrantLock和ReentrantReadWriteLock详解

ReentrantLock和ReentrantReadWriteLock是Java并发包中提供的锁, 他们都属于可重入锁.但是ReentrantLock是一种悲观锁, 它总是假设竞争条件总是会发生, 所以它同一时刻只能有一个线程获得锁, 而ReentrantReadWriteLock是属于乐观锁, 它假设竞争条件并不会经常发生, 所以同一时刻能让多个线程执行. 他们的一个共同点是: 都支持公平和

0

AbstractQueuedSynchronizer中的ConditionObject剖析

AbstractQueuedSynchronizer中的ConditionObject剖析 在多线程环境中, 有时候, 一个线程的执行是需要等待一个条件发生后才能执行的. 在经典的生产者和消费者模式中, 如果缓冲区满后, 生产者是不能向缓冲区投放item的, 它需要等待一个条件: 缓冲区不为满的状态. 同理, 如果缓冲区为空时, 消费者是不能消费item的, 它需要等待一个条件: 缓冲区不为空.

0

AbstractQueuedSynchronizer剖析

AbstractQueuedSynchronizer剖析在介绍AbstractQueuedSynchronizer(下面称AQS)前, 我们先来看看一个不安全的锁, 然后引出构建安全锁需要处理哪些情况. 123456789101112131415161718typedef struct lock_t { int flag;} lock_t;void init(lock_

0

深入理解Java集合框架-WeakHashMap, IdentityHashMap 和 HashTable

WeakHashMap WeakHashMap总体实现和HashMap差不多, 不同的时, WeakHashMap中的Key是弱引用类型, WeakHashMap内部的Key是会被自动回收的. 另外需要关注的是, WeakHashMap并没有向HashMap那样, 在1.8做了优化. 弱引用Key 123456789101112131415161718192021222324252627282

0

java基础

字符串使用+连接字符串 使用+连接字符串每次都会构建一个新的对象,在需要频繁拼接字符串的场景时,会比较耗时和浪费空间,因为String创建后就不可以再改变,因此+ 操作是线程安全的 StringBuilder 该类可以解决String拼接字符串时出现的问题,但是StringBuilder线程不安全。 StringBuffer StringBuilder可以保证线程安全,但是也因此效率变得低 总结 如果只需要简单的拼接字符串的话,可以直接使用+号拼接 如果需要频繁拼接而且无需考虑线程安全的,可以使用StringBuilder 如果需要频繁拼接但要考虑到线程安全的话,可以使用StringBuffer

0

Java内存分配与回收策略

内存分配与回收策略目录 对象优先在Eden分配 大对象直接进入老年代 长期存活对象将进入老年代 动态对象年龄判定 空间分配担保 对象优先在Eden分配 大多数情况下, 对象主要分配在新生代的Eden区上. 当Eden区没有足够的空间进行分配时, 虚拟机将进行一次 Minor GC 大对象直接进入老年代 大对象指的是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组.

0

Java内存区域

Java内存区域目录 运行时数据区 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 运行时数据区 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理

0

深入理解Java集合框架-set家族

Set集合的最大特点是能够保证内部的元素唯一性. 这种特性是建立在Map的基础上的. 换句话说: Set通过组合的模式, 在Map的基础上扩展了一些特性. 由于Set是建立在Map的基础上的. 如果理解了Map的话, Set会很好理解. 接下来我们来看看Set家族的UML UML Set接口对应Map接口, 定义了Set的一些方法. AbstractSet对应AbstractMap, 为Set

0

深入理解Java集合框架-TreeMap

这次要介绍的Map跟之前介绍的Map有点不一样. 之前的Map, 例如: HashMap, LinkedHashMap都是基于散列技术. 而这次要介绍的TreeMap则不同, TreeMap是基于一种叫红黑树的数据结构. 接下来, 我们先看看TreeMap的UML图片 UML 跟之前介绍过的Map一样, TreeMap实现了Cloneable和Serializable, 因此它支持克隆(浅克隆

0

深入理解Java集合框架-LinkHashMap

上篇我们分析了HashMap, 知道了遍历HashMap时, 顺序是不能够保证的.如果遍历时需要顺序, 那么应该用LinkedHashMap, 也就是我们这次要来分析的另外一个集合类. UML 从UML图来看, LinkedHashMap的继承于HashMap, 可见LinkedHashMap是基于HashMap来扩展的. 如果理解了HashMap的话, 那LinkedHashMap应该算是很

0

深入理解Java集合框架-LinkedList

上篇文章中我们学了ArrayList, 知道了ArrayList比较适合需要频繁访问元素的场景. 但是在插入和删除元素时, 表现得效率低下. 这次, 我们来分析适合使用在频繁插入和删除元素的场景的集合: LinkedList. UML 我们先来看看UML图, LinkedList在继承关系上, 跟ArrayList基本相同. 我们这里只分析不同点. LinkedList继承AbstractS

0

深入理解Java集合框架-ArrayList

UML 从上面的UML图, 我们可以看出 ArrayList实现了三个标记接口, 他们分别是:RandomAccess, Serializable, Cloneable. RandomAccess接口表示ArrayList支持随机访问其中的元素, 也就是ArrayList可以随机访问其中的元素, 并且时间复杂度为O(1). Serializable接口表示ArrayList可以被序列化. Cl