您的位置:首页 > 职场人生

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

2013-12-10 21:03 459 查看
4000

----------------------
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培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: