JAVA总结 DAY015 1101

DAY015

一、集合

1.对象类型的数组
1、定义一个数组,数组元素的类型是引用数据类型
2、这种数组称为对象数组,数组中的每个元素其实都是一个对象的地址,而非对象本身

2.集合的由来
1、对象数组的不足:
无法扩展:数组本身的长度是固定的,一旦创建,就无法修改
结果:每次要添加一个新元素的时候,就需要创建一个新的数组,长度为原来的数组长度+1,将原来数组中的所有元素都拷贝到新数组中,添加自己要添加的那个新元素。
这些操作和真正的业务逻辑无关
2、解决:
将对象类型的数组,变成某个类型的私有成员变量
对于数组的各种操作,都封装成公有的方法
如果要添加一个元素,底层的数组拷贝,次数较少,对调用者透明,也就是底层数组的拷贝调用者感知不到,只能感知到这个类型是一个可以伸缩的容器

还在数组的操作上,增加了很多功能

上面提到的【某个类型】,就是集合

3.集合和数组的区别
1、共同点:
都是用于存储数据的容器
一大堆零散的变量,不太好进行统一的操作
使用容器的原因,就是希望使用有规律的索引、操作方式,操作那些没有规律的元素
2、不同点:
1、存储内容的不同:
数组既可以存储基本类型,也可以存储引用类型
集合只能存储引用类型,如果需要存储基本类型,其实里面存的是包装类对象
2、存储数量的不同:
数组的长度不可变,一旦确定大小就无法增删
集合的长度可变,是一个可以伸缩的容器
3、方法不同:
数组中只有Object中定义的方法,以及有一个length属性
集合中可以有很多方法

4.集合的体系结构
1、集合分类:
单列集合:每个元素都是一个单独的个体
双列集合:每个操作都是针对一对数据来进行的,一对数据作为一个单位
2、单列集合的体系:
Collection 单列集合的顶层接口

  • List 有序的子接口

      	ArrayList 	 	 	顺序存储,查询修改快
      	LinkedList				链式存储,增加删除快
      	Vector 	 	 	 	顺序存储,都慢
    
  • Set 无序的子接口

      	HashSet				哈希存储
      	LinkedHashSet
    

3、双列结合的体系:
Map 双列集合的顶层接口
HashMap 哈希表存储
LinkedHashMap

二、Collection

1.什么是Collection和其常用方法
1、单词:收集、集合
2、单列集合的顶层接口,定义的是所有单列集合中共有的功能。
3、Collection是一个接口,不能直接创建对象,随意找一个实现类创建对象
使用接口类型的引用,指向实现类的对象
Collection类型的引用,指向 ArrayList类型的对象(只能调用接口中的方法)
4、常用方法:
add(Object obj):将obj元素添加到集合中
remove(Object obj):将obj元素从集合中删除
clear():将集合中的元素清空
isEmpty():判断集合是否为空
contains(Object obj):判断集合中是否包含obj元素
size():返回集合中的元素个数
代码示例

public static void main(String[] args) {
		//创建一个集合对象
		Collection c = new ArrayList();
		//添加方法
		c.add(111);
		c.add(222);
		c.add(333);
		c.add("abc");
		c.add('s');
		System.out.println(c);
		//移除集合中指定的元素
		c.remove(111);
		System.out.println(c);
		//判断集合是否为空
		System.out.println(c.isEmpty());
		//判断集合中是否包含某一个元素
		System.out.println(c.contains(222));
		//列表中的元素数
		System.out.println(c.size());
		//移除集合中的所有元素
		c.clear();
		System.out.println(c);
		System.out.println(c.isEmpty());
	}

2.Collection中带all的方法
1、addAll(Collection c):将参数c中的所有元素,都添加到调用者集合中
2、removeAll(Collection c):从调用者集合中,删除那些也存在于参数c中的元素
3、containsAll(Collection c):判断调用者,是否能包含参数c中的所有元素
4、retainAll(Collection c):参数c中有哪些元素,就在调用者集合中,保留哪些元素(交集)

3.Collection的第一种遍历方式
1、转成数组,通过遍历数组的方式,来间接的遍历集合
2、Object[] toArray():将调用者集合转成Object类型的数组
代码示例

Collection c = new ArrayList();
Object[] objs = c.toArray();
		for (int i = 0; i < objs.length; i++) {
			//向下转型
			Person p =  (Person)objs[i];
			System.out.println(p.getName()+"..."+p.getAge());
		}

4.集合遍历的第二种方式:迭代器
1、迭代:更迭、更新换代,有从某一个到下一个的过程的含义
2、迭代器:专门用于将集合中的元素,一个到另一个逐个进行迭代的对象
3、获取:集合自己内部就应该有一个可以迭代自己的对象,从集合对象中获取即可
Iterator iterator()
4、迭代器的使用:
方法iterator返回的是一个Iterator接口的实现类对象,可以使用的就是Iterator接口中的方法:
hasNext():判断集合中是否还有下一个元素
next():获取集合中的下一个元素
remove():删除迭代器对象正在迭代的那个对象
5、迭代器的注意事项:
1、迭代器对象虽然多次调用next方法,都是同样的方法名称,但是每次调用返回的结果是不同的,会因为next方法既可以获取下一个元素,也会让迭代器对象,向前移动一步。
2、如果没有下一个元素,仍然调用next方法,出现NoSuchElementException(没有当前元素异常),可以使用hasNext方法判断是否有下一个元素,决定是否调用next方法
3、hasNext方法,判断是否有下一个元素,不会移动迭代器的位置
4、next方法,不仅可以获取下一个元素,还会移动迭代器位置
5、不要只判断一次hasNext,就调用多次next方法
代码示例

 Collection c = new ArrayList();
Iterator it = c.iterator();
		while(it.hasNext()) {
			//向下转型
			Object obj = it.next();
			Person p = (Person)obj;
			System.out.println(p.getName()+".."+p.getAge());
		}

5.使用迭代器会出现的问题
1、ConcurrentModificationException
并发 修改 异常
2、出现原因:
在使用【迭代器对象】遍历集合的同时,使用【集合对象】增加集合的元素
3、解决方法:两种解决方式都是针对List集合可以解决
方式1:迭代器遍历、迭代器增加
方式2:集合遍历、集合增加
4、解决方式1:迭代器遍历、迭代器增加
迭代器遍历,和以前一样
迭代器增加:问题普通的迭代器中没有增加的方法,需要使用List中特有的迭代器
列表迭代器:ListIterator,是Iterator的子接口,拥有Iterator中的所有方法,还有特有
列表迭代器的获取:listIterator()
5、解决方式2:集合遍历、集合添加
集合遍历:list特有的方式遍历,size和get方法结合
集合添加:集合的add方法

三、List

1.List概述和其特有方法
1、是Collection的一个子接口
2、特点:
有序:每个元素都有自己的位置,不同位置是有分别的
【有索引】:每个元素都有自己的编号
可以重复:即使是值相同的几个元素,位置和索引也各不相同,可以区分这几个值。
3、特有方法:
add(int index, Object obj):在指定索引上,添加指定的元素
remove(int index):删除指定索引上的值
set(int index, Object obj):将指定索引上的值,修改为指定的值
get(int index):根据给定的索引,获取对应位置的值

2.集合中的第三种遍历方式
1、针对List集合特有的遍历方式
2、可以通过集合的size方法获取list集合索引的范围,根据索引通过get方法可以获取指定索引的值。
代码示例

for(int i = 0;i<list.size();i++) {
			System.out.println(list.get(i));
		}
四、List的实现类

1.ArrayList
1、也是List的一个实现类
2、没有什么特有方法
3、存储方式:
数组实现,顺序存储
通过物理内存的位置关系,来表达描述逻辑顺序的相邻
在这里插入图片描述

2.LinkedList
1、List的一个实现类
2、存储方式:
节点实现,链式存储
不通过物理内存位置的相邻,来表示逻辑顺序的相邻
每个元素都存储在一个节点中,节点除了元素数据本身以外,还需要存储下一个元素的内存地址
3、图示:
在这里插入图片描述
4、特点:
查询速度慢:需要根据前面的节点来获取后一个节点的地址,前面所有节点都要访问一遍,节点数量越多,查询虚度越慢
增删速度快:增删一个元素,只需要修改新增元素前后的两个节点的引用域即可,与集合本身的元素个数无关。
5、LinkedList的特有方法:
由于在LinkedList中,维护了链表的头和尾节点的对象地址,所以操作头部和尾部非常容易,提供了大量的操作头和尾的方法。
addFirst(Object obj):在头部添加元素
addLast(Object obj):在尾部添加元素
removeFirst():删除头部元素
removeLast():删除尾部元素
getFirst():获取头部元素
getLast():获取尾部元素

3.Vector
1、在jdk1.0版本出现,现在这个类已经过时,在jdk1.2之后,被ArrayList取代
2、特点:
线程安全,效率较低
顺序存储,增删较慢
3、特有方法:
addElement(Object obj):添加元素
removeElement(Object obj):删除元素
elements():获取Vector集合的枚举对象,用于遍历集合
4、特有遍历方式:
1、使用elements方法获取Enumeration对象
2、使用Enumeration对象的hasMoreElements方法判断是否有下一个元素
3、如果有下一个元素,就使用nextElement方法来获取下一个元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值