有容乃大--Java 集合(List/Set/Map)

Day-19-集合--list

  1. 常见数据结构

①基于数组和链表的数据结构对链表的操作

  1. 添加: 数组复制创建新数组,  链表直接挂在尾端 :基于数组慢,变量链表快
  2. 删除: 数组需要复制数据      链表直接改变链接 : 基于数组慢,变量链表快  
  3. 修改: 数组直接找到索引位置  链表需要遍历链表 : 基于数组快,变量链表慢
  4. 查找: 数组直接找到索引位置  链表需要遍历链表 : 基于数组快,变量链表慢

 

增加   删除    修改    查找

基于数组     慢     慢      快      快   

变量链表     快     快      慢      慢

 

②集合框架

1.什么是集合:看成是一些容器

装数据,感觉容器是一种高级数组, 集合相比数组而言,还要高级一点,集合可以存储任意多个任意类型的数据.

arrayList的使用

ArrayList() 构造一个初始容量为 10 的空列表。

  ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。

 

  ArrayList list = new ArrayList();

 

  1. 集合的基本用法
  •  boolean  add(E e) 添加元素

 size() 获取元素的个数

boolean  contains(Object o) 如果此列表中包含指定的元素,则返回 true

E get(int index)   返回此列表中指定位置上的元素。

E remove(int index) 移除此列表中指定位置上的元素

boolean remove(Object o) 移除此列表中首次出现的指定元素

 

E set(int index, E element)

③变量集合

  1. for循环
  2. 增强for循环
  3. 迭代器遍历
  1. 得到迭代器

ArrayList list = new ArrayList();

Iterator iterator = list.iterator();

  1. 迭代器遍历数据:迭代器相当于得到了集合的一个副本
  2. 迭代器中提供的方法
    1. next()      返回迭代的下一个元素。
    2. remove()   从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)
  3. 双向迭代

ListIterator迭代

  1.  ListIterator lit = ages.listIterator();
  2.  ListIterator 中的方法
  1. hasNext(),next()方法
  2. hasPrevious()是否有上一个元素,返回boolean类型
  3. previous()获取一个元素
  1. LinkedList--双向迭代器
  1.  LinkedList() 构造一个空列表;
  2.  LinkedList(Collection  e) 构造一个包含指定collection中的元素的列表;
  1. addFirst(E e) 将指定元素插入此列表的开头

element()    获取但不移除此列表的头(第一个元素)。

peek()     获取但不移除此列表的头(第一个元素)。

 

  1. element方法与 peek 方法唯一的不同在于:如果此双端队列为空,它将抛出一个异常。
  2. peek方法 :如果此双端队列为空,则返回 null;

 

 poll()      获取并移除此列表的头(第一个元素)

 pop()        从此列表弹出一个元素。

 

  1.  poll():    如果此列表为空,则返回 null
  2.  pop():     如果此列表为空 抛出NoSuchElementException

 

集合框架--set

 

 

2.不重复元素的容器

2.1 如何自定义不能存放重复元素的容器

  1. 现在需要我们自己设计一个容器类,不能够添加重复元素(如果元素重复了就添加不进去)
  2. 在前面我们设计的基于数组的自定义容器类的基础上改版
  3. 需要在add方法内部判断重复
  4. 如何判断:

每一次调用add会传入一个参数: 用户希望添加的元素  ele

遍历内部的数组,判断数组中是否包含ele

  1. HashSet

3.1 语法特点:不重复,无序(不保证和添加顺序一致)

3.2.判断重复的方式

① 通过添加进去的元素的hashCode+eqauls  两者进行比较

② 如果两个对象的hashCode相等  并且 两个对象调用equals结果是true  才认为两个元素重复

  1. 应该怎么做: 在Student中覆写hashCode 和equals方法

2.覆写的时候应该参考实际业务中的比较规则,例如姓名,年龄等(还得看Student类中有哪些字段,并且这些字段是业务人员判断的标准)

自动生成:

  1. TreeSet

4.1 语法特点

无序:不保证(不记录)我们的添加顺序;但是可以保证添加里面元素是有序的。

4.2自然排序与定制排序(比较器)

  1. 自然排序
  2. 从TreeSet的API文档中点击 “自然排序”  ---》 Comparable接口中

理解:

如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序

可以自定义排序的逻辑

2.定制排序(比较器)Comparator

  1. 上面的示例设计有点问题:Student类中覆写的compareTo方法按照年龄从小到大排列的,万一有的人也是用我们的Student,希望年龄从大到小进行排列,怎么办?

不管Student里面使用何种规则都不能满足所有的人

  1. 解决办法: 可以给TreeSet单独的提供一个比较器(理解为比较的一个工具)
  2. Comparator 是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);

自定义一个类实现Comparator接口,其中写比较规则  ---》 比较器的模板

4.3判断重复的标准

  1. 如果采用的是自然排序调用对象的compareTo方法,如果返回0 表示相等;

如果使用的定制排序(比较器),调用比较器的方法compare 返回0 表示相等;

  1. Collection体系

6.1 重点

  1. HashSet和TreeSet的基本使用
  2. 理解TreeSet和HashSet判断重复的实际开发场景以及标准
  3. Set体系结构

       Collection(集合)

       |---List(有序(添加顺序和存放顺序一致)可重复)

       |---Set(无序不可重复)

       |------HashSet  hashCode&equals

       |------TreeSet(添加进去内容可以进行排序)  无序是指添加顺序和存放顺序,有序只是指里面内容是排序的。 自然排序,定制排序

 Map集合和泛型

  1. Map
  • 什么是map?

存放对应关系的一种数据结构,简单理解成是映射

  1. Map :映射到的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
  2. 现在需要创建一个Map对象,装里面的数据,但是发现Map是接口,应该怎么创建对象?
  3. 使用实现类 HashMap 创建对象;

② put方法

put(K key, V value)  在此映射中关联指定值与指定键。

put方法特点:

  1. 如果key不存在,直接添加进去
  2. 如果key相同,value值使用最新的值替换key对应的老值.

put方法会返回 对应key对应的老值

③ 其余方法

 boolean containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true

 boolean  containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true

 get(Object key)  返回指定键所映射的值。通过键得到值

remove(Object key)  从此映射中移除指定键的映射关系(通过key ,找到value,然后把一对键和值都删掉

  • map的特点

Map特点:

一个Map对象中不能有重复的键

使用key作为判断重复的标准.只拿key 和已经存在的一对一对key进行比较;就少拿了一个value而已;这个原理和HashSet,TreeSet一样。设计Map的时候,并没有说具体按照什么进行判断重复,而是通过实现类进行判断;

Map 里面的方法:

 

 

entrySet()  返回Set,(返回当前Map中所有的entry对象,使用Set存储起来。)

keySet()    返回Map当中所有的key,存储到一个Set集合当中。

values()    返回所有的values,存储到一个Collection。

get(Object key)  返回Collection,通过key查找对应的值。

③Map两种遍历方式

 

 

    方式一:----------------------------------------------------->

    ①先得到所有key,怎么得到?

    通过keySet方法取到

    ②然后遍历keySet,依次通过key来查找value。

    通过Object get(Object key)方法;

   

    方式二:----------------------------------------------------->

    ①先得到所有的Entry对象,Entry对象就包装了key,values,

    ②遍历Entry对象的集合,然后依次从Entry对象中调用方法:

     getKey(),getValue()

 

 

转载于:https://my.oschina.net/u/4083690/blog/3027900

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值