Java集合是多个对象的容方法。集合(容方法),简单点,其实就是一个对象,能将具有相同性质的多个元素汇聚成一个整体。
Collections Framwork是用来表现和操纵集合的一个统一的体系结构。
常用的集合有HashMap,HashSet,ArrayList……,因为对于每一个集合的内涵都很模糊,所以才会导致自己不知道具体的使用环境。我们通过对比来区分异同:
Set(集)
Set可以说是一种最简单的集合,主要的两个实现类,HashSet,TreeSet,两者最大的区别就是TreeSet是有序的,而HashSet是无序的(详细请见后文分解)
以HashSet举例说明:
import java.util.HashSet;
import java.util.Set;
import java.util.*;
public class hashset {
/**
* 使用Set示例代码
*/
public void hashSetExample() {
Set vehicles = new HashSet();
//Declare some string items
String item_1 = "apple";
String item_2 = "orange";
String item_3 = "banana";
boolean result;
//把每个文件都使用set方法加入
result = vehicles.add(item_1);
System.out.println(item_1 + ": " + result);
result = vehicles.add(item_2);
System.out.println(item_2 + ": " + result);
result = vehicles.add(item_3);
System.out.println(item_3 + ": " + result);
//再次尝试使用item_1
result = vehicles.add(item_1);
System.out.println(item_1 + ": " + result);
}
@SuppressWarnings("unchecked") public static void main(String[] args) {
new hashset().hashSetExample();
}
}
最后输出的结果为:apple:true;orange:true;banana:true;apple:false,出现的原因就是因为咱们Set是不允许有重复元素出现的。
List(列表)
List相比而言,是常见的,List特征就是其元素是以线性方式存储,集合中可以存放重复的对象,当涉及到“栈”,“队列”,“链表”等时,都是使用List,其实也就是我们数据库结构使用的那些知识。
至于具体使用什么,也得视情况而定,比如:
ArrayList():适用于可以改变长度的数组,可以对元素进行随机的访问,只不过插入,删除元素的速度较慢;
LinkedList():主要用于链表数据结构,插入和删除速度是很快的,只是访问时的速度慢。
Vector():底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,所以一般不常用,直接用ArrayList代替来使用了。
Map(映射)
Map<key,value>是一个双列集合,是一种把键对象和值对象映射的集合,有一个Key值和一个Value值,Key值代表唯一,所以不能重复;Value值是真正可以存储的变量,所以是可以重复的。Map没有继承于Collection接口,在Map集合中检索元素时,只要给出键对象,就能够返回对应的值。
对于Map而言,执行效率是一个大问题,常用的两个实现为:
HaspMap():Map基于散列表的实现,插入和查询“键值对”的开销是固定的,HashMap就是使用对象的HashCode来进行查询的,此方法能够显著提高性能
TreeMap():只要是Tree,他就一定是经过排序的,TreeMap是唯一带有SubMap()方法的,所以它可以返回一个子树。
Map-HashCode举例:
import java.util.*;
public class hashcode {
public static void main(String[] args){
HashMap h2=new HashMap();
for(int i=0;i<10;i++)
h2.put(new Element(i), new result());
System.out.println("h2:");
System.out.println("Get the result for Element:");
Element test=new Element(5);
if(h2.containsKey(test))
System.out.println((result)h2.get(test));
else
System.out.println("Not found");
}
}
/* 这样运行结果为null,也就是得不到值 */
/* class Element{
int number;
public Element(int n){
number=n;
}
} */
/* 更改方法如下: */
class Element{
int number;
public Element(int n){
number=n;
}
public int hashCode(){
return number;
}
public boolean equals(Object o){
return (o instanceof Element) && (number==((Element)o).number);
}
}
class result{
Random r=new Random();
boolean possible=r.nextDouble()>0.5;
public String toString(){
if(possible)
return "OK!";
else
return "Impossible!";
}
}
对于Element而言,前后两者的对比就是一个有返回值,一个没有返回值;HashCode方法是继承于Object的,因为Element在这里覆盖了hashCode()和equals()方法,这样是前后两个Key保持了一致,所以最终有了值返回。
对于HashCode而言,其实不必对每个不同的对象都产生一个唯一的HashCode,只要能够得到返回值就达到目的了;再者,对于HashCode,最好能够分散开,使用“分散原则”,有利于提高性能。
最后总结:
对于Collection需要了解的还有很多很多,这也只是冰山一角,通过对比学习,能够在使用的过程中得到最优解,这样才能使我们的系统性能优化,价格合理。