TreeSet
TreeSetTreeSet 约等于 TreeMap 12public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。 TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。 TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。 TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。 TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。 排...
CopyOnWriteArrayList
CopyOnWriteArrayList复合操作需要程序自己控制线程安全 特性12public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { 特性基本与arrayList一致,底层也是数组结构 基本属性12345private static final long serialVersionUID = 8673264195747942595L;//序列化版本号//全局锁final transient ReentrantLock lock = new ReentrantLock();//存储数据的数组private transient volatile Object[] array; 构造器123456789101112131415161718192021public CopyOnWriteArrayList() { setArray(new Object[0]);//创建一个...
LinkedList
LinkedList特性12public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable 1、继承于 AbstractSequentialList ,本质上面与继承 AbstractList 没有什么区别,AbstractSequentialList 完善了 AbstractList 中没有实现的方法。 2、Serializable:成员变量 Node 使用 transient 修饰,通过重写read/writeObject 方法实现序列化。 3、Cloneable:重写clone()方法,通过创建新的LinkedList 对象,遍历拷贝数据进行对象拷贝。 4、Deque:实现了Collection 大家庭中的队列接口,说明他拥有作为双端队列的功能。 LinkedList与ArrayList最大的区别就是LinkedList中实现了C...
Vector
Vector12345public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector中的操作是线程安全的。 Vector加synchronized锁后真的是线程安全?不是,因为锁的是方法,锁的粒度不一定是线程安全的。 复合操作需要程序自己控制线程安全 与ArrayList不同的地方: 所有方法都加了synchronized关键字 Vector没有空数组的设计 123ArrayList:private static final Object[] EMPTY_ELEMENTDATA = {};private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 扩容因子不一样,Vector的扩容因子是2,ArrayList的扩容因...
ArrayList
ArrayListArrayList是线程不安全的 ArrayList和LinkedList对比? ArrayList底层是数组,查找快 LinkedList底层是链表,插入快 特性实现了三个标记接口:RandomAccess, Cloneable, java.io.Serializable,它们内部都没有方法和属性 123public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 1、RandomAccess支持随机访问(基于下标),为了能够更好地判断集合是ArrayList还是LinkedList,从而能够更好选择更优的遍历方式,提高性能! RandmoAccess是java中用来被List实现,为List提供快速访问功能的。我们即可以通过元素的序号(下标)快速获取元素对象;这就是快速随机访问。 实现了RandomAccess的标记接口,支持基于下标的...
编译调试openjdk8
编译openjdk8编译环境 操作系统:Ubuntu16 boot jdk:jdk7(我用的是openjdk7) 编译的jdk:openjdk8 看源码工具:Clion 下载地址: ubuntuopenjdk1.7openjdk1.8openjdk1.8源代码 以下编译openjdk的步骤只是其中之一。openjdk 解压后目录下有一个README-builds.html文件,该文件是官方提供的构建步骤,每个环境都有,请大家参考。 构建编译环境 因为OpenJDK的各个组成部分有的是使用C++编译,有的是使用Java自身实现的,比如调试工具:jps、jstat等,还有一些核心jar包,如rt.jar、tools.jar等。所以编译这些Java代码需要一个可用的JDK,官方称这个JDK为“Bootstrap JDK”,所以boot jdk需要比你编译的jdk版本低,因此需要安装jdk1.7。 1.安装启动jdk1.7 123456789101112131415161718192021222324252627# 下载的jdk1.7文件:openjdk-7u75-b13-linux...
JVM之Klass模型
Klass模型补充: OOP-Klass模型 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象。而 Klass 则包含元数据和方法信息,用来描述Java类。 klass是类 oop klass是类的内存地址(指针) Klass :包含元数据和方法信息,用来描述Java类。 class 和 klass区别: class:Java类,Java代码 klass:Java类在JVM的存在形式,c++代码 在JDK8中,Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…… klass模型类的继承结构: 从继承关系上也能看出来,类的元信息是存储在原空间的。 普通的Java类在JVM中对应的是instanceKlass类的实例,再来说下它的三个字类 InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取到的Class对象,实际上就是这个C++类的实例,存储在堆区,学名镜像类 Inst...
JVM之类加载的过程
类加载的过程类的生命周期是由7个阶段组成,但是类的加载说的是前5个阶段 加载1、通过类的全限定名获取存储该类的class文件(没有指明必须从哪获取) 2、解析成运行时数据,即instanceKlass实例,存放在方法区 3、在堆区生成该类的Class对象,即instanceMirrorKlass实例 就是说你可以改写openjdk源码,你写的程序能达到这三个效果即可 JVM 是懒加载模式 lazy loading 何时加载? 主动使用时: 1、new、getstatic、putstatic、invokestatic 2、反射 3、初始化一个类的子类会去加载其父类 4、启动类(main函数所在类) 5、当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果是REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化 预加载:包装类、String、Thread 从哪加载? 因为没有指明必须从哪获取class文...
Java8特性之Optional类使用
前言这周写代码遇到了一个很大的bug,怪自己学艺不精,无法认清of方法和ofNullable方法的使用,用错了这两个方法。出现了空指针异常。在这里必须记录一下该两个方法的区别。 简介Optional类为了解决NullPointerException(NPE)问题,减少代码中的判空,实现函数式编程,给工程师们提供函数式的API。 我们平时在编码的时候需要不断的判断对象是否为空来做大量的处理,如: 123456789101112public void errorNullStyle(User user){ if(user != null){ Address address = user.getAddress(); if(address != null){ City city = address.getCity(); if(city != null && "".equals(city)){ // do so...
栈和队列
栈栈定义栈(stack )又称堆栈,它是运算受限的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。 表中进行插入、删除操作的一端称为栈顶(top) ,栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底(bottom) 当栈中没有数据元素时称为空栈;向一个栈插入元素又称为 进栈或 入栈;从一个栈中删除元素又称为 出栈或 退栈。由于栈的插入和删除操作仅在栈顶进行,后进栈的元素必定先出栈,所以又把堆栈称为 后进先出表(Last In First Out,简称LIFO) 12345678910111213141516171819栈接口,定义了栈的主要操作记住针对栈的专业词汇:push、pop、peekpublic interface Stack { // 返回堆栈的大小 public int getSize(); // 判断堆栈是否为空 public boolean isEmpty(); // 数据元素 e 入栈 public void push(Object e); // 栈顶元素出栈 public Object...