- StringBuffer与StringBuilder的区别:
StringBuffer线程安全,
StringBuilder线程不安全;
StringBuffer比StringBuilder多了sychronized修饰符。
重载:多个同名函数同时存在,具有不同的参数个数、类型;
重载的时候,方法名要一样,但是参数类型和个数不一样;返回值类型可以相同也可以不同。
不能以返回值类型作为重载函数的区分标准。
重写:父类与子类之间的多态性,对父类的函数进行重新定义。
子类函数的访问修饰权限不能少于父类的。
- List,Map,Set三个接口存取元素时,特点是:
List:以特定索引来存取元素,可以有重复元素。
Set:不能存放重复元素(用对象的equals()方法可区分元素是否重复);
Map:保存键值对(key-value),映射关系可以说一对一或多对一
Set和Map有基于哈希存储和排序树的两种实现。
基于哈希存储的理论上时间复杂度是O(1);
基于排序树的实现在插入或删除元素时会按照元素或元素的key构成排序树而达到排序和去重的效果。
- ArrayList,Vector,LinkedList的存储特性及区别:
ArrayList和Vector都是使用数组方式存储数据;允许直接按序号索引元素,但是插入元素要涉及数组元素移动等,因此索引数据快,而插入数据慢。
Vector中的方法添加了sychronized修饰,是线程安全的。
ArrayList,LinkedList是线程不安全的。
LinkedList:使用双向链表实现存储;索引数据时需要向前或向后遍历,但是插入数据快。
ArrayList和LinkedList的区别:二者都实现了List接口。
不同点:
ArrayList是基于索引的数组方式存储,以时间复杂度为O(1)对元素进行随机访问;
LinkedList是双向链表存储,其查找元素的事件复杂度为O(n);
LinkedList相对于ArrayList在插入、添加、删除时速度更快。
LinkedList比ArrayList更占内存,因为其为每个节点存储了两个引用。
二者都实现了Map接口;
不同:
HashMap是允许key value都是null;但HashTable不允许key value为null。
HashTable是同步的,线程安全。
而HashMap不是同步的,适合单线程环境。
ConcurrentHashMap类中包含两个静态内部类:HashEntry和Segment.
HashEntry用来封装映射表的key-value;
Segment用来充当锁;
每个Segment对象守护整个散列映射表的若干个桶。
每个桶是由若干个HashEntry对象链接起来的链表。
一个ConcurrentHashMap实例中包含由若干个segment对象组成的数组。
在HashEntry类中,key,hash,next域都被声明为final型。value域被声明为volatile型。
在ConcurrentHashMap中,在散列时如果发生“碰撞”,将采用“分离链接法”来处理“碰撞”:把“碰撞”的HashEntry对象链接成一个链表。由于HashEntry的next域为final型,所以新节点只能在链表的头部插入。【插入后的链表中节点的顺序和插入的顺序相反】
Segment类继承ReentrantLock类,从而使segment对象能充当锁。
TreeMap是一个有序的key-value集合。基于红黑树实现。该映射基于其key的自然顺序进行排序或根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。
TreeMap的特性:
1.根节点是黑色;
2.每个节点不是黑色就是红色;
3.每个叶子节点是黑色的;
4.如果一个节点是红色的,则其子节点必然是黑色的,
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树的插入、删除、遍历时间复杂度都为O(lgN),所以性能上低于哈希表。
红黑树是排序插入的,可以按照key的大小有序输出。
- concurrenthashmap有什么优势以及1.7和1.8区别:
concurrenthashmap线程是安全的;
在JDK1.7中采用segment+hashEntry的方式实现,lock加在segment上。
JDK1.7的size计算是先采用不加锁的方式,连续计算元素的个数,最多计算3此,如果前两次计算的结果相同则表示计算的元素个数是准确的。如果两次计算的结果不同,则给每个segment进行加锁,再进行计算一次元素的个数。
JDK1.8中采用node+CAS+sychronized保证并发安全进行实现。
JDK1.8张使用一个volatile类型的变量baseCount记录元素的个数,当插入数据或删除数据时,会通过addCount()方法更新baseCount,通过累加baseCount和CounterCell数组中的数量,即可得到元素的总个数。