很长时间没写代码了,惭愧。身为java界的码畜,总认为手握屠龙刀就能号令天下,其实不然,屠龙宝刀里面的奥秘,还是深入挖掘。每一本武功秘籍都需要勤加修炼。不练就会忘记,大脑就是这样。
先说说容器吧,记得是有Collection和Map两大接口,实在是记不起来内部结构了,在net上弄了张图:
Collection:值允许每个位置上放一个对象,包括”按照一定顺序存放的一组对象“List;”只能添加不重复的对象“的Set;添加元素使用add();
Map:是键-值对的形式存在的,Map不接受重复的key值。添加元素使用put();
这些类都是存在 java.util.* 这个包下面的内容。值得一提的是存在一个Collections类,它包含有各种有关几何操作的静态方法,实现对各种集合的搜索、排序、线程安全化操作。
无论使用哪种Set,都需要定义equals(),但是只有在”要把对象放进”HashSet“的情况下,才需要定义HashCode();因为HashSet是我们常用的Set,所以通常也需要定义hashCode()。作为一种习惯,一般都会在重写equals()的同时也重写hashCode();
List主要分为:LinkedList、ArrayList、Vector;
ArrayList是一个用数组实现的List,能够进行快速的随机访问,但是往列表中间插入和删除元素的时候比较慢,允许null元素。
LinkedList是使用双向链表实现的,每个对象除了保存数据之外,还存储着前、后两个对象的reference,能够进行快速的插入和删除操作,允许null元素。
Vector是以前遗留下来的数据结构。
vector和ArrayList的区别:vector是线程安全、同步的;ArrayList是线程不安全、不是同步的;当容器满载时,vector增长为原数据容量的一倍;ArrayList增长原来的1/2;
关于List里面的方法,需要好好的去研究API;
Set主要分为:HashSet、TreeSet、LinkedHashSet;
Set的接口解释Collection,它不包含重复的元素;准确的说,Set中的equals方法被重写了,不满足e1.equals(e2),只能存在一个null值;
HashSet:是为了在大堆数据中查找而生的,比LinkedList快,比ArrayList方便(如果不知道下标);HashCode散列码,在Object中有一个hashCode方法得到散列码。基本上每一个对象都存在默认的散列码,也就是对象的内存地址。因为散列表的插入按照一定的方法(比如散列码除散列单元大小取余),知道怎么存储,查找起来就方便了。也就是说:HashCode()方法和equals()方法最好都同时重写!!
TreeSet:它的底层是一棵树,优势在于对元素排序,集合里面的元素为自然排序,不能出现重复元素;一般会通过实现Comparable接口来构建一个比较器,来对元素进行排序,compareTo(T t)方法。
LinkedHashSet:太高深,都在说源码。。。满头黑线,到时候在看。
Map分类:HashMap、TreeMap、LinkedHashMap、WeakHashMap、IdentityHashMap。
map主要增加了键-值关联,可以采用put(Obeject key, Object value)来增加元素,据说内部查找使用了hashcode(),这样的话,比ArrayList的一个一个查找要快。
HashMap:据说HashSet本身就是借由HashMap来实现的,底层都采用Hash存储机制。
TreeMap:TreeMap中所有元素都保持着某种固定的顺序,它实现了红黑树算法。如果想要一个有序的结果就用TreeMap(HashMap是无序的)。
可以看看别人写的http://cmsblogs.com/?p=1013。
关于Comparable接口和Comparator?
1>.一个类要是实现了Comparable接口,则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparable接口中只有一个compareTo()方法,例如:”a.x.compareTo(b.x)==0“就和equals()方法类似。
2>.Comparator是一种算法实现,假如一个类实现了这个接口,那么它一定要实现compareTo()方法,一般用在下面的情况:
1.类没有继承Comparable接口,但是又要进行类的比较的时候,我们可以通过Comparator来定义一个排序规则,而不必改变对象本身。
2.排序的标准多样化,升序、降序等等。
import java.util.*;
class Regular{
String name;
String sorted;
public Regular() {}
public Regular(String str){
this.name = str;
char[] sortChar = str.toCharArray();
Arrays.sort(sortChar);
String tmp = new String(sortChar);
this.sorted = tmp;
}
public String getName() {
return name;
}
public String getSorted() {
return sorted;
}
}
public class Main {
static Comparator<Regular> comparator = new Comparator<Regular>(){
public int compare(Regular str1,Regular str2){
return str1.name.compareTo(str2.name);
}
};
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String tmp;
ArrayList<Regular> rs = new ArrayList<Regular>();
while(true){
tmp = input.next();
if(tmp.compareTo("XXXXXX")==0)break;
Regular temp = new Regular(tmp);
rs.add(temp);
}
Collections.sort(rs,comparator);
// Iterable<Regular> it = rs.iterator();
// System.out.println(rs);
while(true){
boolean flag = false;
String tmp1 = input.next();
if(tmp1.equals("XXXXXX"))break;
Regular test = new Regular(tmp1);
Iterator<Regular> it = rs.iterator();
while(it.hasNext()){
Regular tmp2=it.next();
if(tmp2.getSorted().equals(test.getSorted())){
flag=true;
System.out.println(tmp2.getName());
}
}
if(!flag)
System.out.println("NOT A VALID WORD");
System.out.println("******");
}
}
}
贴一个小例子,慢慢琢磨一下下。