黑马程序员-队Collection集合 Map集合的小总结

来源:互联网 发布:怀念林正英软件 编辑:程序博客网 时间:2024/06/05 19:26
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

Collection集合对象都可以被直接print打印出来。Collection的子类:

|--List:元素有序,元素可重复,该集合有索引
|--ArrayList:底层使用的是数组结构,查询快,增删慢。线程不同步。构造时给10个空间,存储超过后,按照每次增加50%的速度增加空间
|--LinkedList:使用链表数据结构,增删快,查询慢
|--Vector:底层是数组数据结构,和ArrayList比起来,同步,慢。被VectorArrayList替代了。构造时给10个空间,存储超过后,按照每次增加100%的速度增加空间
|--Set:元素无序,元素不可重复
List特有方法:凡是可以操作角标的方法都是该体系特有的方法:

add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index);
subList(from,to);
listIterator();
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生异常。所以在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口ListIterator。该接口只能通过List集合的ListIterator方法获取。

 Vector:
枚举(Enumeration对象的方法,Enumeration是Vector的对象)是Vector特有的取出方式,其实和迭代器时一样的,只是枚举的名称以及方法名称都过长,所以被迭代器取代,郁郁而终。


 LinkedList:链表类型的集合
LinkedList特有方法
addFirst();
addLast();
getFirst();
getLast();获取元素
removeFirst();获取元素,但元素被删除
removeLast();

jdk1.6之后的替代方法
offerFirst()添加元素
offerLast()
peekFirst()获取元素但不删元素,没元素返回null
peekLast()
pollFirst()获取元素再删元素,没元素返回null
pollLast()

/*将自定义对象作为元素存入到ArrayList集合中,并去除重复元素,比如存入人对象,同姓名同年龄是同一个人*/public class ArrayListTest2 {public static void main(String[]args){Person1 a=new Person1("zhangsan",1);Person1 b=new Person1("lisi",2);Person1 c=new Person1("zhangsan",2);Person1 d=new Person1("lisi",2);ArrayList arr=new ArrayList();arr.add(a);arr.add(b);arr.add(c);arr.add(d);System.out.print(zhengli(arr));}public static ArrayList zhengli(ArrayList arr1){ArrayList arr=new ArrayList();Iterator it=arr1.iterator();Iterator it1=arr.iterator();while(it.hasNext()){Object obj=it.next();while(it1.hasNext()){Object obj1=it1.next();if(!((Person1) obj).equals((Person1)obj1)){arr.add((Person1)obj1);}}} return arr;}}class Person1{public String name;private int age;public  Person1(String name,int age){this.name=name;this.age=age;}public boolean equals(Person1 p){return ((this.name.equals(p.name)) && (this.age==p.age));}}


Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。Set集合的功能和Collection是一致的。
HashSet:底层数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equeals方法是否为true。
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的HashCode值不同,不会调用equals。
HashSet中元素复写equals方法的参数必须是Object类对象。这里重写的是Object的equals 方法,如果参数不是Object类型,相当于只是重构,hashSet在执行判断时候还是去找Object类的equals方法。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。 
ArrayList中元素判断关系依赖equals,HashSet中元素判断依赖关系先依赖hashcode再依赖equals。
TreeSet:可以对Set集合中的元素进行排序(依据是ASKII码表)。底层数据结构是二叉树。
TreeSet集合中的元素为自定义对象时,此自定义类需要实现Comparable接口,重写compareTo(Object obj)方法,。此方法返回值为this-obj的int类型。compareTo中this是当前新进入TreeSet的元素,obj是以TreeSet中的元素。保证元素唯一性的依据:return 0;
第二种比较方式:当元素自身不具备比较性时,或者具备的比较性不是所需的。这是就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。需要定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
定义一个类,实现Comparator接口,覆盖int compare(Object o1,Object o2)方法。在compare()方法中对两个对象做比较,返回正负0即可。在TreeSet初始化时候将此类对象实例化传入TreeSet构造函数做参数即可。

