文章目录
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
自定义实现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