26集合框架

Java基础——集合框架

1 集合的概念

  • 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的
    功能。
  • 和数组的区别:
    • (1)数组长度固定,集合长度不固定
    • (2)数组可以存储基本类型和引用类型,集合只能存储引用类型

2 Collection接口

2.1 Collection体系集合

image-20220408140442418

2.2 Collection父接口

  • 特点:代表一组任意类型的对象,无序、无下标、不能重复。
  • 方法
boolean add (Object obj) //添加一个对象。
boolean addAll (Collection c) //将一个集合中的所有对象添加到此集合中。
void clear() //清空此集合中的所有对象。
boolean contains (Object o) //检 查此集合中是否包含o对象
boolean equals (Object o) //比较此集合是否与指定对象相等。
boolean isEmpty() //判断此集合是否为空
boolean remove (Object o) //在此集合中移除o对象
int size() //返回此集合中的元素个数。
Object[] toArray() //将此集合转换成数组。

Collection接口的使用 (1)

注意接口不能实例化,在创建集合时可以选择接口下的class,例如

image-20220408141713020

(1)添加元素

image-20220408141811096

结果:

image-20220408141841136

(2)删除元素

image-20220408141913122

(3)遍历元素【重点】

  • 第一种方式:使用增强for(因为collection没有下标的方法,所以不能用for)

image-20220408142137204

结果:

image-20220408142152561

  • 第二种方式:使用迭代器,专门用来遍历集合

collection.iterator()这个方法的返回值就是一个Iterator类型的对象,但Iterator是一个接口

iterator方法

image-20220408142553700

image-20220408142950495

注意:

  1. it.next()默认返回的对象类型是Object,但是由于我们可能知道要遍历的集合的数据类型可以对数据类型进行强转,比如此例中,String s = (String)it.next();
  2. 在迭代过程中是不允许使用collection.remove()方法的,会引起ConcurrentModificationException并发修改异常,要想进行删除可以使用iterator.remove()

image-20220408143558429

(4)判断

image-20220408144113017

判断含不含有西瓜,判断是否为空

结果:true false

Collection接口的使用 (2)

新建一个Student类

(1)创建集合,添加数据

image-20220408150736485

结果:

image-20220408150800267

(2)删除

image-20220408151135389

清除,只是把这三个元素的地址给删掉了,这三个元素还在堆中存在

image-20220408151310970

(3)遍历

  • 第一种方式:使用增强for

image-20220408151502687

结果:

image-20220408151518447

  • 第二种方式:使用迭代器

image-20220408151749807

(4)判断

image-20220408151950909

注意:image-20220408152032771这个一定是false

3 List接口与实现类

  • 特点:有序(添加的顺序和遍历的顺序是一致的)、有下标、元素可以重复。
  • 方法:
void add(int index, 0bject o) //在 index位置插入对象o。
boolean addAll(int index, Collection c) //将一个集合中的元素添加到此集合中的index位置。
Object get(int index) //返回集合中指定位置的元素。
List subList(int fromIndex,int toIndex) //返回fromIndex和toIndex之间的集合元素。

3.1 List 接口使用(1)

(1)添加元素

image-20220408153418304

结果:

image-20220408153454082

(2)删除元素

image-20220408153549773

(3)遍历

第一种方式:使用for

image-20220408153803024

第二种方式:使用增强for

image-20220408153959088

第三种方式:使用迭代器

image-20220408154051025

第四种方式:使用列表迭代器

和Iterator的区别,ListIterator可以向前或向后遍历, 添加,删除,修改元素

由前向后遍历

image-20220408154929883

由后向前遍历

由于在前向遍历时指针已经挪到了最后

image-20220408155902644

结果:

image-20220408155953557

(4)判断

image-20220408160111820

(5)获取位置

image-20220408173556293

3.2 List 接口使用(2)

(1)创建集合并添加数字数据

image-20220408173842589

结果:

image-20220408173948825

注意:添加数字数据的时候隐藏了一个自动装箱的操作,众所周知集合不能添加基本类型,只能添加引用类型

(2)删除操作

删除数字20

image-20220408174427930

正确方法除了采用Index来删除20,还可以采用:

