分类:: Java
深入理解Java集合-HashMap
前两篇文章分别介绍了ArrayList和LinkedList, 这次我们来分析另外一个key-value键值对的映射集合-HashMap.按照前面的习惯,我们先来看看HashMap的UML UML HashMap实现了Cloneable, Serializable, 所以HashMap支持克隆(浅克隆)和序列化. Map接口提供了一系列接口和三个视图. AbstractMap则是实现了Map接
Java注解处理器实战
注解处理器 注解强大的地方在于: 我们可以在运行时或者编译时处理注解. 在编译时或者运行时处理注解的机制都可以称为一个注解处理器. 注解处理器的类型 注解处理器的类型分为两大类: 运行时处理器: 这种机制是在程序运行时利用反射机制去处理注解. 编译时处理器: 这种机制是在程序编译时利用javac提供的一个apt工具来处理注解. 运行时处理器的特点: 该机制基于反射机制, 因此灵活性很
J.U.C中的并发工具类
在Java的J.U.C包中提供了几个并发编程中非常有用工具类, 例如: Semaphore, CountDownLatch和CyclicBarrier. 这次准备来介绍这三个工具类. Semaphore Semaphore中文意思为: 信号量. 它主要用来维护一组有限的资源. 比如数据库连接, Socket连接. 信号量的使用方式很简单, 在构造函数中, 传入你需要维护的有限资源的数量, 每次
ReentrantLock和ReentrantReadWriteLock详解
ReentrantLock和ReentrantReadWriteLock是Java并发包中提供的锁, 他们都属于可重入锁.但是ReentrantLock是一种悲观锁, 它总是假设竞争条件总是会发生, 所以它同一时刻只能有一个线程获得锁, 而ReentrantReadWriteLock是属于乐观锁, 它假设竞争条件并不会经常发生, 所以同一时刻能让多个线程执行. 他们的一个共同点是: 都支持公平和
AbstractQueuedSynchronizer中的ConditionObject剖析
AbstractQueuedSynchronizer中的ConditionObject剖析 在多线程环境中, 有时候, 一个线程的执行是需要等待一个条件发生后才能执行的. 在经典的生产者和消费者模式中, 如果缓冲区满后, 生产者是不能向缓冲区投放item的, 它需要等待一个条件: 缓冲区不为满的状态. 同理, 如果缓冲区为空时, 消费者是不能消费item的, 它需要等待一个条件: 缓冲区不为空.
AbstractQueuedSynchronizer剖析
AbstractQueuedSynchronizer剖析在介绍AbstractQueuedSynchronizer(下面称AQS)前, 我们先来看看一个不安全的锁, 然后引出构建安全锁需要处理哪些情况. 123456789101112131415161718typedef struct lock_t { int flag;} lock_t;void init(lock_
深入理解Java集合框架-WeakHashMap, IdentityHashMap 和 HashTable
WeakHashMap WeakHashMap总体实现和HashMap差不多, 不同的时, WeakHashMap中的Key是弱引用类型, WeakHashMap内部的Key是会被自动回收的. 另外需要关注的是, WeakHashMap并没有向HashMap那样, 在1.8做了优化. 弱引用Key 123456789101112131415161718192021222324252627282
java基础
字符串使用+连接字符串 使用+连接字符串每次都会构建一个新的对象,在需要频繁拼接字符串的场景时,会比较耗时和浪费空间,因为String创建后就不可以再改变,因此+ 操作是线程安全的 StringBuilder 该类可以解决String拼接字符串时出现的问题,但是StringBuilder线程不安全。 StringBuffer StringBuilder可以保证线程安全,但是也因此效率变得低 总结 如果只需要简单的拼接字符串的话,可以直接使用+号拼接 如果需要频繁拼接而且无需考虑线程安全的,可以使用StringBuilder 如果需要频繁拼接但要考虑到线程安全的话,可以使用StringBuffer
Java内存分配与回收策略
内存分配与回收策略目录 对象优先在Eden分配 大对象直接进入老年代 长期存活对象将进入老年代 动态对象年龄判定 空间分配担保 对象优先在Eden分配 大多数情况下, 对象主要分配在新生代的Eden区上. 当Eden区没有足够的空间进行分配时, 虚拟机将进行一次 Minor GC 大对象直接进入老年代 大对象指的是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组.
深入理解Java集合框架-set家族
Set集合的最大特点是能够保证内部的元素唯一性. 这种特性是建立在Map的基础上的. 换句话说: Set通过组合的模式, 在Map的基础上扩展了一些特性. 由于Set是建立在Map的基础上的. 如果理解了Map的话, Set会很好理解. 接下来我们来看看Set家族的UML UML Set接口对应Map接口, 定义了Set的一些方法. AbstractSet对应AbstractMap, 为Set
深入理解Java集合框架-TreeMap
这次要介绍的Map跟之前介绍的Map有点不一样. 之前的Map, 例如: HashMap, LinkedHashMap都是基于散列技术. 而这次要介绍的TreeMap则不同, TreeMap是基于一种叫红黑树的数据结构. 接下来, 我们先看看TreeMap的UML图片 UML 跟之前介绍过的Map一样, TreeMap实现了Cloneable和Serializable, 因此它支持克隆(浅克隆
深入理解Java集合框架-LinkHashMap
上篇我们分析了HashMap, 知道了遍历HashMap时, 顺序是不能够保证的.如果遍历时需要顺序, 那么应该用LinkedHashMap, 也就是我们这次要来分析的另外一个集合类. UML 从UML图来看, LinkedHashMap的继承于HashMap, 可见LinkedHashMap是基于HashMap来扩展的. 如果理解了HashMap的话, 那LinkedHashMap应该算是很
深入理解Java集合框架-LinkedList
上篇文章中我们学了ArrayList, 知道了ArrayList比较适合需要频繁访问元素的场景. 但是在插入和删除元素时, 表现得效率低下. 这次, 我们来分析适合使用在频繁插入和删除元素的场景的集合: LinkedList. UML 我们先来看看UML图, LinkedList在继承关系上, 跟ArrayList基本相同. 我们这里只分析不同点. LinkedList继承AbstractS
深入理解Java集合框架-ArrayList
UML 从上面的UML图, 我们可以看出 ArrayList实现了三个标记接口, 他们分别是:RandomAccess, Serializable, Cloneable. RandomAccess接口表示ArrayList支持随机访问其中的元素, 也就是ArrayList可以随机访问其中的元素, 并且时间复杂度为O(1). Serializable接口表示ArrayList可以被序列化. Cl