黑马程序员_集合框架(Collection)集合框架(Map)

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

 集合框架(Collection)——存在工具包中java.util

数组:也可以存对象但固定长度,可以存储基本数据类型; 集合:可变长度,只用于存储对象(可以是不同类型)

为什么这么多容器呢:每一个容器对数据的存储方式都不同,这个存储方式称之为:数据结构

 

集合框架(共性方法)

(1)Add方法的参数类型是Object,以便接受任意类型对象。(2)集合中存储的都是对象的引用(地址)

 

迭代器:

获取迭代器,用于取出集合中的元素        迭代器:就是集合的取出元素的方式

(把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类,而每一个容器的数据结构不同,所以取出的动作细节不一样,

 但有共性内容即判断和取出,那么可以将其共性抽取,那么这些内部类都符合一个规则iterator,如何获取集合的取出对象?通过一个对外提供的方法 iterator():)

 

Collection:定义了集合框架的共性功能。

         |------List(列表):元素是有序的,元素可以重复,因为该集合体系有索引。

                   |--ArrayList:底层是数组数据结构,查询速度很快,但是增删稍慢,线程不同步(线程不同步)

                   |--LinkedList:底层是链表数据结构,查询很慢,增删速度很快。(线程不同步)

                   |--Vector:底层是数组数据结构,和ArrayList一样,但是查询,增删,都很慢,Vector是1.0出现,ArrayList是1.2出现。

                                      (线程同步)但已经不用了。被ArrayList替代了,因为可以自己加锁。

         |------Set(集):元素是无序的(存入和取出顺序不一定一致),元素不可以重复。

                   |--HashSet:底层数据结构是哈希表。

                                               HashSet是如何保证元素唯一性的?通过覆盖2个方法:HashSet和equals来完成

                                               如果元素的HashSet的值相同,才会判断equals是否为true

                                               如果元素的hashcode值不同,不会调用equals

                   |--TreeSet:底层的数据结构是二叉树。线程不同步

                   set集合的功能和ciollection是一致的。

TreeSet集合两种实现排序方式:

自然排序(默认排序):让元素自身具备比较性,元素需要实现comparable接口,覆盖compareto方法

定义比较器:元素自身不具备比较性,或具备的比较性不需要,这时需要让容器自身具备比较性,定义了比较器对象作为参数传递给treeset集合的构造函数

当以上2中排序都存在的时候,以比较器为主

 

泛型:JDK1.5 以后出现的新特性,用于解决安全问题,是一个安全机制。

好处:

1、将运行时期出现的问题(classCastException),转移到了编译时期。

方便于程序员解决问题。让运行时期问题减少,安全。

2、避免了强制转换的麻烦

 

//以下代码是ArrayList集合代码的操作

import java.util.*;

class ArrayL

{

         publicstatic void main(String[] args)

         {

                   ArrayListal = new ArrayList();

                   al.add("java01");

                   al.add("java02");

                   al.add("java03");

                   al.add("java01");

                   al.add("java02");

                   al.add("java06");

                   al.add("java04");    

                   //System.out.println(al.get(1));

                   System.out.println(al);

                   al= singleElement(al);//问题(1):编译不成功提示不兼容类型是怎么回事?

                   //al= al.singleElement();//问题(2):al这个对象为什么有时候放在括号里面,有时又在外面?如下面那个例子???                                                                 //问题已解决

                   System.out.println(al);   

         }

         publicstatic void singleElement(ArrayList al)

         {

                   //定义一个临时容器

                   ArrayListnewAl = new ArrayList();

                   Iteratorit = newAl.iterator();

                   while(it.hasNext())

                   {

                            Objectobj = it.next();

                            if(!newAl.contains(obj))

                            {

                                     newAl.add(obj);

                            }

                   }

                   //returnnewAl;

         }

}

 

 

 

泛型格式:通过<>来定义要操作的引用数据类型。

在使用java提供的对象时,什么时候使用泛型:通常在集合框架中很常见,只要见到<>就要定义泛型

其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可

(静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定可以将泛型定义在方法上原因是静态先加载后有对象)

总结:? 通配符,也可以理解为占位符。

泛型的限定:? extends E:可以接受E类型或者E的子类型。上限

                            ? supper E:可以接受E类型或者E类型的父类型。下限   (泛型高级应用)

 

当自定义对象的时候,通常要做复写hashcode()和equals(),同时实现comparable接口具备默认的比较性——可以存到hashset中或treeset中

 

//以下代码是泛型代码的操作

import java.util.*;

class fanxing

{

         publicstatic void main(String[] args)

