襄阳信息网站建设,公司网站设计需要多少钱,诸城网站建设公司,wordpress标签字段说明#xff1a;java本篇用于收集知识点方便随时巩固#xff0c;持续更新与纠错。数组关于JDK版本#xff0c;若无特殊说明#xff0c;默认为JDK 1.8,。缓存关于JVM版本#xff0c;若无特殊说明#xff0c;默认为 HotSpot。安全目录数据结构1、Java 基础1.1 Java中的基本…说明java本篇用于收集知识点方便随时巩固持续更新与纠错。数组关于JDK版本若无特殊说明默认为JDK 1.8,。缓存关于JVM版本若无特殊说明默认为 HotSpot。安全目录数据结构1、Java 基础1.1 Java中的基本数据类型有哪几种各占用多少字节答Java 中的基本数据类型有8种。其中数值型整数类型byte1字节8位有符号整数short2字节16位有符号整数int4字节32位有符号整数long8字节64位有符号整数浮点类型float4字节32位浮点数double8字节64位浮点数字符型char2字节16位Unicode字符布尔型boolean1字节8位1.2 String 在Java中是个特殊的存在谈谈答Sting类能够序列化。String实现了序列化接口因此是能够被序列化与反序列化的。String对象之间能够进行比较。实现了Comparable接口中的compareTo()方法因此字符串之间是能够进行比较的(是根据字符串中每一个字符的ASCII码进行比较)以下图源码。String类不能够被继承。由于String 是一个被final所修饰的类。String是不可变的。String类底层实际存储数据的是private final char value[]; 也就是说 String类底层维护的是一个字符序列。这个 char 类型数组被 final 所修饰因此一经建立就不可修改。String类重写了equals() 方法。先比较两个字符串的地址是否相同是则直接返回true若是地址不相同再看两个字符串内容是否相同是的话也返回true。String能够用字面量方式建立。String 是一个类与其余类不一样的是String可使用字面量的形式建立或赋值。String str 123;/*1 先到常量池去经过String的equals()方法去找是否存在字符串123若是存在直接将地址返回(这也保证了常量池中的字符串常量都是惟一的)。2 若是常量池中不存在123则先在常量池中建立一个123的字符序列而后再将其地址返回。*/String str new String(123);/*1 先到常量池去经过String的equals()方法去找是否存在字符串123若是不存在就在常量池中建立一个。(因此说在new字符串的时候若是常量池中不存在实际上会建立两次。)2 在堆中开辟空间建立一个Sting 对象并返回其地址。*/String常量存储在方法区中的常量池new出来的对象存储在堆内存中。字符串之间可使用 号拼接。拼接产生的结果是第三个字符串进行拼接的字符串自己是没有发生任何变化的。String 的本地方法 intern() 能够从常量池中获取字符串。若是常量池中没有就先建立再将其地址返回。1.3 谈谈 String、StringBuffer、StringBuilder 的异同。这三个类 都被 final 锁修饰不容许被继承。从线程安全的角度讲String 实例对象是不可变的字符串常量不存在线程安全问题即String是线程安全的。StringBuilder 没有使用锁机制在多线程并发的状况下可能会出现线程安全问题。StringBuffer 中涉及到修改底层数据的方法都加了 synchronized 关键字因此StringBuffer 是线程安全的。从对象可变性角度讲String 底层维护的是一个被final 锁修饰的字符数组不可变。StringBuffer 和 StringBuilder 底层维护的是一个可变的字符数组因此其对象实例是可变的。从频繁修改的性能角度String对象自己是不可变的对字符串修改其实是在产生新的对象所以修改效率低下。StringBuilder 底层维护的是一个可变的字符数组能够经过扩容等机制实现对字符序列的修改。所以修改效率较高。StringBuffer 底层维护的也是一个可变的字符数组但与StringBuilder不一样的是StringBuffer中的修改操做都被加了锁获取锁、释放锁、阻塞等因素致使了StringBuffer的性能方面可能会比StringBuilder低。在 JDK 1.6 以后对synchronized 进行了一些锁优化其中的“锁消除”优化会使得StringBuffer在某种绝对安全的状况下忽略方法上加的锁从而其性能会有所提高。其余方面StringBuffer 的 toString() 方法会对字符序列进行缓存以减小元素复制的开销而 StringBuilder 则是直接复制。从而从某种程度上说推荐使用StringBuffer。StringBuffer 与 StringBuilder 的初始容量、扩容机制等初始容量16扩容扩容至当前的两倍加2 int newCapacity value.length * 2 2;若是长度仍是不够那么实际须要多长就扩容至多长if (newCapacity - minimumCapacity 0)newCapacity minimumCapacity;1.4 ArrayList、Vector、LinkedList 的异同Vector底层存储数据的是Object类型的数组。new Vector() 时初始大小为10每次扩容至原来的两倍(能够设定增加因子capacityIncrement)是线程安全的优势底层数据结构是数组查找效率高。缺点插入、删除元素等操做效率低且因为是线程安全的因此较ArrayList来讲总体效率较低。ArrayList底层数据存储是Object类型的数组new ArrayList() 时底层数据指针指向一个空数组第一次添加元素时将数据指针指向长度为10的数组。每次扩容至原来的1.5倍是线程不安全的在多线程操做下可能抛出ConcurrentModificationException(并发修改异常)优势效率略高于 Vector 能够在单线程下使用。缺点线程不安全数组的缺点它都有。LinkedList双向链表底层存储的是 Node 类型的节点链表线程不安全可能会抛出ConcurrentModificationException优势插入、删除节点很容易缺点查找元素效率较前面两个低1.5 讲讲类的实例化过程当中静态变量、成员变量等的加载顺序一、父类静态变量二、父类静态代码块三、子类静态变量四、子类静态代码块五、父类成员变量六、父类构造代码块七、父类构造方法八、子类成员变量九、子类构造代码块十、子类构造方法代码验证public class Main {public static void main(String[] args) {Son son new Son();System.out.println();Son son2 new Son();}}class Parent{public static int a 1;private int aa 10;static {System.out.println(父类的静态代码块加载了在此以前静态变量a已经加载了a a);}{System.out.println(父类的构造代码块加载了在此以前成员变量aa已经加载了: aa aa);}public Parent() {System.out.println(父类的构造方法加载了);}}class Son extends Parent{public static int b 2;private int bb 20;public Son() {System.out.println(子类的构造方法加载了);}static {System.out.println(子类的静态代码块加载了在此以前静态变量b已经加载了b b);}{System.out.println(子类的构造代码块加载了(此处将【构造块】放在【构造函数】下面可是仍然是【构造块】先加载)在此以前成员变量bb已经加载了: bb bb);}}打印结果1.6 HashMap 你用过吗说说你对它的认识HashMap空参构造只初始化了负载因子(0.75)其余成员变量均为默认值。经常使用的有参构造方法 HashMap(int initialCapacity)是能够设置初始化大小的在大概知道须要多大的map时能够考虑使用这个构造方法。HashMap 扩容每次扩容至原来的2倍。使用空参构造建立的对象在第一次添加元素的时候才会初始化一个长度为16的Node类型的数组。链表转红黑树的时机链表长度大于8 数组长度大于64红黑树转链表的时机链表程度小于 6HashMap 容许空值做为键和值HashMap 是无序且键不重复的HashMap 线程不安全多线程操做下可能会抛出 ConcurrentModificationException未完待续。。。最后本文是我本身复习并积累的过程文中不免会有遗漏或不许确的地方如有大佬路过发现个人错误还请指正能够发送到个人邮箱yangxinhufoxfoxmail.com嫌麻烦就请在下方直接评论万分感谢