java 集合基础(适用单线程)

Posted 找到属于自己的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 集合基础(适用单线程)相关的知识,希望对你有一定的参考价值。

1.集合树状:

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
│├HashSet
│├TreeSet
│├LinkedHashSet
 
Map
├Hashtable
├HashMap
└WeakHashMap
 

2.Collection接口

Collection是最基本的集合接口,一个Collection代表一组object,java jdk不提供collection的实现类,提供了子接口set和list的实现类。所以的collection都提供了一个无参和有参的构造函数,无参即构造一个空的集合,有参则根据大小创建集合。无论Collection的实际类型是什么,它都支持iterator()方法,该方法返回一个迭代器对象,能逐一访问collection里的每一个元素。用法如下:
Iterator it = collection.iterator(); // 获得一个迭代器
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一个元素
    }
虽然实现类都是实现了set list map接口,但是大多数方法已经在Collection接口里。所以可以这样写
Collection collection = new ArrayList(); 好处在于你转LinkedList的时候不需要修改arraylist的特性方法。还有就是不明确使用哪个集合的时候。
常用方法:
add(E e) // 添加元素,返回Boolean
addAll(Collection<? extend E>) // 可以添加E的子类集合
clear() // 移除所有的元素
contains(object o) // 是否包含某个元素
size() // 集合大小
remove(); //移除某个元素。
 

3.set list map 的具体实现类

 

接口     实现     历史集合类

Set      HashSet
      TreeSet
List     ArrayList     Vector
      LinkedList     Stack
Map      HashMap     Hashtable
      TreeMap      Properties
 

Set:

Set 接口 不允许存在重复的元素,原始方法都是现成的,没有引入新的方法,set实现类依赖添加的对象的equals()和hashcode方法方法来检查是否等同性;
 
set主要两个实现类HashSet和TreeSet
 
考虑到效率,添加到 HashSet 的对象需要采用恰当分配散列码的方式来实现hashCode() 方法。虽然大多数系统类覆盖了 Object 中缺省的 hashCode()实现,但创建您自己的要添加到 HashSet 的类时,别忘了覆盖 hashCode()。
 
当你需要集合按一定顺序排列的话使用TreeSet,但是添加的时候效率低于HashSet,一般的做法是先用HashSet存储,完成之后再转成TreeSet
 

list:

list接口允许存在重复的元素。
List 接口在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。为方便起见,这里也包括了其他继承方法的声明
最常用的两个实现类ArrayList 和LinkedList 前者基于线性表实现,后者基于链表实现。区别在于:
LinkedList 插入快,读慢
ArrayList 读快,插入慢
 

set和list区别

Collection是集合接口
    |————Set子接口:无序,不允许重复。
    |————List子接口:有序,可以有重复元素。
    区别:Collections是集合类
    Set和List对比:
    Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
    List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
    Set和List具体子类:
    Set
     |————HashSet:以哈希表的形式存放元素,插入删除速度很快。
    List
     |————ArrayList:动态数组
     |————LinkedList:链表、队列、堆栈。
    Array和java.util.Vector
    Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
 
 

Map:

Map 接口不是 Collection 接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。
主要实现类是:HashMap linkedHashMap treeMap hashTable
常用的方法:
Object put(Object key, Object value)返回值是被替换的值。
Object remove(Object key)
void putAll(Map mapping)
void clear()
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
 
因为映射中键的集合必须是唯一的,用 Set 支持。因为映射中值的集合可能不唯一,用Collection 支持。最后一个方法返回一个实现 Map.Entry 接口的元素 Set。
Map.Entry 接口
Map 的 entrySet() 方法返回一个实现Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。

 

HashMap 类和 TreeMap 类

在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按顺序遍历键,那么TreeMap 会更好。根据集合大小,先把元素添加到 HashMap,再把这种映射转换成一个用于有序键遍历的 TreeMap 可能更快。
为了优化 HashMap 空间的使用,您可以调优初始容量和负载因子。这个TreeMap 没有调优选项,因为该树总处于平衡状态。
HashMap与HashTable有什么区别?对比Hashtable和HashMap
  HashMap和Hashtable大致是等同的,除了非同步和空值(HashMap允许null值作为key和value,而Hashtable不可以)。
   HashMap没法保证映射的顺序一直不变,但是作为HashMap的子类LinkedHashMap,如果想要预知的顺序迭代(默认按照插入顺序),你可以很轻易的置换为HashMap,如果使用Hashtable就没那么容易了。
   HashMap不是同步的,而Hashtable是同步的。
   迭代HashMap采用快速失败机制,而Hashtable不是,所以这是设计的考虑点。
 

总结:

    掌握每个集合的特性和实现方式,将帮助你在实际开发中有着更明确的选择。
 
 
 
 
 
 
 
 

以上是关于java 集合基础(适用单线程)的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶——线程基础

Java 单线程代码ThreadLocal串值问题

为啥运行单线程 Java 程序会导致许多内核处于活动状态?

Java Socket实战之一 单线程通信基础socket

JAVA基础——线程

总结集合框架的关系