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

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ---------------------- (1)为什么出现集合类?
    面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储。
    集合就是存储对象最常用的一种方式.
(2)数组和集合都是容器,两者有何不同?
数组长度固定,而集合长度是可变的
数组值可以存储对象,还可以存储基本数据类型;而集合只能存储对象
数组存储数据类型是固定的,而集合存储的数据类型不固定
(3)集合类的特点:
     集合只能存储对象
     集合的长度是可变的

     集合可以存储不同类型的对象

集合collection接口

Collection:

   

List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。

|--- ArrayList

         数据结构:底层的数据结构是数组数据结构。
         特点:是查询速度快(因为带角标),但是增删速度稍慢,因为当元素多时,增删一个元素则所有元素的角标都得改变。 线程:                    线程不同步。
                   长度:默认长度是10,当超过长度时,按50%延长集合长度用来节约空间。
|--- LinkedList

          数据结构:底层数据结构式链表数据结构(即后面一个元素记录前一个。
          特点:查询速度慢,因为每个元素只知道前面一个元素;但增删速度快因为元素再多,增删一个,只要让其前后的元素重新                       相连即可。
          线程:线程是不同步的。  
练习:将一些人的对象存进集合中,要求去掉相同的对象,姓名和年龄相同视为同一个人。
      思路:1,创建一个人的对象,因为要比较年龄和姓名,所以人要具备比较性得复写Object中的equals方法。
            2,将人的对象存入到一个集合中,再从这个集合中取出存入到另一个集合中,如果另一个集合中已经存在这个人的对象就不存,这样就可以去掉重复的人对象。
             3,再将新的集合遍历打印出来即可。  
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))
  throw new RuntimeException("类型不匹配");
