黑马程序员-队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培训、期待与您交流! ----------------------
----------------------
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培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员-队Collection集合 Map集合的小总结
- 黑马程序员——java第十四、五、六天:集合框架(一:Collection、Map)
- Java 集合总结(Collection系列与Map系列)
- 黑马程序员--Java笔记10--Collection集合、 Map集合、泛型
- (黑马程序员)Map集合总结
- 黑马程序员——关于Set,List,Map集合的简单总结
- 集合框架总结——Collection、Iterator、List、Set、Map
- 黑马程序员_java_集合框架_Collection_List_Set_Map_泛型
- 黑马程序员-----集合(collection,map)
- 黑马程序员——第七篇:Map集合、collection工具类
- 黑马程序员_java集合(1) Collection & List & Set & Map
- 黑马程序员——JAVA基础——集合---概述、Collection中共性方法、List、Map、工具类Collections和Arrays
- 黑马程序员--(Map与集合框架工具类的知识总结)
- 黑马程序员_java的集合类(对第十四课collection体系集合的总结)
- Java 集合总结(Collection系列与Map系列)
- 黑马程序员——集合——Collection、List、set、Map
- 黑马程序员——Map集合总结
- 黑马程序员——Java学习笔记之11——“Collection集合”总结
- 黑马程序员 Collection 集合的个人总结
- java 集合类(collection(list set) map)学习总结