A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 请叫我一声辉哥 中级黑马   /  2016-5-3 21:44  /  407 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

2:集合框架的概述、arraylist的特点、map集合的特点、Collection集合下班有哪些类,
   哪些类又有哪些特点、HashMap是Hashtable的区别?
        Collection:
         |--List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
           |--ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
           |--LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
           |--Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。
         |--Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。
           |--HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
           |--LinkedHashSet:有序,hashset的子类。
           |--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。

        HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
        当元素的hashCode值相同时,才继续判断元素的equals是否为true。 如果为true,那么视为相同元素,不存。如果为false,那么存储。
        先hashCode,再equals,从而提高对象比较的速度。

        对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。
        对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals方法。
       
        TreeSet集合排序有两种方式,Comparable和Comparator区别:
        1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
        2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
        第二种方式较为灵活。
       
        Map:
         |--Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
         |--HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
         |--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
       
        想要获取map中的所有元素:
        原理:
                map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,
                可以使用迭代器了。之所以转成set,是因为map集合具备着键的唯一性,
                其实set集合就来自于map,set集合底层其实用的就是map的方法。
                把map集合转成set的方法:
                        Set keySet();
                        Set entrySet();//取的是键和值的映射关系。
                Entry就是Map接口中的内部接口;
                为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。

--------------------------------------------------------------
3:懒汉模式和饿汉模式的区别
        1、线程安全:
                饿汉式是线程安全的,可直接用于多线程,懒汉式是线程不安全的,
                用于多线程可能会被实例化多次,失去单例的作用。

                如果要把懒汉式用于多线程,一种是在getInstance方法上加同步,
                另一种是在使用该单例方法前后加双锁。
        2、资源加载:
                饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,
                会占据一定的内存,相应的在调用时速度也会更快,
                而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,
                第一次掉用时要初始化,如果要做的工作比较多,性能上会有些延迟。
--------------------------------------------------------------

1 个回复

倒序浏览
顶一个,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马