java基础:集合(七)

集 合 类
    集合的概念及框架
    集合API
    Collection接口
    Iterator接口
    List接口
    Comparable接口
    Set接口
    Map接口
    增强的for循环
    泛型(JDK1.5新增)

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

    数组和集合类同是容器,有何不同?
       数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。

    集合类的特点
       集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

集合框架的构成及分类
    JDK提供的集合API位于java.util包内
    Collection接口定义了存取一组对象的方法,有两个子接口:  List(列表) ,Set(集)
             List:可存放重复数据对象,且存取是有序的。
             Set:不可以存放重复数据对象,且存取是无序的。
    Map接口定义了存储“键(key)—值(value)映射对"的方法。

Collection接口定义的方法
int size();
boolean isEmpty();
void clear();
boolean contains(object element);
boolean add(Object element);
boolean remove(Object element);
Iterator iterator();
boolean containsAll(Collection c);
boolean addAll(Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
object[] toArray();

Collection方法举例
   容器类对象在调用remove、contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,
   需要重写equals和hashCode方法以实现自定义的对象相等规则。
-注意:相等的对象应该具有相等的hash codes。
   增加Name类的equals和hashCode方法
		pubic boolean equals(Object obj){
		       if(obj instanceof Name){
			     Name name = (Name) obj;
			     return (firstName.equals(name.firstName))
				       &&(lastName.equals(name.lastName));
			}
			return super.equals(obj);
		  }
		public int hashCode(){
			return firstName.hashCode();
		}
Iterator接口
   所有实现了Collection接口的集合类都有一个iterator方法
   用以返回一个实现了Iterator接口的对象。
   Iterator对象称作迭代器,用以方便的实现对集合内元素  
  的遍历操作。
   Iterator接口定了如下的方法:
boolean hashNext();       //判断游标右边是否有元素
Object next();            //返回游标右边的元素并将游标移动到下一个位置
void remove();          //删除游标左边的元素,在执行完next之后
          //该操作只能执行一次
游标从0开始  Next() 遍历一个个元素

List接口
    List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。
    List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

List接口中常用类
    Vector:线程安全,但速度慢,已被ArrayList替代。
    ArrayList:线程不安全,查询速度快。
    LinkedList:链表结构,增删速度快。
取出LIst集合中元素的方式:
    get(int  index):通过脚标获取元素。
    iterator():通过迭代方法获取迭代器对象。

迭 代
    迭代是取出集合中元素的一种方式。
    因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
    用法:
for(Iterator it=list.iterator();it.hasNext();){
    System.out.println(it.next());
}
Iterator it=list.iterator();
while(it.hasNext()){
     System.out.println(it.next());
}

迭代注意事项
    迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。
    迭代器的next方法是自动向下取元素,要避免出现 NoSuchElementException。
    迭代器的next方法返回值类型是Object,所以要记得 类型转换。
【思考】为什么next方法的返回类型是Object的呢?

List常用算法

    类java.util.Collections提供了一些静态方法实现了基于List 容器的一些常用算法。
    void sort(List)            对List容器内的元素排序
    void shuffle(List)       对List容器内的对象进行随机排列
    void reverse(List)      对List容器内对象进行逆序排列
    void fill(List,Object)   用一个特定的对象重写整个List容器
    void copy(List dest,List src)   将src List容器内容拷贝到 dest List容器
    int binarySearch(List,Object)  对于顺序的List容器,采用折半查找的方法查找特定对象
Comparable接口
    如何确定容器中对象的“大小”顺序问题?
    所有可以”排序“的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法:
   public int compareTo(object obj);
该方法:
-  返回 0 表示  this==obj
-  返回正数  表示  this>obj
-  返回负数   表示  this<obj
    实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式。

set接口
    Set接口是Collection的子接口,set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。
    Set容器可以与数学中的”集合“的概念相对应。
    JDK API提供的Set容器类有HashSet、TreeSet等。

Set接口中常用的类
    HashSet:线程不安全,存取速度快。
-  它是如何保证元素唯一性的呢?
    TreeSet: 线程不安全,可以对Set集合中的
-  它的排序是如何进行的呢?

Set集合元素唯一性原因
    HashSet:   通过equals方法和hashCode方法来保证元素的唯一性。
    TreeSet:    通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。
如何选择数据结构
衡量标准:读的效率和改的效率
    Array读快改慢
    Linked改快读慢
    Hash两者之间

Map集合
    Map与Collection不同
 -  Map与Collection在集合框架中属并列存在
 -  实现Map接口的类用来存储键—值对。
 -  Map存储元素使用put方法,Collection使用add方法
    Map集合存储于取出元素的方式
 -  Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

Map与Collection
    Map集合的特点
             - Map类中存储的键—值对通过键来标识,所以键值不能重复
Object put(Object key,Object value)
Object get(Object key)
Object remove(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
void putAll(Map t)
void clear()

Map集合常用类
    Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
    HashMap:线程不安全,速度快,允许存放null键,null值。
    TreeMap:对键进行排序,排序原理与TreeSet相同。
【练习】自定义一个可以同时存放三元素的Map集合。

集合框架中的工具类
    Collections
-  对集合进行查找
-  取出集合中的最大值,最小值
-  对List集合进行排序
-  ……
    Arrays
-  将数组转成List集合
-  对数组进行排序
-  对组进行二分查找

增强的for循环
    Collection在JDK1.5后出现的,父接口Iterable就是提供了这个for语句。增强的for循环对于遍历array或 Collection相当简便。
    格式:
     for(数据类型 变量名 : 数组或Collection集合){
     执行语句;
     } 
    缺点:
-  数组:不能方便的访问下标值。
    -  集合:与使用Iterator相比,不能方便的删除集合中的内容。
    一言以蔽之,除了简单遍历并读出其中的内容外,不建议使用增强for循环

函数的另一种表现形式  可变参数
    返回值类型   函数名(参数类型…   形式参数){
       执行语句;
   }
    其实接收的是一个数组,可以指定实际参数个数。

泛   型
    JDK1.5以后出现的机制
    泛型出现的原因:
-  装入集合的类型都被当作Object对待,从而失去自己的实际类型。
-  从集合中取出时往往需要转型,效率低,容易产生错误
    解决办法:
 -  在定义集合的时候同时定义集合中对象的类型
    泛型的书写格式见BasicGeneric
 -  可以在定义Collection的时候指定
 -  也可以在循环时用Iterator指定
  详细可参考: 泛型使用详解 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值