1.集合的基本介绍:
Collection
--List:将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。
--ArrayList / LinkedList / Vector
--Set : 不能含有重复的元素
--HashSet / TreeSet
Map:键值对
--HashMap
--HashTable
--TreeMap
集合的基本的功能和方法
Collection接口的方法:
boolean add(Object o):向集合中加入一个对象的引用
void clear():删除集合中所有的对象,即不再持有这些对象的引用
boolean isEmpty() :判断集合是否为空
boolean contains(Object o) : 判断集合中是否持有特定对象的引用
Iterartor iterator() :返回一个Iterator对象,可以用来遍历集合中的元素
boolean remove(Object o) :从集合中删除一个对象的引用
int size() :返回集合中元素的数目
Iterator接口声明了如下方法:
hasNext():判断集合中元素是否遍历完毕,如果没有,就返回true
next() :返回下一个元素
remove():从集合中删除上一个有next()方法返回的元素。
Object[] toArray():返回一个数组,该数组中包括集合中的所有元素 </span>
关于:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。
List的基本介绍
Java中的List就是一种集合对象,将所有的对象集中到一起存储。List里面可以放任意的java对象,也可以直接放值。
List经常用在对一组对象的存储和操作上,比如一组学生信息,一组帐号信息等等。
List可以理解为动态数组,传统数组必须定义好数组的个数才可以使用,而容器对象无须定义好数组下标总数。
List的功能和方法
list的几个常用方法:
添加元素:list.add(e);
返回是否删除:list.remove(e);
取出元素:list.get(index);
清空集合:list.clear();
判断list是否为空:list.isEmpty()
判断数组中包含/不包含某个字符串:
String[] colors = {"blue","red","green","yellow","orange","black"};
int index=Arrays.binarySearch(colors, "orange");
如果存在,index为数组下标,不存在-1。
如果想看更多的关于list的操作可以去下面的博客看,本人觉得整理的比较全面。而且配图也更好理解。
http://www.cnblogs.com/epeter/p/5648026.html
List的比较
ArrayList和LinkedList的比较
ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历 ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
LinkedList:在实现中采用链表数据结构,对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
遍历list的方法
list的遍历:
public class ArrayListDemo {
publicstatic void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("1a");
list.add("2b");
* //方法1 在比较早的框架中,jsp写遍历
Iterator it1 = list.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
* //方法2
for(Iterator it2 = list.iterator();it2.hasNext();){
System.out.println(it2.next());
}
*//方法3 list 集合遍历 foreach 速度最快 用的最多
for(String data:list){
String value=data;
}
*// 方法4 list集合遍历 for
for(i=0;i<list.size();i++){
String value=list.get(i);
}
方法3的相关解释:
foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。
foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
Map的基本介绍
Map(映射)
map的简单介绍:
Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map集合中的键对象不允许重复,因此,任意两个键对象通过equals()方法比较的结果都是false.,但是可以将任意多个键独享映射到同一个值对象上。
Map的功能和方法
Map的一般用法
* . map.put("key","value");向map中放值
* . map.get("key")从map中取值
*.map.remove(Objectkey): 删除与KEY相关的元素
*.可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。
更多具体的操作:
void clear()
从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>>entrySet()
返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o)
比较指定的对象与此映射是否相等。
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
Set<K> keySet()
返回此映射中包含的键的 Set 视图。
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,?extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()
返回此映射中的键-值映射关系数。
Collection<V> values()
返回此映射中包含的值的 Collection 视图。
Map的比较
Java类中的不同的map方法:
标准的Java类库中包含了如下几种Map:HashMap, TreeMap, LinkedHashMap,WeakHashMap, IdentityHashMap。
hashmap和TreeMap的基本介绍
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显着提高性能。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都 能产生散列码,因为hashCode()是定义在基类Object中的方法。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
hashmap和hashtable的相同点和不同点:
HashMap:
*HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
* HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
* HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
Hashtable:
* Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
* Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
* Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。
总结两者不同:
HashMap几乎可以等价于Hashtable,但是HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。现在基本上都用ConcurrentHashMap。
ConurrentHashMap和Hashtable的区别
1.它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。(总结:简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。)
2.ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap,这也是ConcurrentHashMap对Hashtable的最大优势,任何情况下,Hashtable能同时有两条线程获取Hashtable中的数据
遍历map方法
遍历map的3种方法
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");
//效率不高("通过Map.keySet遍历key和value:");
for(String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " +map.get(key));
}
//效率高,比较常用("通过Map.entrySet遍历key和value");
for(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " andvalue= " + entry.getValue());
}
// ("通过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() + " andvalue= " + entry.getValue());
}
Set基本介绍
Set(集合)
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。
Set接口主要实现了两个实现类:
*HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
*TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序
Set的功能方法:
set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
Set的比较
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。