一、Set:就是袋子里数据不重复
1、 Set和Collection有同样的接口,the Set is exactly a Collection,但是有不同的行为
这就是继承(子类和父类属于同一种类型)和多态的的思想(同一接口,实现不同的功能)
1>HashSet :存储方法采用 hashing function,能够快速查找。
2>TreeSet:keeps elements sorted into a red-black tree data structue,
存储方法采用红黑树的结构,输出的结果排序(int 1,2,3...),
3>LinkedHashSet:also uses hashing for lookup speed, but appears to maintain elements in
insertion order using a linked list.
存储方法采用 hashing function,但是保持插入的顺序。
2、打开,读一个文件到Set,然后利用分隔符分开形成数组,主要的目的希望输出的数据不重复。
\\W+:表示分割符号可以不是(a--z A--z - 0--9),即分割符只要不含字母,数子,下划线,全部当成分割符号,
这样分割符号是\n,逗号,空格等等 ,
1>lexicographically:字母顺序,默认是区分大小写(ABC....Z abc.....)
package holding; import java.util.Set; import java.util.TreeSet; import net.mindview.util.TextFile; public class UniqueWords { public static void main(String[] args) { Set<String> words = new TreeSet<String>(new TextFile("src\\holding\\SetOperations.java", "\\W+")); Set<String> words1 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); words1.addAll(new TextFile("src\\holding\\SetOperations.java", "\\W+")); System.out.println(words); System.out.print(words1); } } // //输出1: Output: [A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K, L, M, N, Output, Print, Set, SetOperations, String, X, Y, Z, add, //输出2: [A, add, addAll, added, args, B, C, class, Collections, contains, containsAll, D, E, F, false, from, |
二、Map:一对一对存。
1、存《字符串,int 》对
简单例子:1》一家饮料店,想统计早上高峰期2个小时内,各个年龄段的人数
2》当打印小票时,就调用统计方法。
package holding; import java.util.HashMap; import java.util.Map; import java.util.Random; //方法参数 public class Statistics { public static void StaPerCount(String person,Map<String,Integer> t ) { Integer personc=t.get(person); t.put(person, personc==null?1:personc+1); } public static void main(String[] args) { Map<String,Integer> m=new HashMap<String,Integer>(); StaPerCount("老人50-60",m); StaPerCount("女小孩10-15",m); StaPerCount("男小孩15-18",m); StaPerCount("女18-23",m); StaPerCount("女18-23",m); StaPerCount("女18-23",m); System.out.println(m); } } |
2、存《字符串,对象 》对
Here’s an example that allows you to use a String description to look up Pet objects
package holding; import typeinfo.pets.*; import java.util.*; import static net.mindview.util.Print.*; public class PetMap { public static void main(String[] args) { Map<String, Pet> petMap = new HashMap<String, Pet>(); petMap.put("My Cat", new Cat("Molly")); petMap.put("My Dog", new Dog("Ginger")); petMap.put("My Hamster", new Hamster("Bosco")); print(petMap); Pet dog = petMap.get("My Dog"); print(dog); print(petMap.containsKey("My Dog")); print(petMap.containsValue(dog)); } } /* Output: {My Cat=Cat Molly, My Hamster=Hamster Bosco, My Dog=Dog Ginger} Dog Ginger true true |
key=对象
values=容器或另一个Maps.
3.1 初始化问题:类变量存在类的常量池中,当类编译成.class 出现,但是编译器也不知道这些数据实际内存地址,只是弄一个假符号代替,
当这个类被用时(new、或者他的实例变量调用方法时),才为类变量分配真正的内存地址,这样常量池中假符号被真正的内 存地址代替,而且一个类的常量池谁都可以用,这个涉及到访问冲突问题,在线程中继续解释。
1》类MapOfList 有一个静态(类)变量:是一个实例变量 petPeople,可以和其它对象Map相连接。
当用petPeople调用Map的方法时,这个keySet时,类MapOfList 进行初始化,表示对MapOfList 类第一次使用
2》首先初始化静态(类)petPeople 变量,
3》第二static {} 块。
4》才显示petPeople.keySet() 的所有值。
package holding; import typeinfo.pets.*; import java.util.*; import static net.mindview.util.Print.*; public class MapOfList { public static Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>(); static { petPeople.put(new Person("Dawn"), Arrays.asList(new Cymric("Molly"), new Mutt("Spot"))); petPeople.put(new Person("Kate"), Arrays.asList(new Cat("Shackleton"), new Cat("Elsie May"), new Dog("Margrett"))); petPeople.put(new Person("Marilyn"), Arrays.asList(new Pug("Louie aka Louis Snorkelstein Dupree"), new Cat("Stanford aka Stinky el Negro"), new Cat("Pinkola"))); petPeople.put(new Person("Luke"),Arrays.asList(new Rat("Fuzzy"), new Rat("Fizzy"))); petPeople.put(new Person("Isaac"), Arrays.asList(new Rat("Freckly"))); } public static void main(String[] args) { print("People: " + petPeople.keySet()); print("Pets: " + petPeople.values()); for (Person person : petPeople.keySet()) { print(person + " has:"); for (Pet pet : petPeople.get(person)) print(" " + pet); } } } |