Java基础5 集合

集合

数组:

  1. 固定长度的,数组长度一旦确定这个数组最多存放数量确定无法扩容
  2. 不是一个类,没有对应的方法,只能手动实现增删改查的方法

什么是集合

我当我们编写程序时,可能不知道对象的数量类型,希望能在任何时候任何地点创建任意数量对象,因此我们需要集合。

1.集合只能存放对象

2.可以改编成长度 不限制元素类型,存储任意类类型的数据,也可以限定元素类型

3.集合可以自动扩容、

4.集合类全部支持泛型

集合框架

Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

常用的集合在系统中定义了三大接口

  • java.util.Set接口及其子类,set提供的是一个无序的集合;
  • java.util.List接口及其子类,List提供的是一个有序的集合;
  • java.util.Map接口及其子类,Map提供了一个映射(对应)关系的集合数据结构;

集合类的结构图

在这里插入图片描述

Java的集合框架从整体上可以分为两大家族。

1、 Collection(接口)家族。该接口下的所有子孙均存储的是单一对象。

2、 Map(接口)家族。该接口下的所有子孙均存储的是key-value(键值对)形式的数据。

三个分支:

1、 Iterator(迭代器)家族。主要用于遍历Colleciton接口的及其子类而设计。

2、 Compaator(比较器), 在集合中存储对象时候,用于对象之间的比较

3、 Collecitons是工具类。注意该类名带个s,一般就表示工具类。里面提供了N多静态方法,来对Colleciton集合进行操作。

Collection的集合方法:

增删改查: add() addAll() remove() removeAll() , clear()

辅助方法: size() isEmpty() contains() iterator() toArray()

List

1、 实现List接口的集合类中的元素是有序的,且允许重复

2、 List集合中的元素都对应一个整数型的序号记载其在集合中的位置,可以根据序号存取集合中的元素。

List接口: 可重复, 有序(下标)

多了一组关于下标相关的方法:

add(int index , 元素) 在指定下标插入元素

remove(int index) 删除指定下标的元素

set(int index, 元素) 修改指定下标的元素

int indexOf(元素) 查找第一次出现该元素的下标

Object get(int 下标) 获取指定下标的元素

List常用的实现类

  1. ArrayList : 底层以数组结构存放元素
  2. LinkedList: 底层以双向链表结构存放元素

ArrayList

构造方法

在这里插入图片描述

ArrayList第一次添加元素的时候确定长度(默认是10)

对象比较

理论:两个对象时都是同一个对象: == 和equals()都是在比较地址码一样;

在实际开发中:两个对象是否是同一个对象:如果地址码一样,比较两个对象属性

·hashCode() 哈希算法 得到一个数字·

set中一个对象是否相等:

判断两个对象hashcode是否一样 如果一样进行equals

如果hashcode一样 equals()为true 表示用一个对象

hashcode不一样,不会判断equals(),不是同一个对象

如果hashcode一样,但是equals()不一样 也不是一个对象

ArrayList中一个对象是否相等

调用equals()

调用 对象equlas() 方法判断, 如果equals() 返回true, 表示同一个对象, 与hashCode无关

LinkedList

arrayslist:数组结构 查询效率高,修改效率低

LinkList:链表 查询效率低,修改效率高

Set集合

唯一 无序

Set接口没有提供Collection接口额外的方法,但实现Set接口的集合类中的元素是不

可重复的

场景:去重

常见实现类:

HashSet : 重要的

TreeSet: 可排序的

LinkedHashSet :有次序的

HashSet

借助HashMap, HashSet的存放的元素作为HashMap的key, HashMap的value 静态Object对象

在这里插入图片描述

可以利用构造方法去重

hashset如何判断一个元素存在:

1.首先判断两个对象的hashCode码是否一样,如果不一样就不存在

2.如果hashCode一样,判断equlas()是否true

set无法通过for 循环遍历 因为没有下表

迭代器

jdk专用迭代器用于遍历Collection接口

  • Modifier and TypeMethod and Description
    default voidforEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。
    booleanhasNext() 如果迭代具有更多元素,则返回 true
    Enext() 返回迭代中的下一个元素。
    default voidremove() 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。

子接口:ListIterrator

得到集合的迭代器对象:

list set :

jdk 对迭代器的简化:for each (增强for 循环)

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

每次循环从集合/数组中拿一个元素 赋值给变量

jdk 专门提供的迭代器用于遍历Collection接口的集合(List,Set)

java.util.Iterator接口 遍历List和Set , 只能向下遍历

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

子接口: ListIterator 只能遍历List集合, 向下遍历,向上遍历

在这里插入图片描述

在这里插入图片描述

TreeSet集合

基于一个红黑树的树形结构,所以可以排序

排序

TreeSet可是采用两种方法实现排序:自然排序定制排序

默认情况,TreeSet采用自然排序。

TreeSet调用调用集合元素的CompareTo()方法,根据该方法的返回值来比较元素之间的大小,然后进行“升序”排列,这种排序方式我们称之为自然排列。

​ 注意:==如果想采用自然排序,则要存储的对象所属类必须实现Comparable 接口。==该接口只有一个方法public int compareTo(Object obj),必须实现该方法。

compareTo方法的实现规则:

​ 返回 0,表示 this == obj。//则不会添加新对象

​ 返回正数,表示 this> obj //添加到原来对象的右边

​ 返回负数,表示 this < obj // 添加到原来对象的左边

String 和 八大基本数据类型包装类基本实现排序接口 所以treeSet可以实现自然排序

如果没实现compareble接口而且创建TreeSet对象时没有创建Compare对象,会抛出异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldjy0qgq-1659765253082)(assets/在这里插入图片描述
)]

一旦类写好compareble接口则写排序方法固定无法变更,不灵活

指定排序方式:

JDK提供compareble 接口 不需要元素的类实现

在使用的创建这个Comparator接口的实现类, 指定排序规则, 指定排序, 更加灵活

以treeSet可以实现自然排序

如果没实现compareble接口而且创建TreeSet对象时没有创建Compare对象,会抛出异常

在这里插入图片描述

一旦类写好compareble接口则写排序方法固定无法变更,不灵活

指定排序方式:

JDK提供compareble 接口 不需要元素的类实现

在使用的创建这个Comparator接口的实现类, 指定排序规则, 指定排序, 更加灵活

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值