java集合

1)常用的集合

Map接口和collection接口是所有集合框架的父接口。List以及Set接口继承于collection接口。

  1. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
  2. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
  3. 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;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值