[TOC]
1、基础知识
-
StringBuilder String StringBuffer的区别,String为啥不可变
- 可变性
- String 源码实现的时候使用了final修饰 private final char value[]
- String buffer StringBuilder 都是AbstractStringBuilder类,这个类没有final修饰
- 安全性
- String对象不可变,常量,安全
- StringBuilder对方法加了同步锁,对调用方法加了同步锁,安全
- 没有加同步锁,并不安全
- 性能
- 每次对StringBuilder本身操作,不生成新的对象改变对象引用,所以Builder比Buffer仅仅多获得了10% 的性能提升,但是却有多线程不安全的风险
- 结论:
- 数据少的时候直接String
- 数据多的时候,单线程,就是Stringbuilder
- 多线程,StringBuilder
- 可变性
-
== 与equal
- equal:没有覆盖equal()方法的,等价于
==
比较这两个对象 - 覆盖了equals方法的时候,一般我们都覆盖这个方法来比较两个对象内容相等
- String中的equal重写过,Object中的方法比较的是内存地址,String比较的是两个值
- equal:没有覆盖equal()方法的,等价于
-
final
- final变量:基本数据类型,初始化之后不能修改,引用类的变量,地址值就不能修改
- final类:不能被继承,所有的方法都默认变成final方法
- final方法:方法锁定,防止任何继承类修改它,效率,private都隐式的将方法指定成final
-
finally不会被执行的情况
- 在finally语句块中发生了异常
- 前面的代码中使用了System.exit();
- 线程死亡
- CPU结束
-
接口和抽象类的区别
接口默认方法都是pinlic 所有的方法在接口中不能实现,java8之后可以有默认实现抽象类可以有飞抽象的方法
接口中的实例变量默认都是final类型的,抽象类不一定
一个类可以实现多个接口,但是最多只能实现一个抽象类
一个类实现接口的话,要实现接口所有的接口,抽象类不一定
-
接口不能用new实例化,但是可以申明。
- 抽象是类的抽象,一种模板设计
- 接口是行为抽象,一种行为规范
jdk8中,接口定义静态方法,接口名调用。
如果同时实现了两个接口,接口中一定要重写,不然会报错。
2. Java集合框架
- Arraylist 的LinkedList
- 是否保证线程安全:ArrayList LinkedList 不同步的,不保证线程安全
- 数据结果:Arraylist Object数组,LinkedList 双向链表数据结构,1.6之前是循环链表,1.7取消了循环
- 插入和删除元素:ArrayList 数组,增删时间复杂度受元素位置的影响。LinkedList受时间复杂度都是O(1)
- ArrayList支持搞笑随机元素访问,LinkedList不支持
- 内存占用:list列表结尾会预留一定的容量空间,LinkedList每一个元素消耗都多与ArrayList
- ArrayList与Vector区别
- Vector是同步的,两个线程安全的访问衣蛾Vector对象,但是一个线程访问的话,代码时间可能会比较长。
- HashMap
- 1.8之前:数组和链表结合在一起 形成链表散列
- 1.8之后:解决哈希冲突的时候,当链表长度大于阈值,就会将链表转化为红黑树,减少搜索时间。
- HashMap HashTable
- x线程安全 ,Map是不安全的,table是安全的。table所有的方法都经过synchronized修饰。ConcurrentHashMap线程也是安全的,推荐用这个 ,如果有需求的话
- 效率,因为线程安全的问题,HashMap比HashTable效率高。HashTable被淘汰了不要用
- 初始大小,hashMap初始大小默认是11,每次扩充,容量就是2n+1
- HashMap /HashSet
- HashSet的底层是HashMap实现的
- HashSet 的值存放于HashMap的key中,所以不能重复
- ConcurrenthashMap Hashtable
- 数据结构:
- ConcurtenthashMap 1.7以前分段数组+链表 实现,1.8数据结构和hashMap1,8一样,数组+红黑
- table he 1.8以前的hashMap的底层数据结构类似,都是采用数组+链表的形式。数组是HashMap的主体,链表是为了解决冲突存在的
- 线程安全:
- 1.7之前ConcurrentHashMap对整个数组进行了分割分段,没一把锁只锁容器的一部分,多线程访问不同的容器,就不会竞争,提高效率
- 1.8之后直接采用Node+链表+红黑树的数据结构实现。
- Hashtable 使用synchronized保证线程安全,功效底下。竞争可能会越来越大
- 数据结构: