1)常用的集合
Map接口和collection接口是所有集合框架的父接口。List以及Set接口继承于collection接口。
- Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
- Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
- List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
2)Array和ArrayList的区别
1.Array是数组,可容纳基本数据类型和和对象,ArrayList是集合只能放置对象;
2.Array的长度是一定的,ArrayList的长度是动态的;
3.Array不能够随意添加和删除其中的项,而ArrayList可以在任意位置插入和删除项。
3)ArrayList和LinkeList的区别
1.ArrayList底层是数组,LinkeList底层在JDK1.7之前是双向循环链表,之后是双向链表;
2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
(LinkeList查找元素时先判断位于前半部分还是后半部分,再决定表头往后遍历还是表头往前遍历)
4)HashMap与Hashtable的区别
1.HashMap是线程不安全的,而Hashtable每个方法都使用了synchronized关键字,是线程安全的;
2.作者不同(哈哈哈);
3.Hashtable既不支持Null key也不支持Null value,而HashMap中null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null;
4.Hashtable不符合驼峰命名(0.0)
5.Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
4)HashMap不安全的情况
1.在jdk1.7中(头插法),在多线程环境下,扩容时会造成环形链或数据丢失。
2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。
5)如果想使用线程安全的HashMap该如何做?
答:1.Collections 工具类中 synchronizedCollection
2.采用装饰者模式实现map接口对HashMap进行封装。
3. ConcurrentHashMap 这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每个版本的实现方式也不一样,在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。
6)ConcurrentHashMap
1.JDK1.7采用的是分段锁,(默认16个分段)Segment继承ReentrantLock锁,用于存放HashEntry[],加锁
2.JDK1.8之后使用的是数组+链表+红黑树的方式实现,而加锁则采用CASCAS(Compare And Swap,比较交换,乐观锁)和synchronized(悲观锁,非公平)实现。
7)HashMap的get,put
get方法
1.利用key找到数组中的index,其实就是如果这个key有数据,那它会在数组中哪个开头的链表或者树上。
2.如果这个index上的头为空,那就是没有;如果只有一个头,但和它和key不相等,那也没有;如果不止一个头,说明是链表或者树,根据first instanceof TreeNode来判断是不是树;
3.剩下的就是如果是链表就链表找,如果是树就树找,判断找到的条件是,地址一样或者equals
put方法
当put一对<key,value>时,先用hashCode() && equals() 判断key是否重:
如果hashCode()为true,则会用hashCode判断在相应的位置插入key,如果这个判断的位置已经有了值了,则会调用equals()去判断是否重复,equals()为true则视为key重复,插入后放回久值,若equals()为false则认为不重复,以链的形式插入。
8)Java中HashMap的key值要是为类对象,则该类需要满足什么条件?
需要重写equals()和hashCode()方法
9)Compatable和Comparator的区别
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。
今天打球打得有点久累死了不写了以后再补,写一题睡觉
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
int[][] dp = new int[num.length][size];//dp[i][j]表示i为尾结点,前j+1个的最大值
ArrayList<Integer> list = new ArrayList<Integer>();
if(size == 0)//特判
return list;
for(int i = 0; i < num.length; i++){//dp[i][0]只有i这个数,肯定是num[i]了
dp[i][0] = num[i];
}
//上面没有归为下面是为了排除负数的情况
for(int i = 1;i < size; i++){
for(int j = i; j < num.length; j++){
dp[j][i] = Math.max(dp[j-1][i-1],num[j]);
}
}
for(int i = size - 1; i < num.length; i++){
list.add(dp[i][size-1]);
}
return list;
}
}
不行,再写一题
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
public class Solution {
int w = 0;
TreeNode KthNode(TreeNode pRoot, int k){
if(pRoot == null)
return null;
TreeNode node = KthNode(pRoot.left, k);
if(node != null){
return node;
}
w++;
if(k == w){
return pRoot;
}
node = KthNode(pRoot.right, k);
return node;
}
}