当使用第二种比较方式时,将不再进行元素已定义的compareTo的比较了(如果定义了compareTo的话)。也就是说TreeSet的比较性比元素的比较性等级要高。

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

public class TreeSetDemo {public static void main(String[]args){TreeSet tr=new TreeSet();tr.add(new Students("zhangsan",1));tr.add(new Students("lisi",2));tr.add(new Students("wangwu",3));tr.add(new Students("zhangsan",2));tr.add(new Students("lisi",2));tr.add(new Students("wangwu",2));tr.add(new Students("wangwu",2));Iterator it=tr.iterator();while(it.hasNext()){Students s=(Students)it.next();System.out.println(s.getname()+".........."+s.getage());}}}class Students implements Comparable{private String name;private int age;Students(String name,int age){this.name=name;this.age=age;}public String getname(){return this.name;}public int getage(){return this.age;}public int compareTo(Object obj){Students st=(Students)obj;if(this.age<st.age)return -1;else if(this.age>st.age)return 1;else return this.name.compareTo(st.name);}}

Map的子类:
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值的情况。该集合线程同步。
|--HashMap:底层是哈希表数据结构。允许使用null键,null值的情况。不同步。
|--TreeMap:底层二叉树数据结构。线程不同步。可以对map集合中的键排序。
其实,Set底层就是使用了Map集合。 

1添加
 put(K key,V value)如果键V已存在,返回原来键V的值,并覆盖为新值。V不存在则直接返回null并存新键值 
 putAll(Map<? extends K,? extends V> m)
2删除
 clear()
 remove(Object key)按键删除并返回相应的值
3判断
 containsValue(Object value)
 containsKey(Object key)
 isEmpty()
4获取
 get(Object key)
 size()
 values()获取map集合中所有的值。返回的是一个Collection<V>
 entrySet() 将map集合中的映射关系取出存入Set集合,这个关系就是Map.Entry类型。那么关系对儿Map.Entry获取到后,就可以通过Map.Entry中的getKey和getValue方法获取键和值。map本身是个接口,Entry是map的一个静态内部接口。Set集合可以通过Iterator或者高级for循环进行迭代。
 keySet() 将map中所有的键存入到Set集合。因为Set具备迭代器。所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。Set集合可以通过Iterator或者高级for循环进行迭代。

Iterartor只能用于Set集合,不能用于Map集合。如果需要遍历,就调用entrySet()和keySet()方法将内容调入Set集合,然后用Iterator遍历Set集合。

/*asdfjfdoigupognjdfglksdnflgjaeiouygt 获取该字符串中字母出现次数 * 希望打印结果  a(次数)b(次数)... * 说明字母和次数之间有映射关系。可选择映射关系 * */ import java.util.Map.Entry;public class TreeMapTest2 {static String a="asdfjfdoigupognjdfglksdnflgjaeiouygt";static TreeMap<Character,Integer>tm=new TreeMap<Character,Integer>() ;static int num;public static void main(String[]args){Set<Character>set=tm.keySet();for(int i=0;i<a.length();i++){char ch=a.charAt(i);//字符串中当前指定的字符if(set.contains(ch)){int x=tm.get(ch);x++;tm.put(ch, x);num++;}else {tm.put(ch,1);num++;}}Set<Map.Entry<Character, Integer>> me=tm.entrySet();Iterator<Map.Entry<Character, Integer>>it=me.iterator();while(it.hasNext()){Map.Entry<Character, Integer> x=it.next();System.out.print(x.getKey()+"("+x.getValue()+")");}}}



Collections用于操作List的工具类。
      Arrays:用于操作数组的工具类。
Arrays里面有一个Arrays.asList(arr)方法,是把数组arr转化为List对象,可以使用集合的思想和方法来操作数组中的元素。注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。如果数组中的元素是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素是基本数据类型,那么会将该数组作为集合中的元素存在。
集合变数组,Collection接口中的toArray方法。
1 指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。当指定类型的数组长度大于了集合的size,就不会新创建数组。而是使用传递进来的数组。所以创建一个刚刚好的数组最优。
2 为什么要将集合变数组?
为了限定对元素的操作。不需要进行增删。


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击