• 集合面试


    ArrayList: 多用于查询,不安全,添加元素则是判断equals,而hashSet是要if hascode然后equals,0.5倍增长,增长不可设置

    由于说itraotr用到了工厂模型,那么工厂模型和重载的区别在于使用时,客户端调用不用知道其具体了类型,使用了面向对象多态的特性

    从collections的sort方法:

    public static <T> void sort(List<T> list, Comparator<? super T> c) {
    Object[] a = list.toArray();
    Arrays.sort(a, (Comparator)c);
    ListIterator i = list.listIterator();
    for (int j=0; j<a.length; j++) {
    i.next();
    i.set(a[j]);
    }
    }//collection的sort和Array是一样的,且list的内容进行了重置,当然TreeSet也是能做到有序排序的,对一个乱序的数集合

    private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容了1.5倍
    if (newCapacity - minCapacity < 0)
    newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
    newCapacity = hugeCapacity(minCapacity);//顶多扩容到Integer.MAX_VALUE,由于其整形还会到转到负数,由于没有无符号整形,这也是Java和C语言的差别
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
    }

     

    【数组转List注意问题】

    Arrays.asList()返回一个受指定数组支持的固定大小的列表。所以不能做Add、Remove等操作。

    List list = new ArrayList(Arrays.asList(userid));这样操作就可以了

    Vector: 元素单个,线程安全,多用于查询,增长可设置 

    LinkedList: 元素单个,多用于插入和删除

    Stack:这是线程安全的LIFO【先进后出的方式】

    HashMap: 元素成对,元素可为空  取得set集合entrySet【entry是记录的意思】

    HashTable: 元素成对,线程安全,元素不可为空

    WeakHashMap: 是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收

     Hashset:不是有序的,只能迭代器遍历。它和linkedhashset,就是后者能保证遍历得到数据顺序是和插入时是一样的

    forsize

    不能删除元素,删除一个size方法就会减一,删除两个,这个值在变动

    foreach

    要知道集合里的元素类型是什么,

     这里的是要不能删除元素的,网上看的删倒数第二个不会有事,要删的也得到元素位置,会抛出异常。容器大小不可改变

    Iterator 

     不需要像for需要有序,也是需要知道大小,

    也不用知道其集合类型是什么,也不需要集合里面的类型是什么,也就不能实现多态

    能删改操作,但个人基本就是用来遍历,不去修改集合本身内容,

    集合里面个数比较多的时候,又无需全部遍历,我则选择forsize

    当使用Iterators时,在获得Iterator的时候包含一个集合快照。

    Iterator与ListIterator有什么区别

    1. Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

    2. Iterator只能正向遍历集合,适用于获取移除元素。ListIerator继承Iterator,可以双向列表的遍历,同样支持元素的修改。比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

    Hashtable 比 HashMap

    值: HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 

     Hashtable 但是不允许 null 键和 null 值。支持线程安全的hashtable效率自然要低些

    HashMap要想达到同步效果,要使用collections.syncronizedMap(map)这个方法达到同步

    LinkedList与ArrayList有什么区别

    一个动态数组,一个链表的数据结构。

    遍历时,用for循环将会非常糟糕,数据量稍微大点就不行了,这是LinkedList的访问不如ArrayList的随机访问

    使用场景就是如果要增加或者删除数据时,这样移动数据方便,这也是链表的一个特征。

    附加:

           LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

         LinkedList没有同步方法。是线程不安全类,一种解决方法是在创建List时构造一个同步的List:

    List list = Collections.synchronizedList(new LinkedList(…));

    1. 数组(Array)和列表集合(ArrayList)有什么区别

      下面列出了Array和ArrayList的不同点: 

              Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

              Array大小是固定的,ArrayList的大小是动态变化的。 

              ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()  等等。

             对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

       toArray要带上参数,否则会抛异常,一定要有数组引用传入!

      Enumeration接口和Iterator接口的区别有哪些

       Enumeration<String> enu = all.elements() ;

             Enumeration速度是Iterator的2倍,同时占用更少的内存。Iterator线程安全。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

  • 相关阅读:
    Java内存模型解惑--观深入理解Java内存模型系列文章有感(二)
    Java内存模型解惑--观深入理解Java内存模型系列文章有感(一)
    Java内存模型以及Volatile、Synchronize关键字的疑问
    关于java的volatile关键字与线程栈的内容以及单例的DCL
    SpringMVC绑定到实体数组、list、set、和map时要注意
    flutter中的动画
    mysql连接池如何确定大小?
    node下的ORM框架 Sequelize
    解决Node下MySQL客户端不支持认证协议引发的"ER_NOT_SUPPORTED_AUTH_MODE"问题
    node koa2 常用中间件和安装包
  • 原文地址:https://www.cnblogs.com/chenxuezhouLearnProgram/p/5692836.html
Copyright © 2020-2023  润新知