-
java 容器都有哪些?
List、set、map -
Collection 和 Collections 有什么区别?
Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。 -
List、Set、Map 之间的区别是什么?
List:1.可以允许重复的对象。 2.可以插入多个null元素。3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
Set:1.不允许重复对象2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。 3. 只允许一个 null 元素
Map: 1.Map不是collection的子接口或者实现类。Map是一个接口。
2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。 -
HashMap 和 Hashtable 有什么区别?
HashMap允许键和值是null,而Hashtable则不允许键或者值是null。Hashtable是同步的,而HashMap不是,所以HashMap更适用于单线程环境(线程不安全),Hashtable则适用于多线程环境(线程安全)。
-
如何决定使用 HashMap 还是 TreeMap?
HashMap:适合查询。基于散列表实现。
TreeMap:增加、快速创建。基于红黑树实现。 -
说一下 HashMap 的实现原理?
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。 -
说一下 HashSet 的实现原理?
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成 -
ArrayList 和 LinkedList 的区别是什么?
1.ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
2.对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 -
如何实现数组和 List 之间的转换?
List转数组: arrayList.toArray()方法数组转List:Arrays.asList(a)方法
-
ArrayList 和 Vector 的区别是什么?
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。 -
Array 和 ArrayList 有何区别?
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。 -
在 Queue 中 poll()和 remove()有什么区别?
remove方法和poll方法都是删除队列的头元素,remove方法在队列为空的情况下将抛异常,而poll方法将返回null -
哪些集合类是线程安全的?
vector、hashtable -
迭代器 Iterator 是什么?
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包括了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除 -
Iterator 怎么使用?有什么特点?
Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。
Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素。
Iterator必须依附某个Collection对象而存在,Iterator本身不具有装载数据对象的功能。
Iterator.remove方法删除的是上一次Iterator.next()方法返回的对象。
ext()方法通过游标指向的形式返回Iterator下一个元素。 -
Iterator 和 ListIterator 有什么区别?
1 ListIterator有add()方法,可以向List中添加对象,而Iterator不能2 ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方 法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
3 ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
4 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
-
怎么确保一个集合不能被修改?
添加final修饰符或者
Collections.unmodifiableList(List)
Collections.unmodifiableMap(Map)
Collections.unmodifiableSet(Set)