hashSet (就是普通set)
需要掌握的api
Arrays.asList("a","b","c"); 将普通数组转换成 ArrayList 集合
去重
String[] arr = new String[] {"i", "think", "i", "am", "the", "best"};
LinkedHashSet noDups = new LinkedHashSet(Arrays.asList(arr));
System.out.println("(LinkedHashSet) distinct words: " + noDups);
treeSet
TreeSet是SortedSet接口的实现,元素不论以什么元素插入,在遍历的时候,都会以天然顺序遍历。
三种排序方法
//01
public static void main(String[] args) {
// test1();
test2();
}
private static void test1() {
TreeSet treeSet=new TreeSet();
treeSet.add("a");
treeSet.add("d");
treeSet.add("b");
treeSet.add("e");
treeSet.add("c");
for (String string : treeSet) {
System.out.println(string);
}
}
//02
private static void test2() {
TreeSet infosSet =new TreeSet(new Comparator() { // 传入比较器,保证顺序
@Override
public int compare(Info o1, Info o2) {
int num=o1.getId()-o2.getId();
num = num==0?o1.hashCode()-o2.hashCode():num;
return num;
}
}) ;
infosSet.add(new Info(0, "qqq"));
infosSet.add(new Info(1, "wew"));
infosSet.add(new Info(3, "ete"));
infosSet.add(new Info(2, "bjk"));
infosSet.add(new Info(1, "wew")); // 重复元素,compare方法返回0,不会被插入到TreeSet
for (Info info : infosSet) {
System.out.println(info);
}
}
//03
public class Test {
public static void main(String[] args) {
TreeSet set = new TreeSet(new PersonComparator());
set.add(new Person("lwc", 80));
set.add(new Person("nxj", 70));
set.add(new Person("lp", 60));
set.add(new Person("fy", 75));
Iterator ite = set.iterator();
while (ite.hasNext()) {
Person p = (Person)ite.next();
System.out.println(p.name);
}
}
}
class Person {
String name;
int score;
public Person(String name, int score) {
this.name = name;
this.score = score;
}
}
class PersonComparator implements Comparator {
public int compare(Object o1, Object o2) {
Person p1 = (Person) o1;
Person p2 = (Person) o2;
return p1.score - p2.score;
}
}
Map 和js差不多
在该图中1-4步骤是找到该元素在数组中位置,5-8步骤是将该元素插入数组中。在插入的过程中会遇到一点点小挫折。在众多肯能存在多个元素他们的hash值是一样的,这样就会得到相同的索引位置,也就说多个元素会映射到相同的位置,这个过程我们称之为“冲突”。解决冲突的办法就是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表。当然也不是简单的插入,在HashMap中的处理过程如下:获取索引位置的链表,如果该链表为null,则将该元素直接插入,否则通过比较是否存在与该key相同的key,若存在则覆盖原来key的value并返回旧值,否则将该元素保存在链头(最先保存的元素放在链尾)。
1. Map 是一个键值对(key-value)映射接口。Map映射中不能包含重复的键;每个键最多只能映射到一个值。
2. Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
3. Map 映射顺序。有些实现类,可以明确保证其顺序,如 TreeMap;另一些映射实现则不保证顺序,如 HashMap 类。
4. Map 的实现类应该提供2个“标准的”构造方法:第一个,void(无参数)构造方法,用于创建空映射;第二个,带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。尽管无法强制执行此建议(因为接口不能包含构造方法),但是 JDK 中所有通用的映射实现都遵从它。
public class MapDemo
{
public static void main(String[] args)
{
Map m = new HashMap();
m.put("zhangsan", 19);
m.put("lisi", 49);
m.put("wangwu", 19);
m.put("lisi",20);
m.put("hanmeimei", null);
System.out.println(m);
System.out.println(m.remove("wangwu"));
m.clear();
System.out.println(m);
}
}
map的遍历
通过map 自带的.keySet() 对键进行遍历 ,遍历过程中也可以通过map.get(key) 对value进行遍历。
map.entrySet() //获取map中的所有键值对。
while(it.hasNext()){
Map.Entry
}
//通过迭代器 Mapmap = new HashMap (); map.put("王伟琪",23); map.put("上坂堇",30); map.put("丰田露娜",18); Iterator it = map.entrySet().iterator(); while(it.hasNext()){ Map.Entry next = ( Map.Entry ) it.next(); System.out.println(next.getKey()); } Iterator it = map.keySet().iterator(); while(it.hasNext()){ String key = it.next().toString(); System.out.println(key); System.out.println(map.get(key)); //value }
TreeMap
根据key进行降序排列
Mapmap = new TreeMap (new Comparator (){ public int compare(String obj1,String obj2){ //降序排序 return obj2.compareTo(obj1); } }); map.put("month", "The month"); map.put("bread", "The bread"); map.put("attack", "The attack"); Set keySet = map.keySet(); Iterator iter = keySet.iterator(); while(iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+map.get(key)); }
根据value进行降序排列
List> mappingList = null; Map map = new TreeMap (); map.put("aaaa", "month"); map.put("bbbb", "bread"); map.put("ccccc", "attack"); //通过ArrayList构造函数把map.entrySet()转换成list mappingList = new ArrayList >(map.entrySet()); //通过比较器实现比较排序 Collections.sort(mappingList, new Comparator >(){ public int compare(Map.Entry mapping1,Map.Entry mapping2){ return mapping1.getValue().compareTo(mapping2.getValue()); } }); for(Map.Entry mapping:mappingList){ System.out.println(mapping.getKey()+":"+mapping.getValue()); }
HashTable
api与 HashMap一致但是两者不同·我们从他们的定义就可以看出,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。
排序
Hashtable ht = new Hashtable();
ht.Add("dd", "value2");
ht.Add("cc", "value3");
ht.Add("bb", "value4");
ht.Add("aa", "value5");
ArrayList list = new ArrayList(ht.Keys);
list.Sort();
foreach (string str in list)
{ Console.WriteLine(str+":"+ht[str]);
}
Hashtableh = new Hashtable (); h.put("6", "666"); h.put("8", "888"); h.put("2", "222"); for (String key : h.keySet()) System.out.println(key); List v = new ArrayList (h.keySet()); Collections.sort(v, new Comparator



