Java 集合常见问题

来源:互联网 发布:苹果6s数据连接快捷键 编辑:程序博客网 时间:2024/06/06 05:44

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

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

List

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

ArrayList

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

LinkedList

  1. LinkedList泛型接口
  2. 链表
  3. 由于实现了Deque接口,所以它还是一个双端队列