线性表:n个具有相同特征的数据元素的有限序列。
顺序表,链表,栈,队列......
存储结构:
顺序存储:顺序
链式存储:链表
顺序表:物理地址连续的存储单元依次存储数据元素的线性表(背后是一个数组,在数组上完成数据的增删查改)
顺序表的增删查改各种操作,需要注意点:
1.是否为空
2.顺序表是否满了,是否要扩容
3.查找/删除一个下标的时候,确定下标范围是否正确
4.判断各种异常时,自定义异常
5.各种操作完成后,记得修改usedSize的值
总代码:
自定义的两个异常
测试及其运行结果:
ArrayList
1.ArraryList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
2.ArrayList是以泛型的方式实现的,使用时必须要先实例化。
3.ArrayList实现了Cloneable接口,表明它是可以clone的;实现了Serializable,表示它支持序列化;RandomAccess表示支持随机访问。
三种构造方法
往ArrayList里面传的包装类(?)必须是E或者E的子类,E是上界
报错:因为String不是Integer或者Integer的子类
观察idea中的构造原码:
默认容量为10
长度为0,这个构造方法,没有分配内存
类似于顺序表背后的数组,size是有效的数据个数
arraryList1.add(1);将数据存储于ArrayList中,原码
当我们调用不带参数的构造方法时,只有第一个add() 的时候,我们才会分配大小为10的内存,当开始放第十一个时,idea中的原码采用的是1.5倍的扩容。
当我们调用带参数的构造方法时,直接为自己设置的内存大小。
ArrayList的常规方法
remove()函数的两种删除:下标,值
截取:左闭右开,并且要通过List<>接收
注意:再进行更新操作,发现list和arraylist5中都会发生改变
ArrayList的遍历
三种遍历方式:fori循环+下标,foreach,使用迭代器。
1.fori循环
2.foreach
3.使用迭代器
Iterator
arrayList1.iterator()
观察原码,需要Iterator接收
while(xxx.hasNext())判断xxx是否有下一个数据,如果有,打印下一个数据xxx.next()
使用Iterator的子类ListIterator迭代
eg:存放学生对象在arrayList中,学生信息有年龄,姓名,分数,并且按照分数排序打印
1.指定存放自定义类型
2.Collections.sort()对集合进行排序
eg:给两个字符串str1:"welcome to bit" str2:"come"
删除第一个字符串中,出现的第二个字符串的字符
结果:wl t bit
要求:使用集合ArrayList来完成
注意:String的contains的参数必须是字符串,ch是字符,所以可以加上一个不带空格的双引号将其变为字符串。
contains(ch+"")