容器

一、容器与数组的比较
数组是一种简单的线性序列,可以快速的访问数组元素,效率高;如果从效率和类型检查的角度讲,数组是最好的。但是数组一旦确定,不能改变,不够灵活。
容器的容量是可以随时扩充的,用以装载所需对象。
二、容器分类
1.Collection接口是一组允许重复的对象。
 Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制。
 List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素,不会重新排列。
2. Map 接口是一组成对的键值对象,即所持有的是 key-value pairs。Map 中不能有重复的 key。拥有自己的内部排列机制。
 容器中的元素类型都为引用类型,不能放置原生数据类型(使用装箱即可),使用泛型保留类型
三、Collection
表示一组对象,它是集中,收集的意思,就是把一些数据收集起来,Collection
接口的两个子接口:
 Set 中的数据没有顺序,不可重复;
 List 中的数据有顺序,可重复。
常用的方法:
add(E e) 确保此 collection 包含指定的元素(可选操作)。
contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
equals(Object o) 比较此 collection 与指定对象是否相等。
hashCode() 返回此 collection 的哈希码值。
isEmpty() 如果此 collection 不包含元素,则返回 true。
iterator() 返回在此 collection 的元素上进行迭代的迭代器。
remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
size() 返回此 collection 中的元素数。
toArray() 返回包含此 collection 中所有元素的数组。
四、泛型< >
1.为什么需要泛型?
 JDK1.4 以前类型不明确:
 装入集合的类型都被当作 Object 对待,从而失去自己的实际类型。
 从集合中取出时往往需要转型,效率低,容易产生错误。
2.泛型的好处:增强程序的可读性和稳定性; 使用泛型,保留了容器中元素的类型,安全省心的使用容器。注意:没有必要引入泛型的复杂性。
五、Iterator 接口
为了遍历容器方便,所有实现了 Collection 接口的容器类都有一个 iterator 方法用以返回一个实现了 Iterator 接口的对象。Iterator 对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
使用迭代器时,分三步走策略:
第一步:获取对象
第二步:判断是否存在下一个
第三步:获取元素
六、Set 接口
Set 接口中的元素无序不可重复:不包含重复元素,最多包含一个 null,元素没有顺序 。 HashSet 是 Set 接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。 使用重写 equals 和 hashcode 来实现自定义的类型的去重。Java 中规定,两个内容相同的对象应该具有相等的 hashcode
Collection 类对象是否相等对象在调用 remove、contains 等方法时需要比较,这会涉及到对象类型的 equals 方法和 hashCode 方法;对于自定义的类型,需要重写 equals 和 hashCode 方法以实现自定义的对象相等规则。
equal 和 hashcode 的关系和原理:

  1. Hashcode 并不是内存地址,是内存地址转换而来的。系统通过它也可以确定
    内存地址。
  2. hashcode 方法主要用在集合框架中,目的是为了快速比较两个对象是否相等,
    因为集合框架中的对象很多,每个都使用 equals 比较效率很差。
    每个对象都有一个 hashcode,规定:
    1、内容相同的对象 hashcode 肯定相等
    2、内容不相同的对象 hashcode 可能相等也可能不相等
    所以如果两个对象的 hashcode 不相等则两个对象的内容肯定不相等,这样就不必一个
    一个去比较属性的值了,从而提高对象比较的速度。
    七、List 接口
    1.List接口,位置有序允许元素重复。多了一些关于位置(顺序)的方法
    add(E e) 向列表的尾部添加指定的元素(可选操作)。
    add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。
    contains(Object o) 如果列表包含指定的元素,则返回 true。
    equals(Object o) 比较指定的对象与列表是否相等。
    get(int index) 返回列表中指定位置的元素。
    indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
    isEmpty() 如果列表不包含元素,则返回 true。
    remove(int index) 移除列表中指定位置的元素(可选操作)。
    set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。
    size() 返回列表中的元素数。
    toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
    2.ArrayList
    ArrayList 是 List 的子类,它和 HashSet 相反,允许存放重复元素,因此有序。集合中元
    素被访问的顺序取决于集合的类型。如果对 ArrayList 进行访问,迭代器将从索引 0 开始,
    每迭代一次,索引值加 1。然而,如果访问 HashSet 中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元
    素被访问的次序。
    3.LinkedList、ArrayList和Vector的比较
    LinkedList:底层用双向链表实现的 List。特点:查询效率低,增删效率高,线程不安全。
    ArrayList:底层用数组实现的 List。特点:查询效率高,增删效率低,线程不安全。
    Vector:底层用数组实现的 List,特点:线程安全。
    八、Queue 接口
    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后
    端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列
    中没有元素时,称为空队列。
    在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元
    素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)
    的线性表。
    在 java5 中新增加了 java.util.Queue 接口,用以支持队列的常见操作。该接口扩展了
    java.util.Collection 接口。
    Queue 使用时要尽量避免 Collection 的 add()和 remove()方法,而是要使用 offer()
    来加入元素,使用 poll()来获 取并移出元素。它们的优点是通过返回值可以判断成功与否,
    add()和 remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
    element()或者 peek()方法。
    值得注意的是 LinkedList类实现了 Queue 接口,因此我们可以把LinkedList 当成 Queue来用。
    九、Collections 工具类
    类java.util.Collections提供了对容器操作的工具方法,与 Arrays使用差不多。
    void sort(List) //对 List 容器内的元素排序,按照升序进行排序。
    void shuffle(List) //对 List 容器内的元素进行随机排列
    void reverse(List) //对 List 容器内的元素进行逆续排列
    void fill(List, Object) //用一个特定的对象重写整个 List 容器
    int binarySearch(List, Object) //采用折半查找的方法查找特定对象
    十、Map 接口
    HashMap 可以说是 Java 中最常用的集合类框架之一,是 Java 语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常开发。实现 Map 接口的类用来存储键(key)-值(value)对,Map 类中存储的键-值对通过键来标识,所以键值不能重复。
    Map 接口的实现类有 HashMap 和 TreeMap 等。
     HashMap: 线程不安全,效率高. 允许 key 或 value 为 null
     HashTable:线程安全,效率低. 不允许 key 或 value 为 null
     Properties: Hashtable 的子类,key 和 value 都是 string
    put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
    get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
    remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
    keySet() 返回此映射中所包含的键的 Set 视图。
    size() 返回此映射中的键-值映射关系数。
    十一、Properties
    Properties为Hashtable的子类,要求键与值只能为字符串 ,不能为null,长与 配置文件(与外界交互的信息) 即内存与存储介质(文件、数据库、网络、服务器内存等)交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值