zoukankan      html  css  js  c++  java
  • JAVA-数组或集合

      哈哈,今天我们来讲解一下有关于一些数组 或者是集合的知识点

      1.ArrayList,LinkedList,Vector的区别

        ArrayList,LinkedList,Vector都是实现List接口,但ArrayList,LinkedList不是同步的,

        而Vector是同步的,ArrayList是一个可改变大小的数组,当更多的元素加入到ArrayList中,

        其大小将会动态增长,内部元素可以直接通过get()与set()方法进行访问,因为ArrayList

        本质上是一个数组.

        Vector与ArrayList类似,但属于强同步类,这个是线程安全的,但是一般我们不使用Vector,

        因为如果在多线程之中,我们自己可以实现同步,当Vector与ArrayList更多元素添加进来会

        请求更大的空间,Vector每一次请求双倍空间,而ArrayList每一次对Size增长50%

        LinkedList是一个双链表,在添加和删除时比ArrayList具有更好的性能,但在get与set方面

        弱于ArrayList,在LinkedList中似有的内部类,private static class Entry{Object element;

        Entry next;Entry previous},则ArrayList的空间浪费主要体现在list列表的结尾预留一定的

        容量空间,而LinkedList的空间则体现在他的每一个元素都要消耗相当的空间

      2.String,StringBuffer与StringBuilder的区别

        String字符串的常量

        StringBuffer是字符串的变量(线程安全)

        StringBuilder字符串变量(非线程安全)

        String类中使用字符数组保存在字符串中,如下所示,因为"final"修饰符,所以知道对象不变

        private final char value[];

        StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder

        中也是使用字符数组保存字符串,如下所是,这两种对象都是可变的,char[] value;

        三者在执行速度方面的:StringBuilder>StringBuffer>String

        有一个特殊的例子

        String str = "This is only a"+ "simple"+"test" 

        StringBuffer buffer = new StringBuilder("This is only a").append("simple").append("tear")

        其实发现str的执行速度一点也不输给StringBuffer;但是其实是JVM一个把戏:

        Str = "This ia only a simple test",所以显得快,但是如果String a ="This is a only a",

        String b ="simple",String c="test",则str = a+b+c,则此时的速度就慢下来了 

      3.Map,Set,List,Queue,Stack的特点与用法

        Map:键值对存放,一对一的往里面存,而且保证键的唯一性

        Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的

        HashMap:底层是哈希表结构,可以存入null键null值,该集合是不同步的,除了非同步和允许使用

          null值,HashMap和HashTable没有多大的区别

        TreeMap:底层是二叉树数据结构线程不同步,可以用于Map集合的键进行排序(记住,这不是

          你按放入的顺序进行排序,而是系统的内部定义的排序方法,如按字符串进行排序)

        Set:集合里面是无序的(存入和取出顺序不一致),元素不可重复

        HashSet:底层数据是哈希表,线程是非同的

        TreeSet:可以对集合中元素进行排序,底行数据结构是二叉树

        Queue接口与List,Set同一级别,都是继承Collection接口,其中队列是一种数组结构,符合先进先出

      4.HshMap和HashTable的区别

        1.HashTable继承Dictionary,则HashTable中不允许存放key或value为null的值

         HashMap继承AbstractMap,则允许在ke或value存放null值

        2.HashTable中有一个contains(Object value),但是由于怕引起误会,则在HashMap中删除掉,则在

         HashMap与HashTable中共有的方法为containsKey和containsValue方法

        3.Hashtable支持同步,则可以直接运用于多线程,而HashMap不支持同步,不能直接用于多线程

      5.HashMap和ConcurrentHashMap的区别,HashMap的底层源码

        1.HashMap的key与value的值都可以为null,但是ConcurrentHashMap的value值不能为null,否则会

          报HullPointerException

        2.从JDK1.2起,就有了HashMap,但是HashMap不是线程安全的,因此多线程操作要格外小心,在JDK1.5

          中,给我们带来concurrent包,从此Map包也有安全的

         解释:ConcurrentHashMap具体是怎么样实现线程安全的呢?肯定不是每一个方法加synchronized,那么

         就变成了HashTable

         从ConcurrentHashMap代码中可以看出,他引入了一个"分段锁"的概念,具体可以理解为把一个大的Map

         分为N个小的HashTable,根据key.hashCode()来决定把key放入哪个HashTable,在ConcurrentHashMap

         中,就是把Map分为N个Segment,put,get的时候,都是根据key.hashCode()算出放入到哪一个Segment.

         其实就是ConcurrentHashMap的工作机制,就是把整个Map分为N个Segment(类似HashTable),可以提供相同

         的线程安全,但是效率提升N倍,默认提升16倍

        HashMap底层源码:

        

    put的源码:
        public V put(K key,V value){
            if(key == null) return putForNullKey(value);
            int hash = hash(key);
            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;
        }

      6.TreeMap,HashMap,LinkedHashMap的区别

        TreeMap实现Sortmap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,

        也是可以指定的排序的比较器,当用到iterator便利TreeMap时,得到的记录是排序过的

        LinkedHashMap保存了记录的插入顺序,在用iterator遍历LinkedHashMap时,先得到

        的记录肯定是先插入的,也可以在构造函数时用带参数,按照应用次数排序,在遍历的时候

        会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数量较少时,遍历起来可能

        会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只有和实际数据有关,和容量无关,

        而HashMap的遍历速度和他的容量有关.

        HashMap:HashMap是一个最常用的Map,它根据键的hashCode的值存储数据,根据键可以直接

        获取他的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的,但是不支持同步,可以用

        Collections的synchronizedMap方法使HaspMap具有同步的能力,或者使用ConcurrentMap

        使用情况:

        我们最多使用的HashMap,HashMap里面存入的键值对在取出来的时候是随机的,它根据键的hashCode

        值存储数据,根据键可以直接获取它的值,具有很快的访问速度,在Map中插入和删除和定位元素,HashMap

        是最好的选择,TreeMap取出的是排序后的键值对.但如果你要是按自然顺序或自定义顺序遍历键,那么

        TreeMap会更好,LinkedMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用

        LinkedHashMap可以是实现,他还可以按读取顺序来排序,像连接池中可以应用

      7.Collection包结构,与Collections的区别

        Collection是集合类的上级接口,子接口有Set与List

        Collections是针对集合类的一个帮助类,提供了操作集合的工具方法,一系列静态方法实现对

        各种集合的搜索,排序,线程安全化等操作

  • 相关阅读:
    DeepZoomPix照片浏览的新体验
    SilverTouch系列 SilverAlbum Ver1.0
    手把手玩转win8开发系列课程(28)
    百度之星试题每周一练
    手把手玩转win8开发系列课程(27)
    WP7和Android控件对照表
    门户网站负载均衡技术的六大新挑战
    RA_CUST_TRX_LINE_GL_DIST_ALL
    XML PUBLISHER输出excel存在科学计数
    中文字符按拼音排序
  • 原文地址:https://www.cnblogs.com/wnbahmbb/p/6277885.html
Copyright © 2011-2022 走看看