Java基础-集合

目录

一、集合继承结构图-——Collection部分

二、集合概述

三、Collection和Iterator

四、List接口

五、Set接口

六、Map接口

七、泛型


一、集合继承结构图-——Collection部分

 集合继承结构图——Map部分

二、集合概述

List:是一个有序集合,可以放重复的数据

Set:是一个无序集合,不允许放重复的数据

Map:是一个无序集合,集合中包括一个键对象,一个值对象,键对象不允许重复

三、Collection和Iterator

Collection List Set 的父接口,在 Collection 中定义了一些主要方法。
接口是抽象的,无法实现实例化
add(E o)确保此 collection 包含指定的元素(可选操作)。
contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
isEmpty() 如果此 collection 不包含元素,则返回 true。
remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存 在的话(可选操作)。
size() 返回此 collection 中的元素数。
关于 Iterator 接口说明,Iterator 称为迭代接口,通过此接口可以遍历集合中的数据,此接口主要方法为:
hasNext() 如果仍有元素可以迭代,则返回 true。
next() 返回迭代的下一个元素。
获取集合中迭代器对象
Iterator iter = l.iterator();
while (iter.hasNext()) {
Integer v = (Integer)iter.next();
System.out.println(v);
}

四、List接口

概述

List接口主要实现ArrayList和LinkedList,都是有顺序的,也就是放进去是什么顺序,取出来还是什么顺序,也就是基于线性存储,可以看作是一个可变数组

ArrayList :查询数据比较快,添加和删除数据比较慢 ( 基于 可变 数组 )
LinkedList :查询数据比较慢,添加和删除数据比较快(基于链表数据结构)
//最好不要这样写,这样属于面向具体编程了
//无法达到灵活互换
//最好面向接口编程
ArrayList arrayList = new ArrayList();
//采用面向接口编程
//使用 Collection 会更灵活,如果 List 不能满足要求
//那么可以采用 HashSet,因为 HashSet 也实现了该接口
Collection c = new ArrayList();
//面向接口编程
//采用 list 接口可以使用 Collection 里的方法
//也可以使用 list 接口扩展的方法
List l = new ArrayList();


将HashSet转化成List集合

collection c=new Hashset();

List mylists=new ArrayList();

LinkedList

//最好不要这样写,这样属于面向具体编程了
//无法达到灵活互换
//最好面向接口编程
LinkedList arrayList = new LinkedList();
//采用面向接口编程
//使用 Collection 会更灵活,如果 List 不能满足要求
//那么可以采用 HashSet,因为 HashSet 也实现了该接口
Collection c = new LinkedList();
//面向接口编程
//采用 list 接口可以使用 Collection 里的方法
//也可以使用 list 接口扩展的方法
//List l = new ArrayList();
//因为 LinkedList 和 ArrayList 都实现了 List 接口,所以我们可以灵活互
换
//直接修改为 LinkedList,对我们的程序没有任何影响
List l = new LinkedList()

五、Set接口

哈希表是一种数据结构,哈希表能够提供快速存取操作。哈希表树基于数组的,数组一旦被创建就不能扩展。如果数组中的元素值和下标能够存在明确的对应关系,那么通过数组元素的值就可以换算出数据元素的下标,通过下标就可以快数定位数组元素,这样的数组就是哈希表。

HashSet

HashSet 中的数据是无序的不可重复的。 HashSet 按照哈希算法存取数据的,具有非常好性能。 工作原理 ,当向 HashSet 中插入数据的时候,他会调用对象的 hashCode 得到该对象的哈希码,然后根据哈希码计算出该对象插入到集合中的位置。
equals 和 hashCode
equals ()方法是用来判断其他的对象是否和该对象相等。很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。基本类型是进行值的比较。
加入了重复的数据,因为 hashCode 是不同的,所以会根据算出不同的位置
hashCode 相同,当两个对象的 equals 不同,所以认为值是不一样的,那么 java 会随机换算出一个新的位置,放重复数据
特别是向 HashSet 或 HashMap 中加入数据时必须同时覆盖 equals 和 hashCode 方法,应该养成一种习惯覆盖 equals 的同时最好同时覆盖 hashCode。
两个对象 equals 相等,那么它的 hashcode 相等
两个对象 equals 不相等,那么它的 hashcode 并不要求它不相等,但一般建议不相等
hashcode 相等不代表两个对象相等(采用 equals 比较)
TreeSet
可以对Set集合进行排序,默认自然排序(即升序),排序只能对一种类型。
import java.util.*;
public class TreeSetTest01 {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(9);
set.add(2);
set.add(5);
set.add(1);
//不能放入重复数据
set.add(5);
for (Iterator iter=set.iterator(); iter.hasNext();) {
Integer v = (Integer)iter.next();
System.out.println(v);
} } }

将person放到 TreeSet TreeSet 会对其进行排序,那么必须实现 Comparable 接口,

实现Comparable接口完成排序/实现Comparator接口完成排序

实现 Person 的比较器
Comparator 和 Comparable 的区别?
Comparable 是默认的比较接口,Comparable 和需要比较的对象紧密结合到一起
Comparator 可以分离比较规则,所以它更具灵活性

六、Map接口

Map 中可以放置 键值对 ,也就是每一个 元素 都包含键对象和值对象, Map 实现较常用的为
HashMap HashMap 键对象 的存取和 HashSet 一样,仍然采用的是 哈希算法 ,所以如果使用
自定类作为 Map 的键对象,必须复写 equals hashCode 方法。
Map接口常用的方法:
Map和Collection没有继承关系
Map集合以key和value的方式存储数据:键对值
key和value都是引用类型,key和value都是存储的对象的内存地址,key起到主导的地位,value是key的附属品
常用方法:
获取所有value
Collection <String>values=map.value();
    for(String s:values){
        System.out.println(s);
    }
采用entrySet遍历Map
Set entrySet = map.entrySet();
for (Iterator iter=entrySet.iterator(); iter.hasNext();) {
    Map.Entry entry = (Map.Entry)iter.next();
    System.out.println(entry.getKey() + ", " + entry.getValue());
}

获取key值

Set<Integer>keys=map.keySet();
Iterator<Integer> it =keys.iterator();
while(it.hasNext()){
    Integer key=it.next();
    String value=map.get(key);
    System.out.println(key+"="+value);
}

七、泛型

泛型能更早的发现错误,如类型转换错误,通常在运行期才会发现,如果使用泛型,那么在编译期将会发现,通常错误发现的越早,越容易调试,越容易减少成本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值