Person p=(Person)obj;
return this.name.equals(p.name) && this.age==p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class ArrayListTest4 
{
public static void main(String[] args) 
{
ArrayList ar=new ArrayList();
ar.add(new Person("lisi1",20));
ar.add(new Person("lisi2",22));
ar.add(new Person("lisi3",23));
ar.add(new Person("lisi2",22));
ar.add(new Person("lisi1",21));

ar=method(ar);
Iterator it=ar.iterator();
while (it.hasNext())
{

Object obj=it.next();
//这是因为obj是任意对象,所以在接收人的对象时,要将obj转换成Person对象。
//
Person p=(Person)obj;
sop(p.getName()+":::::"+p.getAge());
}

}
public static ArrayList method(ArrayList ar)
{
//新建立一个容器,将接收到的集合中的元素存入到这个新集合中,如果新集合中已经存在相同的元素则不往新集合中添加
ArrayList newal =new ArrayList();
Iterator it=ar.iterator();
while (it.hasNext())
{
Object obj=it.next();
if(!newal.contains(obj))
newal.add(obj);
}
return newal;
}
public static void sop(Object  obj)
{
System.out.println(obj);
}

 
|--- Vector

        数据结构:底层数据结构是数组数据结构。
         特点:是查询和增删速度都很慢。
         线程:线程同步。
         长度:默认长度是10,当超过长度时,100%延长集合长度。
         取代:Vector功能跟ArrayList功能一模一样,已被ArrayList替代。
     枚举:Enumeration en = v.elements();====>Iterator it =a.Iterator();
          枚举就是Vector特有的取出方式。

Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性,但可以有null元素。

  |---HashSet

       数据结构:底层数据结构是哈希表。
       特点:存取速度快、元素唯一。
       线程:线程不同步。
       保证性元素唯一的原理:是通过元素的两个方法, hashCode()和 equals()来完成。如果元素的 hashCode值相同,才会判                   断 equals是否为 true。如果元素的 hashCode值不同,不会调用 equalsArrayList判断元素是否相同只依赖于 equalsSet判断           元素是否相同依赖于 hashCodeequals。写集合时要覆写 hashCode\equals方法。    

       |--LinkedHashSet:有序,hashset的子类。

     

|---TreeSet
        数据结构:底层数据结构式二叉树。
        特点:元素有序、可以对 Set集合中的元素进行排序。
        线程:线程不同步。
        保证性元素唯一的原理:排序时,当主要条件相同时,一定要判断一下次要条件。当两种排序都存在时,以第二种方式比较器为准。
TreeSet排序的第一种方式:元素本身需要实现 Comparable接口,覆盖 compareTo方法。让元素自身具备比较性,比如八种基本数据类型或则字符串,实现 Compareble接口 ,覆盖 compareTo方法,这种方式也称为元素的自然顺序或者叫默认顺序。
TreeSet排序的第二种方式:另外定义一个类,实现 Comparator接口,覆盖 compare方法。当元素自身不具备比较性 (比如存储学生对象时 )或者具备的比较性不是我们所需要的比较性时 (比如想字符串的长度排序 ),此时就需要让集合自身具备自定义的比较性。那如何让集合自身具备比较性呢?可在集合初始化时,就让集合具备比较方式。即定义一个类,实现 Comparator接口,覆盖 compare方法。
练习:按照字符串的长度时行排序
       思路:1,TreeSet集合中对元素进行比较有两种,一是可以让对象具备比较性,另一中是让集合具备一个比较器。在这个题中我让集合具备一个比较器。
                   2,先按字符串的长度进行比较,如果在长度相等时再按自然顺序时行比较。
     class TreeSetTest3 
{
public static void main(String[] args) 
{
TreeSet tr=new TreeSet(new StringLenthCompara() );
tr.add("bac");
tr.add("b");
tr.add("bacd");
tr.add("bacee");
tr.add("ba");
tr.add("abc");


Iterator it=tr.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
class StringLenthCompara implements Comparator
{
public int compare(Object o1,Object o2)
{String s1=(String)o1;
   String s2=(String)o2;


int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
if (num==0)//次要条件,当长度相同时,按元素的自然内容进行排序.
return s1.compareTo(s2);
return num;
}
}

Map集合:该集合存储的是键值对,而且键是唯一的,Map和Set很像,Set集合底层就是使用了Map集合。Map集合没有迭代器,要取出元素必须先将Map集合转换成Set集合才能遍历元素。Map和Set很像,其实Set底层就是使用了Map集合。

|---HashTable

底层是哈希表数据结构;

不可以使用null键和null值;

用作键的对象必须实现 hashCodeequals方法来保证键的唯一性
线程同步,效率低。
|---HashMap

底层是哈希表数据结构;
允许使用 null键和 null值;线程不同步,效率高;除了这 2点相同外,其余 HashMapHashMap差不多。
保证元素唯一性的原理:先判断元素的 hashCode值是否相同,再判断两元素的 equals方法是否为 true。往 HashSet里面存的自定义元素要覆写写 hashCodeequals方法,以保证元素的唯一性!
|---TreeMap
底层是二叉树结构;
允许使用 null键和 null值;
线程不同步;
可以给 Map集合中的键进行排序。
TreeMap排序的第一种方式 :让元素自身具备比较性,比如八种基本数据类型或则字符串,实现 Compareble接口 ,覆盖 compareTo方法,此方式是元素的自然顺序。
TreeMap排序的第二种方式 :当元素自身不具备比较性 (比如存储学生对象时 )或者具备的比较性不是我们所需要的比较性时 (比如想字符串的长度排序 ),此时就需要让集合自身具备自定义的比较性。那如何让集合自身具备比较性呢?可在集合初始化时,就让集合具备比较方式。即定义一个类,实现 Comparator接口,覆盖 compare方法。
Map扩展
映射关系可以为:一对多、集合的嵌套。

练习:Map集合中对元素的取出有两种迭代方式,分别用两种方式取出集合中的元素。
   class MapDemo3 
{
public static void main(String[] args) 
{
Map<String,String> map=new HashMap<String,String>();
map.put("01","zhangsan 1");
map.put("02","zhangsan 2");
map.put("03","zhangsan 3");
map.put("04","zhangsan 4");
        //第一种: 用entrySet()方法取出集合中键和值的关系对,存入到Set集合中,有了这个关系就可以直接获取键和值
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while (it.hasNext())
{
Map.Entry<String,String> me=it.next();
String key=me.getKey();
String value=me.getValue();
System.out.println(key+"::"+value);
}
               //第二种:先取出集合中的键,将其存入到集合中,再遍历集合获取键的值,有了键的值就可以通过get()方法获取对应的值。
               Set<String> keyset =map.keySet();
//有了set集合,就可以获取其迭代器;
Iterator<String> it=keyset.iterator();
while (it.hasNext())
{
String key=it.next();
//有了键可以通过map集合的get方法获取其对应的值;
String value=map.get(key);
sop("key"+key+",value: "+value);
}
}
}
每种集合都有各自的特点,了解了它们的优缺点后可以更好的选择用哪种集合来操作,在本内容中我没有列出每个集合中操作的方法,只是每个集合都列出了一个基本的操作练习,如想了解它们的具体有哪些操作方法可以查询API文档获取。
---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值