java集合整合

https://www.cnblogs.com/chenglc/p/8073049.html

 

collection与collections

Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。

Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。

  

java里面的容器分两大类,Map和Collection

 

 

 

1.ArrayList: 元素单个,效率高,多用于查询

2.Vector:    元素单个,线程安全,多用于查询

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

4.HashMap:   元素成对,元素可为空

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

 

queue详细分析:

PriorityQueue的本质

PriorityQueue 本质也是一个动态数组,在这一方面与ArrayList是一致的。
PriorityQueue调用默认的构造方法时,使用默认的初始容量(DEFAULT_INITIAL_CAPACITY=11)创建一个 PriorityQueue,并根据其自然顺序来排序其元素(使用加入其中的集合元素实现的Comparable)。

https://www.cnblogs.com/lemon-flm/p/7877898.html

 

 

ArrayList,Vector,LinkedList比较

(1)如果需要遍历集合,ArrayList和Vector通过随机访问的方式比较好,LinkedList通过迭代器的方式比较好;

(2)需要经常执行插入、删除操作时,使用LinkedList比较好,因为他用链表实现,ArrayList和Vector内部会扩容动态分配大小,耗费时间;

(3)需要线程安全,考虑使用Vector。

ArrayList和Vector的区别:

ArrayList与Vector都是java的集合类,都是用来存放java对象,这是他们的相同点,

区别:

1.同步性:

Vector是同步的,这个类的一些方法保证了Vector中的对象的线程安全的,而ArrayList则是异步的,因此ArrayList中的对象并不 是线程安全的,因为同步要求会影响执行的效率,所以你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必 要的性能开销。

2.数据增长:

从内部实现的机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当你向两种类型中增加元素的时候,如果元素的数目超过了内部数组目前的长度他们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大,所以如果你要在集合中保存大量的数据,那么使用Vector有一些优势,因为你可以通过设置集合的初始大小来避免不必要的资源开销。

总结:

1)如果要求线程安全,使用Vector,Hashtable

2)如果不要求线程安全,使用ArrayList,LinkedList,HashMap

3)如果要求键值对,则使用HashMap,Hashtable

4)如果数据量很大,又要求线程安全考虑Vector

Set和List的区别

  • 1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

  • 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

  • 3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。

ArrayList 和 LinkedList 的区别
  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

HashMap与TreeMap联系与区别
1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。
2、在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。
两个map中的元素一样,但顺序不一样,导致hashCode()不一样。

同样做测试:
在HashMap中,同样的值的map,顺序不同,equals时,false;
而在treeMap中,同样的值的map,顺序不同,equals时,true,说明,treeMap在equals()时是整理了顺序了的。

 

HashMap和Hashtable的区别:

HashMap和Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点

以下是他们的区别:

1.历史原因:

Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个现实。

2.同步性:

Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的结合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率,我们一般所编写的程序都是异步的,但如果是服务器端的代码除外。

3.值:

HashMap可以让你将空值作为一个表的条目的key或value

Hashtable是不能放入空值(null)的

 

 

 

遍历 ArrayList

import java.util.*;
public class Test{
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("Hello");
        list.add("World");
        list.add("HAHAHAHA");
       //第一种遍历方法使用 For-Each 遍历
       List for (String str : list) {
       //也可以改写
       for(int i=0;i<list.size();i++) 这种形式 System.out.println(str);
       }
      //第二种遍历,把链表变为数组相关的内容进行遍历
      String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++)
     //这里也可以改写为 for(String str:strArray) 这种形式
     {
     System.out.println(strArray[i]);
     }
     //第三种遍历 使用迭代器进行相关遍历
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
     System.out.println(ite.next());
     }
  }
}

解析:

三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。

遍历 Map

import java.util.*;
public class Test{
   public static void main(String[] args) {
       Map<String, String> map = new HashMap<String, String>();
       map.put("1", "value1");
       map.put("2", "value2");
       map.put("3", "value3");
       //第一种:普遍使用,二次取值
         System.out.println("通过Map.keySet遍历key和value:");
         for (String key : map.keySet()) {
          System.out.println("key= "+ key + " and value= " + map.get(key));
         }
         //第二种
         System.out.println("通过Map.entrySet使用iterator遍历key和value:");
         Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
         while (it.hasNext()) {
          Map.Entry<String, String> entry = it.next();
          System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
         }
         //第三种:推荐,尤其是容量大时
        System.out.println("通过Map.entrySet遍历key和value");
        for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
        }
        //第四种
        System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
        for (String v : map.values()) {
        System.out.println("value= " + v);
        }
    }
}

 

posted on 2019-08-28 19:27  旺仔QQ糖青苹果味  阅读(268)  评论(0编辑  收藏  举报

导航