2020.1.14学习任务

 

(一)Arraylist与LinkedList区别


答:1.ArrayLi是实现了基本的动态数组的数据结构 LinkedList基于链表的数据结构
(LinkedList是双向链表,有next也有previous)
2.对于随机访问的get和set,ArrayList优于LinkedList,因为LinnkedList要移动指

3.对于新增和删除操作add和remove,LinkedList占优势,因为ArrayList要移动数据

ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(reference)。


(二)Collections.sort和Arrays.sort的实现原理


1.Collections.sort方法底层就是调用的array.sort方法.
2.Colletions.sort(list) 与 Arrays.sort(T[]) Colletions.sort()实际会将
list转为数组,然后调用Arrays.sort(),排完了再转回List。
3.底层实现都是用TimSort实现的


(三)List 和 Set,Map 的区别


1.List和set是实现了collection接口
2.list可以可以允许重复的对象。可以插入对个null元素,保持了每个元素的插入顺序
,输出的顺序就是插入的顺序。Set不允许重复对象,无序容器,你无法保证每个元素的
存储顺序,TreeSet通过Comparator或者Comparable维护了一个排序顺序,只允许一个
null元素。
3.Map不是collection的子接口或者实现类。Map的每个Entry都有两个对象,也就是一
个健一个值,map可能会持有此昂通的值对象但健对象必须是唯一的。TreeMap也通过
Comparator或者Comparable维护了一个排序书序,Map里你可以拥有随意个Null值但最
多只能有一个Null空键

(四)poll()方法和 remove()方法的区别?


poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时
候会返回空,但是 remove() 失败的时候会抛出异常


(五)HashMap,HashTable,ConcurrentHash的共同点和区别


一、区别

HashTable

 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方
式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
初始size为11,扩容:newsize = olesize*2+1
计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length


HashMap


底层数组+链表实现,可以存储null键和null值,线程不安全
初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入
,就会产生无效扩容)
当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配
更均匀
计算index方法:index = hash & (tab.length – 1)

HashMap的初始值还要考虑加载因子: 哈希冲突,哈希因子 空间换时间

ConcurrentHashMap


底层采用分段的数组+链表实现,线程安全
通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提
升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取
到最新的值。)
Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术
有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不
仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁
扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个
Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容

相同点

:Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于
Dictionary抽象类的


(六)写一段代码在遍历 ArrayList 时移除一个元素

  ArrayList array = new ArrayList();
        array.add(1);
        array.add(2);
        array.remove(1);
        System.out.println(array);


(七)Java中怎么打印数组?


1.直接打印

int[] a = {1,2,3};
        System.out.println(Arrays.toString(a));
2.通过for循环打印

        int[] a = {1,2,3};
        for (int i = 0; i <a.length ; i++) {
            System.out.println(a[i]);
        }

(八)HashSet是如何保证不重复的
   
查看HashSet类中的add()方法

 1.    
        HashSet ss = new HashSet();
        ss.add()

2. public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
3.public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
4.public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals
(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

  5. 如果hash码值不相同,说明是一个新元素,存;

如果没有元素和传入对象(也就是add的元素)的hash值相等,那么就认为这个元素在
table中不存在,将其添加进table;

6.如果hash码值相同,且equles判断相等,说明元素已经存在,不存;

7.如果hash码值相同,且equles判断不相等,说明元素不存在,存;

8.如果有元素和传入对象的hash值相等,那么,继续进行equles()判断,如果仍然相等
,那么就认为传入元素已经存在,不再添加,结束,否则仍然添加;


(九)ArrayList 和 Vector 的区别是什么?


一:相同点
ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随
机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能
力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入
或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和
遍历,不适合插入和删除。
Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一
时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需
要很高的花费,因此,访问它比访问ArrayList慢。
二:区别
LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历
速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾
元素,可以当作堆栈、队列和双向队列使用。
vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而
Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全
因素,一般用Arraylist效率比较高。

总结 ListList增删快  ArrayList查询快


(十)Collection与Collections的区别是什么?


1.Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
2、Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的
搜索、排序、线程安全化等操作。

(十一)如何决定使用 HashMap 还是TreeMap?


TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap
默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或
自定义顺序遍历键(key)。

HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数
据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。

如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序
是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我
们会使用HashMap。


(十二)如何实现数组和 List之间的转换?


数组转List

    String[] strs = new String[] {"aaa", "bbb", "ccc"};
    List<String> list = Arrays.asList(strs);
    for (String s : list) {
        System.out.println(s);
    }


List转数组

List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}

(十三)迭代器 Iterator 是什么?怎么用,有什么特点?


Iterator 和
ListIterator 有什么区别?
1:
用于顺序访问集合对象的元素,无需知道集合对象的底层实现。Iterator 是可以遍历
集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,
从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

2:

List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}


Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候
,就会抛出 ConcurrentModificationException 异常。
3:
1.Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
2.Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
3.ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个
元素、替换一个元素、获取前面或后面元素的索引位置。
4.ListIterator 可以使用set()方法替换它访问过的最后一个元素.
5.ListIterator 可以使用add()方法在next()方法返回的元素之前或previous()方法
返回的元素之后插入一个元素.


(十四)Java 中的 LinkedList是单向链表还是双向链表?

双链的


(十五)说一说ArrayList 的扩容机制吧


ArrayList的默认大小
我们如何对一组对象进
行排序?

通过add方法添加

通过 
 

List a = new ArrayList();
        a.add(1);
        Collections.sort(a, new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });


这种方法来实现 

(十六)Array 和 ArrayList 有何区别?


Array数组的定义方式
int[] array = new int[3];
ArrayList的定义 方式
 ArrayList b = new ArrayList();

定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数
固定并且类型相同。
ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不
同类型元素


(十七)HashSet和TreeSet有什么区别?


hashSet:
内部的数据结构是哈希表,是线程不安全的。如果对象的hashCode值不同,则不用判断
equals方法,就直接存到HashSet中。 如果对象的hashCode值相同,需要用equals方
法进行比较,如果结果为true,则视为相同元素,不存,如果结果为false,视为不同
元素,进行存储。
TreeSet:
 是线程 可以对Set集合中的元素排序。
对元素排序
元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo
方法。
元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值