您的位置:首页 > 编程语言 > Java开发

Java 集合常见问题

2017-07-18 09:18 211 查看
1.数组转ArrayList

List<String> list = Arrays.asList(arr);
Arrays.asList会返回一个ArrayList对象,但是该类是Arrays类中一个私有静态内部类,具有set get contains等方法,不具有add remove方法(size固定)

应采用如下方法

ArrayList<String>list = new ArrayList<String>(Arrays.asList(arr));
更加高效的方法:

ArrayList<String> arrayList = new ArrayList<String>(arr.length);

Collections.addAll(arrayList, arr);


2.数组是否包含特定值

高效代码:

for(String s: arr){

if(s.equals(targetValue))

return true;

}

return false;
3.在迭代中移除List中元素

不能采用索引方式(list.remove(i))移除元素,因为size大小会变,解决方法使用迭代器(iterator),代码如下:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c",

"d"));

Iterator<String> iter = list.iterator();

while (iter.hasNext()) {

String s = iter.next();

if (s.equals("a")) {

iter.remove();

}

}
next方法必须在remove方法前调用,否则会报ConcurrentModificationException 异常。

4.Hashtable 与 HashMap(哈希表)

a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。

b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。

c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

5. ArrayList 与 LinkedList

ArrayList 适用于多次随机访问操作,内部实现机制来讲ArrayList是使用Object的数组形式来存储的。

LinkedList (双向链表)适用于场景中有很多add、remove操作,只用少量的随机访问操作

6. Java中数组List数据结构

7.Map遍历

//
System.out.println("第二种:通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Integer, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
// 推荐,尤其是容量大时
System.out.println("第三种:通过Map.entrySet遍历key和value");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
//Map.entry<Integer,String> 映射项(键-值对)  有几个方法:用上面的名字entry
//entry.getKey() ;entry.getValue(); entry.setValue();
//map.entrySet()  返回此映射中包含的映射关系的 Set视图。
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}



Collection

是一个泛型的接口
继承了超级接口Iterable
每个Collection的对象包含了一组对象
所有的实现类都有两个构造方法,一个是无参构造方法,第二个是用另外一个Collection对象作为构造方法的参数
遍历Collection使用Iterator迭代器实现
retainAll(collection),AddAll(),removeAll(c)分别对应了集合的交并差运算
没有具体的直接实现,但提供了更具体的子接口,如Set、List等


List

是一个接口,继承了接口Collection
List是有序的Collection,能够精确控制插入、获取的位置
和Set接口的最大区别是,List允许重复值,Set不能
它的直接实现类有ArrayList,LinkedList,Vector等
List有自己的迭代器ListIterator,可以通过这个迭代器进行逆序的迭代,以及用迭代器设置元素的值


ArrayList

ArrayList实现了Collection接口
ArrayList是一个顺序表。大小可变。
ArrayList相比LinkedList在查找和修改元素上比较快,但是在添加和删除上比LinkedList慢
ArrayList相比Vector是线程不安全的


LinkedList

LinkedList泛型接口
链表
由于实现了Deque接口,所以它还是一个双端队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: