Java第十二天:Collection,List

Collection,List

1. 集合
1.1 为什么要使用集合
如果需要处理大量的同类型数据,可以使用数组来保存处理数据。

数组的弊端:
	1. 容量不可以改变
	2. 数据类型单一,不存在非常便利的复用性
	3. 数组中处理数据的操作方法,方案 Java中没有提供配套,需要程序员自己完成

集合就可以解决以上问题!!!
	1. 容量随便玩,自己扩容,自己处理
	2. 可以满足任意数据类型,但是又可以满足数据类型一致化。
	3. 方法众多,非常好使
1.2 Collection集合
Collection是一个接口,是Java中所有集合的总接口!!!
在Collection接口中规定Java接口需要完成的方法和最基本的规范!!!

interface Collection<E>
--| interface List<E> extends Collection<E>
	List接口特征 有序 可重复
----| class ArrayList<E> implements List<E> 可变长数组
----| class LinkedList<E> implments List<E> 双向链表结构
----| class Vector<E> implements List<E> 线程安全的可变长数组
--| interface Set extends Collection 
	Set接口特征 无序,不可重复
----| class HashSet<E> implements Set<E> 底层存储数据的是哈希表结构
----| class TreeSet<E> implements Set<E> 底层存储数据的是树形结构,平衡二
叉树
1.3 Collection常用方法
在Collection<E>是存在泛型使用的,泛型约束了当前Collection集合中能够存储的指定的数据类型,做到数据类型一致化
增
	add(E e); 添加指定数据类型的元素到当前集合中。
	addAll(Collection<? extends E> c); 
		这里使用了泛型的【上限约束】,添加另一个集合到当前集合内,要求添加的
		集合中存储的元素是E类型本身或者E类的子类
		class Dog extends Animal
		class Cat extends Animal
		class Tiger extends Animal
	
删
	remove(Object obj); 删除集合中的指定元素
	removeAll(Collection<?> c);	
		删除在调用当前方法集合中和指定传入集合的交集
	retainAll(Collection<?> c);
		保留在调用当前方法集合中和指定传入集合的交集
	clear();
		清空整个集合!!!
改[无]

查
	int size(); 当前集合中保存的有效元素个数
	boolean contains(Object obj);
		判断指定传入的元素是否存在于当前集合中
	boolean containsAll(Collection<?> c);
		判断指定传入的集合是不是当前集合的【子集合】
	boolean isEmpty();
		判断集合中是否存在元素,没有元素返回true,有元素返回false
迭代器
	Iterator<E> iterator();
	boolean hasNext();
		判断当前集合中是否可以继续遍历
	E next();
		获取当前迭代器指向的元素,并且指向下一个元素
	void remove();
		删除
		【注意事项】
		remove删除的元素有且只能是通过next方法获取到的元素,并且是紧跟着
		next方法,不能独立使用!!!
2. List
2.1 List接口特征
有序:
	存储数据的顺序和添加顺序一致!!!尾插法!!!
可重复:
	没有对于当前集合中的元素进限制,元素重复照样可以存入
2.2 List接口下的常用方法
List<E>也是带有泛型的!!!【默写!!!】
增
	add(E e); 添加指定数据类型的元素到当前集合中。
	addAll(Collection<? extends E> c); 
		这里使用了泛型的【上限约束】,添加另一个集合到当前集合内,要求添加的
		集合中存储的元素是E类型本身或者E类的子类
	add(int index, E e);
		在List集合中指定下标位置,添加指定元素
	addAll(int index, Collection<? extends E> c);
		在List集合中指定下标位置,添加另一个集合对象
删
	remove(Object obj); 删除集合中的指定元素
	removeAll(Collection<?> c);	
		删除在调用当前方法集合中和指定传入集合的交集
	retainAll(Collection<?> c);
		保留在调用当前方法集合中和指定传入集合的交集
	clear();
		清空整个集合!!!
	E remove(int index);
		删除指定下标的元素
改
	E set(int index, E e);
		使用指定元素替换指定下标的元素,返回值是被替换的元素。
查
	int size(); 当前集合中保存的有效元素个数
	boolean contains(Object obj);
		判断指定传入的元素是否存在于当前集合中
	boolean containsAll(Collection<?> c);
		判断指定传入的集合是不是当前集合的【子集合】
	boolean isEmpty();
		判断集合中是否存在元素,没有元素返回true,有元素返回false
	int indexOf(Object obj);
		找出指定元素在List集合中的下标位置
	int lastIndexOf(Object obj);
		找出指定元素在List集合中最后一次出现的下标位置
	List<E> subList(int fromIndex, int endIndex);
		从List集合中获取从fromIndex 到endIndex之间元素的子List集合,要头不
		要尾
迭代器
2.3 ArrayList可变长数组实现和分析
1. 可变长数据中的核心方法:
	grow方法
	获取原数组容量,计算得到新数组容量,
	比较是否满足条件
		1. 是否满足最小要求
		2. 是否超出了最大范围
	创建新数组,拷贝数据,保存新数组地址的操作。

2. ArrayList底层保存数据的是一个Object类型数组
	private static final int DEFUALT_CAPACITY = 10;
	初始化数组容量
	如果使用无参数构造方法获取ArrayList对象,底层保存数据的Object数组初始化容量是10
	可以指定当ArrayList底层Object数组的容量

3. ArrayList
	增删慢:
		增加为什么慢?
			1. 增加有可能触发底层数组扩容操作,在扩容的过程中,需要从源数据
			数组中拷贝数据到新数组中,这里比较浪费时间
			2. 在指定位置添加元素,数组中的元素从指定位置开始需要整体后移,
			后移操作比较浪费时间
		删除为什么慢?
			1. 删除集合中的元素,有可能导致底层数组元素整体向前移动,移动操
			作是比较浪费时间
			2. 删除数据,有可能导致底层数组中存在大量的冗余空间,浪费内存,
			降低开发效率
	查找快:
		null
【补充知识点 内存地址】
什么是内存地址?
	内存地址是按照内存中最小操作单元
		byte 字节
	从内存编号0开始,到内存的最大值
	0 ~ 4294967295 
	每一个位置都是一个独立的编号,是不可以重复的!!!
	为了方便操作,通常内存地址会使用十六进制展示
	0x0 ~ 0xFFFF FFFF
	
引用数据类型变量
	就是保存另一块内存空间地址的变量,CPU读取引用数据类型变量中保存的地址,可以直接访问到对应的内存空间,这个操作非常效率!!!
	
null
	0x0 是内存中编号为0的一个字节内存
	任何程序都不允许读取,写入该内存数据!!!如果操作0x0 null 系统直接杀死!!!Kill -9

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9NWUACH-1584346787876)(.\img\数组地址内存分析.png)]

自定义实现MyArrayList
构造方法:
	MyArrayList();
	MyArrayList(int initCapacity);
成员方法:
	add(E e);
	add(int index, E e);	
	remove(int index);
	remove(Object obj);
	E get(int index);
	int size();
	boolean isEmpty();
	boolean contains(Object obj);
	MyArrayList<E> subList(int fromIndex, int endIndex);
	E set(int index, E e);
	int indexOf(Object obj);
	int lastIndexOf(Object obj);
	grow(int minCapacity);

希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值