集合面试
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(…));
-
数组(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来说是不可能的。