黑马程序员-集合框架小结

来源:互联网 发布:皇室战争火球升级数据 编辑:程序博客网 时间:2024/06/04 20:12


------- android培训、java培训、期待与您交流! ----------


Collection:集合根接口,结合中储存的都是对象的引用(地址)。

Iterator:迭代器接口。因为每种集合的数据结构不同,所以取出细节动作也不同。但是有共性判断和取出。因此将共性方法取出。那么这些内部类都符合一个规则。那就是
Iterator。从集合取出对象——通过对外提供的方法iterator();。

List接口特点:元素是有序的。可重复。因为该集合体系有索引。凡是可以操作角标的方法都是该体系特有方法
增加:add(index,element); addAll(index,Collection);
删除:remove(index);   返回值是删除的这个对象。
改: set(index, element);
查:get(index);  subList(from.to);  listIterator(); indexOf() 等
List集合特有的迭代器—ListIterator为Iterator的子接口,在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常(并发异常,集合操作和迭代器同时访问引用),所以在迭代器时,只能用迭代器的方法操作,但是Iterator方法是有限的。只能对元素进行判断。取出。删除的操作。如果想要其他如添加。修改操作时。则需要使用到ListIterator进行操作。
public static void main(String[] args) {ArrayList al =new ArrayList();al.add("java01");al.add("java02");al.add("java03");/*Iterator it = al.iterator();while(it.hasNext()){Object obj=it.next();if(obj.equals("java02"))//注意:在迭代过程中,准备添加或者删除元素会出异常。并发修改异常//al.add("java008");it.remove();//移除集合中当前的引用}*/ListIterator li=al.listIrerator();while(li.hasNext()){Object obj=it.next();if(obj.equals("java02")){li.add("java009");//在当前位置添加元素li.set("java006");//修改元素。}}while(li.hasPrevious())//逆向判断。获取元素{System.out.println(li.previous());}}
ArrayList:底层数据结构使用数组结构。初始构造长度为10的空列表。数据超出延迟50%,比vector节约空间。
特点:查询速度很快。增删操作稍慢(插入删除元素。后面所有元素角标都须改变)。
public static void main(String[] args) {method();}public static void method(){ArrayList a=new ArrayList();a.add("java01");a.add("java02");a.add("java03");a.add("java04");//取出数据用迭代器Iterator it=a.iterator();while(it.hasNext()){sop(it.next());}}public static void sop(Object obj){System.out.println(obj);}

Vector:底层数组数据结构。线程同步。被ArrayList所替代。(特有取出方法枚举)
public static void main(String[] args) {Vctor v = new Vector();v.add("java01");v.add("java02");v.add("java03");Enumeration en =v.elements();while(en.hasMoreElements()){System.out.println(en.nextElement());}}
LinkedList:底层数据结构使用链表结构。
特点:增删速度快。查询稍慢。
特有方法:addFirst();  
addLast();
getFirst(); (获取元素但是不删除元素,如果集合没用元素,出现NosuchElementExceptrion) 
getLast();
removeFirst();(获取元素同时删除元素,如果集合没用元素,出现NosuchElementExceptrion)
removeLast();
 在jdk1.6出现了替代方法:
offerFirst();
offerLast();
peekFirst(); (获取元素但是不删除元素,如果集合没用元素,出返回null)
peekLast();
poolFirst();(获取元素同时删除元素,如果集合没用元素,出返回null)
poolLast();
队列数据结构:先进先出
堆栈数据结构:先进后出

练习1.删除ArrayList中重复元素or自定义对象。
思路:创建新集合new。遍历老集合元素。如果new中不包含老集合中的元素。就将其添加到new集合中。new.contains(obj);因为此集合中对比元素是调用对象中的equals方法。所以自定义需要根据实际情况复写equals方法。
import java.util.*;class Person{private String name;private int age;Person(String name,int age){this.name =name;this.age =age;}public boolean equals(Object obj){if(!(obj instanceof Person))return false;Person p = (Person)obj;//System.out.println(this.name+" "+p.name);return this.name.equals(p.name)&&this.age==p.age;}public String getName(){return name;}public int getAge(){return age;}}class Demo1502 {public static void main(String[] args) {ArrayList<Person> ls=new ArrayList<Person>();ls.add(new Person("java02",12));ls.add(new Person("java01",11));ls.add(new Person("java3",13));ls.add(new Person("java04",14));ls.add(new Person("java04",14));System.out.println(ls);ls=single(ls);Iterator<Person> it =ls.iterator();while(it.hasNext()){Person p =it.next();System.out.println(p.getName()+"::"+p.getAge());}}public static ArrayList<Person> single(ArrayList<Person> ls){ArrayList<Person> al = new ArrayList<Person>();Iterator<Person> it =ls.iterator();while(it.hasNext()){Person p =it.next();if(!al.contains(p))al.add(p);System.out.println(p);}return al;}}

Set接口特点:元素是无序的。元素不可重复。集合功能与Collection一致。

HashSet:底层数据结构是哈希表(根据对象建立的哈希值组成的表)。线程非同步。
保证数据唯一性 : 先哈希值相同&&后对象相同。则视为同一对象。一般要复写hashCode();和equals();,哈希值不 同,则不会调用equals。
      注意:不论删除,查询。都依赖元素的hashCode();和equals();。
import java.util.*;public  class HashSetDemo{public static void main(String[] args) {HashSet<Person> ts=new HashSet<Person>();ts.add(new Person("java02",12));ts.add(new Person("java01",11));ts.add(new Person("java03",13));ts.add(new Person("java04",14));ts.add(new Person("java0",14));//System.out.println(ts);Iterator<Person> it =ts.iterator();while(it.hasNext()){Person p = it.next();System.out.println(p.getName()+"::"+p.getAge());}}} class Person {private String name;private int age;Person(String name,int age){this.name =name;this.age =age;}public String getName(){return name;}public int getAge(){return age;}@Overridepublic int hashCode(){return name.hashCode()+age*39;}@Overridepublic boolean equals(Object obj){if(!(obj instanceof Person))return false;Person p = (Person)obj;//System.out.println(this.name+" "+p.name);return this.name.equals(p.name)&&this.age==p.age;}} 
TreeSet:底层数据结构二叉树结构。二叉树结构的集合可以进行对Set集合中的元素进行排序。
保证元素唯一性:依据compareTo方法和比较器comparator。根据第一个参数小于。等于或者大于第二个参数,返回负数,零或者正数。
排序方式一:让元素自身具备比较性,元素需要实现comparabale接口,复写compareTo方法。这种方式也称为默认顺序。
class Demo15 {public static void main(String[] args) {TreeSet<Person> ts=new TreeSet<Person>();ts.add(new Person("java02",12));ts.add(new Person("java01",11));ts.add(new Person("java3",13));ts.add(new Person("java04",14));//System.out.println(ts);Iterator<Person> it =ts.iterator();while(it.hasNext()){Person p = it.next();System.out.println(p.getName()+"::"+p.getAge());}}}class Person implements Comparable<Person>{private String name;private int age;Person(String name,int age){this.name =name;this.age =age;}public String getName(){return name;}public int getAge(){return age;}public int compareTo(Person p){int num= new Integer(this.name.length()).compareTo(new Integer(p.name.length()));if(num==0)return new Integer(this.age).compareTo(new Integer(p.age));return num;}}
排序方式二:当元素自身不具备比较性,或者比较性不是所需要的,这时需要让集合自身具备比较性。在集合初始化时,就有了比较方式。定义比较器,将比较器作为参数传递给TreeSet集合的构造函数。定义一个类。实现Comparator接口,复写compare方法。
import java.util.*;class Person {private String name;private int age;Person(String name,int age){this.name =name;this.age =age;}public String getName(){return name;}public int getAge(){return age;}}class Demo1501 {public static void main(String[] args) {TreeSet<Person> ts=new TreeSet<Person>(new lenCompare());ts.add(new Person("java02",12));ts.add(new Person("java01",11));ts.add(new Person("java3",13));ts.add(new Person("java04",14));System.out.println(ts);Iterator<Person> it =ts.iterator();while(it.hasNext()){Person p = it.next();System.out.println(p.getName()+"::"+p.getAge());}}}class lenCompare implements Comparator<Person>{public int compare(Person p1,Person p2){//根据字符串的长度先排序int num= new Integer(p1.getName().length()).compareTo(new Integer(p2.getName().length()));if(num==0)//长度相同根据自然顺序排序return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));return num; }}


两种排序都可存在。以比较器为主。


Map子类特点
Hashtable:底层是哈希表数据结构。不可存入null键null值。线程同步
HashMap:底层是哈希表数据结构。可使用null键null值。线程不同步。效率高
TreeMap:底层是二叉树结构。线程不同步,可以用于给Map集合中的键进行排序。

添加元素put();会返回上一次键所对应的值,如果添加时出现相同的键。后添加的值会覆盖原有的键值。
元素的获取方法:
keySet:将Map中的所有键存入到Set集合,因为Set具备迭代器。所以可以迭代方式取出所有的键,在根据get方法。获取每一键对应的值。
entrySet:将Map集合中的映射关系的存入到了Set集合中,而这个关系的数据类型就是Map.Entry,通过迭代方式获得映射关系的引用。根据Map.Entry.getKey(); Map.Entry.getvalue(); 取出键和值。(Entry是Map接口中的静态内部接口)
Map<键,值>:键值一对一起存。必须保证键的唯一性。
添加:puc(k key,v value)    put(Map<? extends k,? extends v> m)
删除:clear(); remove(Object key);
判断:containsValue(Object value); containsKey(Object key);isEmpty();
 获取:get(Object key)    size()    values()返回所有元素的集合。
entrySet()  :
import java.util.*;class Student{private int age;private String name;Student(String name,int age){this.name=name;this.age=age;}public String name(){return name;}public int age(){return age;}}class Demo16 {public static void main(String[] args) {Map<Student,String> map =new HashMap<Student,String>();//添加元素put();会返回上一次键所对应的值,如果添加时出现相同的键。后添加的值会覆盖原有的键值。map.put(new Student("java1",11),"di1");map.put(new Student("java2",12),"di2");map.put(new Student("java3",13),"di3"); //将map集合的映射关系取出,存入到set集合中。Set<Map.Entry<Student,String>> entrySet=map.entrySet();Iterator<Map.Entry<Student,String>> it=entrySet.iterator();while(it.hasNext()){Map.Entry<Student,String> me=it.next();//这里必须先获取到it.next();的引用,拿到指针之后,否则报NoSuchElement异常Student key=me.getKey();String value=me.getValue();System.out.println(key.name()+"-"+key.age()+":"+value);}}}


keySet():
import java.util.*;class KeySetDemo {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("02","zhangsan2");map.put("03","zhangsan3");map.put("01","zhangsan1");map.put("04","zhangsan4");//返回的是key类型的set集合Set<String>  keSet=map.keySet();Iterator<String>  it =keySet.iterator();while(it.hasNext()){String key=it.next();//有了键就可以通过map集合的get方法获取其对应的值。String value=map.get(key); System.out.print(key+":"+value);}}}


集合的扩展-集合嵌套:
import java.util.*;class Person{private int id;private String name;Person(int id,String name){this.name=name;this.id=id;}public int hashCode(){return this.name.hashCode()+id*30;}public String getname(){return name;}public int getid(){return id;}public boolean equals(Object obj){Person p=(Person)obj;if(p.id<0||p.id>60)return false;return  this.id==p.id;}}class PersonException extends Exception{PersonException(String message){super(message);}}class Demo1701 {public static void main(String[] args) {        HashMap<String,TreeSet<Person>> xuexiao = new HashMap<String,TreeSet<Person>>();TreeSet<Person> yure = new TreeSet<Person>(new PersonCompare());TreeSet<Person> jiuye = new TreeSet<Person>(new PersonCompare());yure.add(new Person(03,"张三"));yure.add(new Person(02,"小二"));yure.add(new Person(04,"李四"));yure.add(new Person(01,"赵一"));yure.add(new Person(-9,"赵一"));yure.add(new Person(01,"赵一"));jiuye.add(new Person(03,"张三三"));jiuye.add(new Person(02,"小二二"));jiuye.add(new Person(04,"李四四"));jiuye.add(new Person(01,"赵一一"));xuexiao.put("yure",yure);xuexiao.put("jiuye",jiuye);Set<String> keyset= xuexiao.keySet();Iterator<String> it = keyset.iterator();while(it.hasNext()){String s = it.next();TreeSet<Person> ts = xuexiao.get(s);getbanji(ts);}//getbanji(yure);//getbanji(jiuye);}public static void sop(Object obj){System.out.println(obj);}public static void getbanji(TreeSet<Person> ts){Iterator<Person> it = ts.iterator();while(it.hasNext()){Person p = it.next();sop(p.getid()+":"+p.getname());}}}class PersonCompare implements Comparator<Person>{public int compare(Person p1,Person p2){return new Integer(p1.getid()).compareTo(new Integer(p2.getid()));}}





原创粉丝点击