20201017 王维

学习总结

数组是一个特殊的类,可以使用Object类作为容器保存数组的引用

类实例化的过程(对象的创建过程)

new 构造函数() 对象的时候,首先执行 new 。虚拟机发现方法区中并没有该类的信息, 就会先去加载该类,在加载的时候发现该类有父类( Java 中除了 java.lang.Object 没有父类,其他 类都会有父类)即 SuperClass ,则会先加载该类的父类( SuperClass ),然后进行父类类( static )变 量的初始化(包括准备阶段的默认初始化( 零值 )和初始化阶段的显示初始化( clinit 也就是 static 初始化或者说是 static 块)。然后进行子类类( static )变量的初始化,类变量初始化完毕。 接着进行对象的创建,进入子类构造函数( SubClass() ),在子类构造函数第一行会调用递归父类 构造函数( SuperClass ),进入父类构造函数之前会先进行父类实例变量初始化,即给非静态成员变量 初始化(实例初始化)并运行代码块,然后进入父类构造函数执行,当运行父类实例方法时发现子类对其进 行了覆盖,那么运行子类的实例方法,由于子类还没有进行实例变量的显示初始化,只能使用实例变量的默认值 ,父类构造函数运行结束返回到子类构造函数,此时先会进行子类实例变量的显示初始化(实例初始 化),运行了子类代码块,接着运行子类构造函数,接着运行实例方法,这时子类实例变量都进行了显 示初始化,输出 初始化值。

StringBuffer 和 StringBuilder 的区别是什么?

相同点:
StringBuffer和StringBuilder表示的字符串对象可以直接进行修改
StringBuffer和StringBuilder有公共父类AbstractStringBuilder
不同点:
a) 是否线程安全
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问),StringBuffer是线程安全的。只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
b) 应用场景
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
append方法与直接使用+串联相比,减少常量池的浪费。

ArrayList、Vector和LinkedList的异同

相同点:

  • 他们都是List接口的实现类
  • 他们都是序、可排序、可重复的集合,都可以存null
  • 他们都支持迭代操作

不同点:

1 实现接口不同:ArrayList和Vector没有实现Dque接口,不支持队列的栈操作;LinkedList实现了Deque接口,支持队列操作,同时支持栈操作

2 内部实现不同:ArrayList和Vertor内部是通过数组实现的。像数组一样,它包含可以使用整数索引访问的组件。 Linked内部是通过链表的方式实现的,随机添加和删除非尾部元素不会导致后面所有元素的移动。

3 线程安全:ArrayList、LinkedList非线程安全,Vector线程安全

4 扩容方式:ArrayList默认容量为10 ,1.5倍扩容,构造函数初始化时数组为null,增加第一个元素时赋值为默认容量;Vector默认容量为10,固定增长扩容,即使用出入倍数扩容,没有传入则2倍扩容;LinkedList内部使用链表实现,不扩容

5 增删效率:ArrayList和Vector使用数组实现,除了在尾部增删外,其他位置会影响后面的元素,效率低。LinkedList使用链表实现,不影响后面元素,效率高。

6 是否支持随机访问:ArrayList和Vector使用数组实现,支持随机访问;LinkedList使用链表实现,不支持随机访问

TreeMap、HashMap和HashTable的区别,并简述LInkedHashMap

相同:

都实现了Map接口,存储的都是键值对,都无序,不可重复,不直接支持迭代器操作

不同:

1 内部实现不同:TreeMap采用红黑树实现;HashTable采用数组+链表实现;HashMap采用数组+链表实现,Java8后采用数组+链表+红黑树实现,在总元素数量大于64时,链表长度大于8转换为红黑树,红黑树元素数量小于6转为链表。

2 扩容方式:TreeMap采用红黑树实现,不扩容;HashTable默认数组长度为11,采用2倍+1扩容;HashMap默认数组长度为16,采用2倍扩容

3 线程安全:TreeMap和HashMap非线程安全,HashTable线程安全

4 能否存null:TreeMap不可以存null键,可以存null值;HashTable允许存null键和值;HashMap不允许存null键和值

LinkedHashMap内部采用数组和双向链表实现,具有可以预测的顺序(插入顺序或访问顺序,默认为false插入顺序)

心得体会

今天进行了考试,知道了很多的不足,如关于数组是一个特殊的类,以前记得都是数组不是类,没有继承Object,那么就不能使用Object作为容器引用数组,但是今天知道这是可以的。

标签

评论

this is is footer