image-20220408174659749

image-20220408174727215

结果:

image-20220408175019535

(3)补充方法subList(fromIndex,toIndex),返回子集合 有头无尾

image-20220408174955396

3.3 List实现类

image-20220408175520296

3.4 ArrayList的使用

创建集合

ArrayList arrayList=new ArrayList<>();
  1. 添加元素:添加三个学生对象

image-20220408175858705

  1. 删除元素

添加:

image-20220408180048963

结果:

image-20220408180129707

删除:

  • 下面操作行不通

image-20220408180349337

因为remove方法是继承了equals方法,equals(this==obj),既然这里的equals上不满足,我们可以对equals进行重写,五步法重写

@override
public boolean equals(Object obj) {
//1判断是不是网-一个对象
	if(this==obj) {
	return true;
    }
//2判断是否为空
	if(obj==nu11) {
	return false;
    }
//3判断是否是Student类型
	if(obj instanceof student) {
		student s=(student)obj;
		//4比较属性
		if(this.name.equals(s.getName())&&this.age=s.getAge()){
            return true;
        }
    }//5不满足就返回false
    return false
}

重写以后,就可以采取上述图的方式进行比较

  1. 遍历元素
  • 使用迭代器

image-20220408181408406

  • 列表迭代器

正序

image-20220408181525656

逆序

image-20220408181545857

  1. 判断

image-20220408181620437

  1. 查找
  2. image-20220408181704956

3.5 Vector使用

image-20220408185907272

image-20220408190002645

image-20220408190107376

3.6 LinkedList

  • 链表结构实现,增删快, 查询慢。

  • 存储结构:双向链表

创建集合:

image-20220408190513439

  1. 添加元素

image-20220408190606744

  1. 删除 linkedList.remove()

image-20220408190816053

  1. 遍历

for遍历

image-20220408190917896

增强for遍历

image-20220408191002377

迭代器

image-20220408191037093

ListIterator

image-20220408191132243

  1. 判断

image-20220408191204346

  1. 获取

image-20220408191225500

3.7 ArrayList与LinkedList的区别

image-20220408192345605

  • ArrayList:必须开辟连续空间,查询快,增删慢。

  • LinkedList:无需开辟连续空间,查询慢,增删快。

4 泛型和工具类

image-20220408200514113

4.1 泛型类

类名<T> T是类型占用符,只能表示一种引用类型,如果编写多个使用逗号隔开

不可以实例化,即new,因为不知道他的构造函数是私有的还是什么情况

不同泛型对象不能相互赋值

如果调用类是不写这个和泛型,说明是Object类型

创建泛型类

image-20220408201028439

使用泛型类创建对象

image-20220408202257826

4.2 泛型接口

接口名

创建泛型接口 不可以用泛型定义变量

image-20220408203300208

实现泛型接口

方式一 给T确定类型

image-20220408203523318

方式二 不给T确定类型

image-20220408203749690

此时导致MyInterfaceImpl2也成了一个泛型类,通过给MyInterfaceImpl2赋值,然后实现接口中的泛型,此时调用

image-20220408203937887

4.3 泛型方法

image-20220408204148256

创建

image-20220408204219476

调用

根据传入的数据的类型自动确定类型

image-20220408204633209

4.4 泛型集合

5 Set接口与实现类

5.1 Set接口概述及使用

  • 特点:无序、无下标、元素不可重复

  • 方法:全部继承自Collection中的方法。

  • 实现类:

HashSet [重点] :

  • 基于HashCode实现元素不重复。
  • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。

TreeSet:

  • 基于排列顺序实现元素不重复。

创建Set类接口并添加数据

image-20220409102658314

删除数据

image-20220409103009698

遍历

image-20220409103111969

判断

image-20220409103139230

5.2 HashSet

image-20220409103301673

  • 代码演示——HashSet集合的使用:

存储结构:哈希表(数字+链表+红黑树)

创建HashSet类接口并添加数据

image-20220409103858014

删除数据

image-20220409103956096

遍历

image-20220409104102988

判断

image-20220409104133706

例子:

image-20220409104838663

Q:怎样使框起来的重复的传不进去

了解HashCode存储过程

image-20220409105156223

