黑马程序员_Java集合

-------    android培训java培训、期待与您交流! ----------

  面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

    对象封装数据,对象多了也需要存储。集合用于存储对象

    对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可变长度的

集合和数组的区别: 

    1:数组是固定长度的;集合可变长度的

    2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型

    3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型

集合容器:

    每一个容器的自身特点不同,每个容器的内部数据结构(存储数据的方式)不同。集合容器在不断向上抽取过程中,出现了集合体系

集合框架的构成及分类

 

Collection接口:

     List(列表)    Set(集)

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

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

1,添加:

    add(object):添加一个元素

    addAll(Collection) :添加一个集合中的所有元素

2,删除:

    clear():将集合中的元素全删除,清空集合

    remove(obj) :删除集合中指定的对象。注意:删除成功,集合的长度会改变

    removeAll(collection) :删除部分元素。部分元素和传入Collection一致

3,判断:

    boolean contains(obj) :集合中是否包含指定元素

    booleancontainsAll(Collection) :集合中是否包含指定的多个元素

    boolean isEmpty():集合中是否有元素

4,获取:

    int size():集合中有几个元素

5,取交集:

    boolean  retainAll(Collection) :对当前集合中保留和指定集合中的相同的元素。如果两个集合元素相同,返回flase;如果retainAll修改了当前集合,返回true

6,获取集合中所有元素:

    Iterator  iterator():迭代器

for(Iteratoriter = iterator();iter.hasNext();  )    

{

  System.out.println(iter.next());

}

Iteratoriter = l.iterator();

while(iter.hasNext())

{

  System.out.println(iter.next());

}

7,将集合变成数组:

    toArray();

              ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快

List:         LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快

                  Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都慢

List集合支持对元素的增、删、改、查

List集合因为角标有了自己的获取元素的方式: 遍历

for(intx=0; x<list.size(); x++){

  sop("get:"+list.get(x));

}

            HashSet: 内部数据结构是哈希表 ,是不同步的

Set:            HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的

                     当元素的hashCode值相同时,才继续判断元素的equals是否为true

                     如果为true,那么视为相同元素,不存;如果为false,那么存储

                     如果hashCode值不同,那么不判断equals,从而提高对象比较的速度

                     LinkedHashSet:有序,hashset的子类

            TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树

哈希表的原理:

1,对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值

2,哈希值就是这个元素的位置。

3,如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础+1顺延。

4,存储哈希值的结构,我们称为哈希表。

5,既然哈希表是根据哈希值存储的,为了提高效率,最好保证对象的关键字是唯一的,  这样可以尽量少的判断关键字对应的对象是否相同,提高了哈希表的操作效率

对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。

对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals方法

 

Map集合:

     Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。

     HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable

     TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排

Map和Collection比较

      Collection一次存一个元素;Map一次存一对元素。

      Collection是单列集合;Map是双列集合。

      Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系,而且唯一

      Map与Collection在集合框架中属并列存在
      Map存储元素使用put方法,Collection使用add方法
      Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

 

Map集合方法摘要:

voidclear()   从此映射中移除所有映射关系(可选操作)。
booleancontainsKey(Object key)   如果此映射包含指定键的映射关系,则返回true
booleancontainsValue(Object value)   如果此映射将一个或多个键映射到指定值,则返回true
Set<Map.Entry<K,V>>entrySet()    返回此映射中包含的映射关系的Set 视图。
booleanequals(Object o)   比较指定的对象与此映射是否相等。
Vget(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null
inthashCode() 还回此映射的哈希码值。
booleanisEmpty()  如果此映射未包含键-值映射关系,则返回true
Set<K>keySet()   返回此映射中包含的键的Set 视图。
Vput(K key,V value) 将指定的值与此映射中的指定键关联(可选操作)。
voidputAll(Map<? extendsK,? extendsV> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)
Vremove(Object key)  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)
intsize()  返回此映射中的键-值映射关系数。
Collection<V>values()  返回此映射中包含的值的Collection 视图。

取出Map集合中所有元素的两种方式:

 keySet()方法:

    可以将map集合中的键都取出存放到set集合中。对set集合进行迭代。迭代完成,再通过get方法对获取到的键进行值的获取。

      SetkeySet = map.keySet();

      Iteratorit = keySet.iterator();

     while(it.hasNext()){

         Objectkey = it.next();

         Objectvalue = map.get(key);

         System.out.println(key+":"+value);

     }

entrySet()方法:

  entry是访问键值关系的入口,是map的入口,访问的是map中的键值对

    SetentrySet = map.entrySet();

        Iteratorit = entrySet.iterator();

        while(it.hasNext()){

            Map.Entry  me = (Map.Entry)it.next();

            System.out.println(me.getKey()+"::::"+me.getValue());

         }

集合使用总结:

      Array就是数组结构,有角标,查询速度很快。

      link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast;removeFirst(); removeLast();getFirst();getLast();

      hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。

      tree就是二叉树,就要想到排序,就想要用到比较。

            比较的两种方式:

               一个是Comparable:覆盖compareTo方法;一个是Comparator:覆盖compare方法。

       LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序

当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合

保证唯一,就用Set。不保证唯一,就用List

Collections:它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法

Collection 和 Collections的区别:

       Collections是个java.util下的,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作

       Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等

Arrays:用于操作数组对象的工具类,里面都是静态方法。

           asList方法:将数组转换成list集合

 

JDK5.0新特性:

    Collection在JDK1.5后出现的父接口Iterable就是提供了这个for语句

增强for循环格式:

      for(数据类型 变量名 : 数组或Collection集合)

    {

      执行语句;

    } 

   简化了对数组,集合的遍历

静态导入:导入了类中的所有静态成员,简化静态成员的书写。

      importstatic java.util.Collections.*;  //导入了Collections类中的所有静态成员

函数的另一种表现形式:

    返回值类型   函数名(参数类型…  形式参数)

     {

    执行语句;

    }

其实接收的是一个数组,可以指定实际参数个数

泛型:

      JDK1.5版本以后出现的一个安全机制。表现格式:< >

  泛型优点:

     1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。

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

只要带有<>的类或者接口,都属于带有类型参数的类或者接口,在使用这些类或者接口时,必须给<>中传递一个具体的引用数据类型

泛型的使用

     当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期

1:泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型;

2:使用带泛型的类创建对象时,等式两边指定的泛型必须一致;原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了

3:等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容)

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值