集合
数组:
- 固定长度的,数组长度一旦确定这个数组最多存放数量确定无法扩容
- 不是一个类,没有对应的方法,只能手动实现增删改查的方法
什么是集合
我当我们编写程序时,可能不知道对象的数量类型,希望能在任何时候任何地点创建任意数量对象,因此我们需要集合。
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常用的实现类
- ArrayList : 底层以数组结构存放元素
- 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 Type Method and Description default void forEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。 boolean hasNext()
如果迭代具有更多元素,则返回true
。E next()
返回迭代中的下一个元素。default void remove()
从底层集合中删除此迭代器返回的最后一个元素(可选操作)。
子接口: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接口的实现类, 指定排序规则, 指定排序, 更加灵活