解决方式

(1)重写HashCode方法

image-20220409105442790

此时,二者的HashCode值一样,形成链表

(2)重写equals方法

image-20220409105612567

系统提供方法可以自己来重写这两个方法

image-20220409110241334

重写时用到了31,为什么用到了31?

(1)31是一个质数,减少散列冲突(计算出来的HashCode尽量不同)

(2)31提高执行效事image-20220409110442605

5.3 TreeSet

image-20220409110612074

  • 代码演示——TreeSet集合的使用:

存储结构:红黑树

创建TreeSet类接口并添加数据

image-20220409111319246

简单使用

image-20220409113048052

  • 使用TreeSet保存数据

存储结构:红黑树

image-20220409113234064

报错:image-20220409113257515

why:红黑树要比较大小,现在没有比较的标准

要求:元素必须要实现Comparable接口,compareTo()方法返回值为日,认为是重复元素

image-20220409113512981

实现方法:

image-20220409113638664

字符串的comparreTo,return为双目

补充:Comparator接口

TreeSet集合等使用

Comparator :实现订制比较(比较器)

在实例化Comparator时发现:在创建集合的时候,就可以把比较规则告诉他

image-20220409114349024

新建对象时,采用匿名内部类的方法,实现Comparator接口

image-20220409114623335

TreeSet案例

image-20220409114934702

image-20220409115014387

image-20220409115103228

6 Map接口与实现类

image-20220409141845762

6.1 Map父接口

image-20220409142027428

6.2 Map接口的使用

创建与添加元素

  • 加重复的KEY时,后面的会把前面的键值覆盖掉

image-20220409144058664

结果

image-20220409144133879

删除

image-20220409144523322

遍历

方法一:使用keySet

image-20220409145033242

keyset获取的是key

image-20220409150221456

map.get(key)可以通过key获取value

方法二:使用entrySet(效率较高!!!)

image-20220409145308771

map.entrySet返回一个Set类,把他们封装成一个个entry,类型是Map.Entry

一个Map.Entry是一个映射对,包含一个key和value

image-20220409150603875

判断

image-20220409150820824

方法三:使用containsKey方法

// 判断map中是否有key
if(!map.containKey(key)){
    map.put(key,1)//没有则把key存入map中
};

map中的containsKey(Key)方法是判断该key在map中是否有key存在。

6.3 HashMap

image-20220409150936033

image-20220409151138526

使用

image-20220409151530966

结果:

image-20220409151622194

注意:

image-20220409151916355

怎么使他重复的键就加不进去!

使用key"hashcode和equals作为重复,重写hashcode和equals使用快捷键

  • 遍历

image-20220409152424675

image-20220409152447602

  • 判断

image-20220409152535082

结果:true true

源码总结

(1)HashMap刚创建时,table是null, 为了节省空间,工当漆加第一个 元素是,table容量调整为16
(2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。日的是减少调整元素的个数。
(3)jdk1.8当每个链表长度大于8,并且数组元素个数大于等于64时,会调整为红黑树,目的提高执行效率
(4)jdk1.8当链表长度小于6时,调整成链表
(5)jdk1.8以前,链表时头插入,jdk1. 8以后时是尾插入

(6)hashset里面用的就是hashmap的key

6.4 Hashtable与Properties

image-20220409154912159

6.5 TreeMap

image-20220409155151320

image-20220409155545467

image-20220409155646195

image-20220409155758426

7 Collections工具类

image-20220409160235148

image-20220409160457779

结果:

image-20220409160506164

二分查找:

image-20220409160624754

结果:-4 ,没找到

复制:要求前后两个集合的大小一样

image-20220409160809251

list转成数组

image-20220409161217454

结果:Integer[]中的数字小于list长度时与list保持一致

image-20220409161237493

image-20220409161256444

结果:

image-20220409161309672

数组转成集合

image-20220409161457911

结果:集合是-一个受限集合,不能添加和删除

image-20220409161515097

把基本类型数组转成集合时,雷要修改为包装炎型,例如int,不要写int

image-20220409161901315

posted @ 2023-08-18 15:59  努力学技术的小豪  阅读(20)  评论(0)    收藏  举报