         {

                   TreeSet<String>d = new TreeSet<String>();

                   d.add("as");

                   d.add("asbs");

                   d.add("asasd");

                   d.add("asdsas");

                   d.add("adfssss");

                   d.add("asa");

                  

                   Iterator<String>it = d.iterator();

                   while(it.hasNext())

                   {

                            Strings = it.next();

                            System.out.println(s);

                   }       

         }

}

public static voidprintC0ll(ArrayList<?> al)

{

         Iterator<?>it = d.iterator();

}

 

public static <T>voidprintC0ll(ArrayList<T> al)

{

         Iterator<T>it = d.iterator();

}

 

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

map

         |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。JDK1.0.效率低。

                                       注释:为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

         |--HashMap:底层是哈希表数据结构,并允许使用null 值和null键。该集合是线程不同步的。将 Hashtable替代,JDK1.2.效率高。

         |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序

        

Map集合的两种取出方法

1,Set<k> keySet:将Map中所有的键存入到Set集合,因为Set具备迭代器。所以可以迭代方式取出所有的键,再根据get方法获取每个键对应的值

         Map集合取出原理:将Map集合转化成Set集合,再通过迭代器取出。

2Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry

 

(当自定义类的时候可能存在多个对象,一样用到覆盖两个方法equals和hashcode,以及实现(2种方法的任意一种))

 

 

//练习 每一个学生都有归属地,学生属性姓名年龄(学生姓名和年龄相同是同一个人,要保证唯一性)(2种方法)

import java.util.*;

class Student1

{

         publicstatic void main(String[] args)

         {

                   Map<Student,String>map = new HashMap<Student,String>();

                   map.put(newStudent("1",19),"beijing");

                   map.put(newStudent("2",19),"beijg");

                   map.put(newStudent("3",19),"being");

                   map.put(newStudent("4",19),"ijing");

                   /*

         //(1)将map集合转成     Set集合

                   Set<Student>keySet = map.keySet();

                   Iterator<Student>it = keySet.iterator();

                   while(it.hasNext())

                   {

                            Studentkey = it.next();

                            Stringvalue = map.get(key);

                            System.out.println(key+value);

                   }

                   */

         //(2)将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();

                            Studentkey = me.getKey();

                            Stringvalue = me.getValue();

                            System.out.println(key+ value);

                   }                

         }

}

 

class Student implements Comparable<Student>

{

         privateString name;

         privateint age;

         Student(Stringname,int age)

         {

                   this.name= name;

                   this.age= age;

         }

 

         publicString getName()

         {

                   returnname;

         }

         publicint getAge()

         {

                   returnage;

         }

         publicString toString()

         {

                   returnname + age;

         }

 

         publicint hashCode()

         {

                   returnname.hashCode()+age*37;

         }

 

         publicboolean equals(Object obj)

         {

                   if(!(obj instanceof Student))

                            //returnfalse;

                            thrownew ClassCastException("不匹配");

                   Students = (Student)obj;

                   returnthis.name.equals(s.name) && this.age==s.age;

         }

 

         publicint compareTo(Student s)

         {

                   intnum = new Integer(this.age).compareTo(new Integer(s.age));

                            if(num==0)

                                     returnthis.name.compareTo(s.name);

                            returnnum;

         }

}

 

//将在一个字符串中获取字母出现的次数并打印结果a(1)c(2)....

import java.util.*;

class MapT

{

         publicstatic void main(String[] args)

         {

                    String s= charCount("asdafhsjdkgh");

                   System.out.println(s);

                  

                  

         }

         publicstatic String charCount(String str)

         {

                   char[]chs = str.toCharArray();

                   TreeMap<Character,Integer>b = new TreeMap<Character,Integer>();

                   for(int x =0;x<chs.length ;x++ )

                   {

                            Integervalue = b.get(chs[x]);

                            if(value ==null)

                            {

                                     b.put(chs[x],1);

                            }

                            else

                            {

                                     value= value +1;

                                     b.put(chs[x],value);

                            }

                   }

                   System.out.println(b);

                   //returnnull

                   //以下是按照要求结果存起来

                   StringBuildersb = new StringBuilder();

 

                   Set<Map.Entry<Character,Integer>>entrySet = b.entrySet();

                   Iterator<Map.Entry<Character,Integer>>it = entrySet.iterator();

                   while(it.hasNext())

                   {

                            Map.Entry<Character,Integer>me =it.next();

                            Characterkey =me.getKey();

                            Integervalue = me.getValue();

                            sb.append(key+"("+value+")");

                   }

                   returnsb.toString();

         }

 

}

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值