- 浏览: 17546 次
- 来自: ...
文章列表
引言
java对象的实例都存放在堆里,有的对象会频繁的创建和消亡,生命周期短,而另外一些对象则相当长寿。jvm按照寿命的长短将对象存放于不同的堆区里并采用不同的垃圾回收策略,最大限度的保证内存的需求和降低gc的消耗。
堆的分区
堆分为三个代,分别是青年代(Young)、老年代(Old)和永久代(Perm)。
青年代(Young)
顾名思义,青年代用来存放新创建和年轻的对象,何为年轻?年轻到什么程度?这得由垃圾回收器说了算,如果经过几次(默认是15次)垃圾回收后对象依然存活,垃圾回收器就认为该对象不再年轻,于是就把该对象转移到老年代。另外, ...
ArrayList定义
顾名思义,ArrayList是对List的一种数组实现,部分代码如下:
......
private transient Object[] elementData;
......
elementData即为ArrayList的底层数据存储。
ArrayList的扩容
ArrayList的默认容量是10,如下:
public ArrayList() {
this(10);
}
但当数据不断增加时,底层数组就要重构扩容了,如下:
public void ensureCapacity(int minCapacity) {
...
LinkedList定义
LinkedList是对List的一种链表实现,定义如下:
......
private transient Entry<E> header = new Entry<E>(null, null, null);
......
header是一个非常普通双向链表,以下是双向链表节点的部分属性:
E element;
Entry<E> next;
Entry<E> previous;
LinkedList上的增删和遍历操作都是双向链表上的一些常规操作,这里不再赘述。
HashSet定义
HashSet是在HashMap基础上实现的元素不重复的集合容器,定义如下:
......
private transient HashMap<E,Object> map;
......
其底层数据结构就是HashMap,数据以KEY的形式保存与map中。HashSet有如下三个构造函数:
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
...
多线程同步方式
线程之间的同步需要用到“锁”来保护代码,以保证对于共享数据进行有序化读写。java中锁又分为独占锁和读写锁。独占锁是一种公平锁,任何时刻,最多只有一个线程(读或写)进入被保护的代码块;读写锁是一种非公平锁,包含了读锁和写锁,允许共享读,但读写互斥、写写互斥。在读多写少的场合使用读写锁比使用独占锁效率要高得多。
java多线程同步方式有四种:join,synchronized,wait/notify,ReadWriteLock。后面的三种机制都需要用到锁。
join
挂起当前线程,待其他线程执行完毕后再恢复当前线程,力度非常粗,只用于一些特定场合,比如后 ...
多线程的目的
多线程有两个目的:
1、充分利用cpu资源
2、产生非阻塞
线程与进程的关系
进程是资源的分配单位,线程是CPU的调度单位。JVM启动后,一个JVM进程就启动了,该进程拥有自己的地址空间,并且该地址空间对进程内的所有线程都可见,线程按照时间片的方式竞争式分享CPU。
java线程的创建
1、继承Thread
2、实现Runnable
这两种方法本质上是一样,因为Thread实现了Runnable接口。
java线程的生命周期
1、创建,执行了new()之后,这时线程对象只是一个非常普通的java对象;
2、就绪,执行了st ...
java引用分类
java引用分为4类,强引用、软引用、弱引用和虚引用。这四种引用跟gc的行为密切相关,gc在垃圾回收时根据引用的类型会有所不同。
强引用
强引用我们用的最多,随便new一个实例,然后用一个引用指向该实例,这个引用就是强引用了。对于强引用指向的对象,在垃圾回收时绝不会回收,即使内存不足抛出OutOfMemoryError。
软引用
SoftReference
对于软引用指向的对象,如果该对象上没有其他强引用,在垃圾回收时gc尽量不回收改对象,但在内存不足时,gc则会优先保证内存而回收掉该对象。这一点看起来好像很符合缓存的特征,gc可以根据内存使用状 ...
TreeMap定义
与LinkedHashMap不同,TreeMap不是继承于HashMap,而是继承于AbstractMap,归根到底,TreeMap实现的不是hash算法,而是二叉树算法;底层的数据存储也不是数组,而是链表实现的二叉树。二叉树数据结构决定了该map是一个按key进行排序排序的map。定义如下:
......
private final Comparator<? super K> comparator;
private transient Entry<K,V> root = null;
private transient int modCo ...
LinkedHashMap定义
LinkedHashMap继承于HashMap,本身就是一个HashMap,只是增加了一个双向链表按顺序保存KEY。
......
private transient Entry<K,V> header;
private final boolean accessOrder;
......
属性accessOrder
accessOrder定义了双向链表中节点的排序方式:true表示按照访问顺序排序,即在map上每执行一次get(key),该key所对应的Entry节点在链表中向前移动一个节点, ...
在youku和pplive上看视频时,用户可以可以选择“标清”、“高清”或“超清”,原理比较好理解,对于同一个片子,在视频库存储着标清、高清和超清3个码率的版本,3个版本均按照时长切割成相同数量的数据片,用户选择高清时,播放器就加载对应时长上的高清片,选择超清时就加载对应时长上的超清片。这样一来用户就可以根据自己当前的网络状况和视频流畅性选择合适的视频播放模式。但即便是这样,MP4协议还是有他的美中不足:
1、智能程度不够,不能对网络状况进行自检测,然后自动切换到当前环境下的最高码率;
2、缓冲时间长,在视频开始时,播放器会选择尽可能高的码率,导致加载第一个视频片得时间长,缓冲慢。
...
HashMap的数据结构
HashMap的底层数据结构为数组+链表,数组的元素类型为Entry,Entry本身是一个链表结构。在HashMap中可以看到如下的实例变量:
transient Entry[] table;
该变量即定义了HashMap的数据存储。
HashMap的数据容量
HashMap有一个经常被忽略的构造函数:
public HashMap(int initialCapacity, float loadFactor)
参数initialCa ...