集合框架ArrayList

这篇博客主要介绍了ArrayList集合,包括它的底层实现(基于数组),特点,常用操作如添加、删除、修改元素,以及与LinkedList的区别。文章还展示了ArrayList的示例代码,强调其线程不安全但查询和修改效率高的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

										集合框架的原理和实现

一:常见的数据结构:
ArrayList底层基于数组实现的,所以查询和修改的效率高
在这里插入图片描述二:自定义容器类LinkedList底层基于链表结构实现的所以删除和插入效率高
在这里插入图片描述在这里插入图片描述List是ArrayList和LinkedList的父类。
在这里插入图片描述 ArrayList集合框架
ArrayList集合是有序可重复的。
public class TestArrayList {
@SuppressWarnings(“unchecked”)
public static void main(String[] args) {
List list = new ArrayList(90);
//ArrayList() 构造一个初始容量为 10 的空列表。
list.add(212198); //允许重名
list.add(212198);
list.add(“二狗子”);
list.add(‘A’);
list.add(new A(){});
System.out.println(list);
//boolean add(E e)
//向列表的尾部添加指定的元素(可选操作)。
boolean b = list.add(“s”);
System.out.println(b); //表示存进去了。
//void add(int index, E element)
//在列表的指定位置插入指定元素(可选操作)。
//[212198, 二狗子, A, cn.itsouce._02TestArrayList.TestArrayList$1@15db9742, s]
System.out.println(list);
list.add(1, “二狗子”);
System.out.println(list);
//[212198, 二狗子, 二狗子, A, cn.itsouce._02TestArrayList.TestArrayList$1@15db9742, s]
//ArrayList(Collection<? extends E> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
List list2 = new ArrayList(list); //往里边放一个数据来存储
list2.add(“神秘狗”);
list2.add(“好傻喔”);
System.out.println(list2); //照样子能存进去
//void clear() 移除此列表中的所有元素。
//list2.clear();
//System.out.println(list2); //[] 删除完了,卧槽
//Object clone() 返回此 ArrayList 实例的浅表副本。
//咋个没法调用安
//boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。
//System.out.println(list2);
boolean t1 = list2.contains(“二狗子”);
System.out.println(t1); //true 不输入查找的数据类型就返回false
//E get(int index) 返回此列表中指定位置上的元素。
Object object = list2.get(8); //索引不得越界
System.out.println(object);
//boolean remove(Object o)从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
boolean remove = list2.remove(“二狗子”);
System.out.println(remove);
//E remove(int index) 移除列表中指定位置的元素(可选操作)。
System.out.println(list2);
//list2.remove(1);
//System.out.println(list2);//删除成功了
boolean remove2 = list2.remove(“212198”);
System.out.println(remove2);
//E remove(int index) 移除列表中指定位置的元素(可选操作)。
list2.size(); //返回全部的元素
System.out.println(list2);
//问题: 为什么API说的是删除指定类型却删不掉
//boolean remove(Object o)
// 从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。
}
}
class A{

}
一般我们都采用多态的一个写法:
List list= new ArrayList();
ArrayList是一个接口,其上实现的是List接口里边所有的方法,一般比较常用,就是用来存放多个数据任意类型的数据。但是只能单个存放。
1.什么是集合框架
是sun公司提供额一组API
多查多用;
当ArraysList后边跟了一个<E,T,K,V,E>之类的都可以看成是Object
这儿后边跟的是泛型。
Collection所有集合类接口的超级接口;
List下边实现了: ArraysList,LinkedList,Vector。(或者说他们三个继承了List)
特点: 有序的
ArrayList: 线程不安全 修改,查询的效率极高;
LinkedList: 线程不安全 插入,删除用,效率极高
Vector 线程安全 如果要求线程安全的话就用这个接口
Collection是所有接口的超级接口; 父亲
记住子类的方法比父类多。
List特点:
允许重复的元素,有序的排列起的。

2.如何使用呢?
第一步:
必须要看构造方法,才能直到怎么去调用,是用对象还是用类去调。

这儿我是一个多态的写法,List里边实现了ArrayList和LinkedList。

这儿就是放一个接口进去就完事了,可以看成Arrays(Collection c);

ArrayList: 线程不安全 修改,查询的效率极高;
LinkedList: 线程不安全 插入,删除用,效率极高
Vector 线程安全 如果要求线程安全的话就用这个接口
要使用的话看你需要什么类型的,就创建什么类型的对象;

3 ArrayList集合

第一步:找构造方法,创建对象,静态的就用类名去调用。

默认的就为10的长度的空的列表;
相当于创建了一个可以容纳10个参数的盒子。

Add添加里边可以添加任意类型的数据:
2.构造方法第二个: 直接传入一个集合的对象就可以了;

传入一个list也不会报错的。

继续往里边添加数据,打印也不会报错的。 所以很好用的
Arraylist使用:

记住这儿两个包都是util里边的;

boolean add(E e)
          向列表的尾部添加指定的元素(可选操作)。
 boolean add(E e)
          向列表的尾部添加指定的元素(可选操作)。
 boolean add(E e)
          向列表的尾部添加指定的元素(可选操作)。

这儿我调用的是List里边的方法,add添加,因为ArrayList是有序可重复的,所以可以打印出来。

依次有序打印出来的

这个方法是传入对应的参数,如果找到你列表的参数就返回给你一个boolean的值。

查找指定位置的索引值

简单的掉方法

数组与集合之间的转换很常用。

集合的遍历:
第一种方式:
For循环根据下表去取:

第二种增强for循环取

第三种:迭代器
Iterable 接口这里边有有一个Inter方法

返回的值的类型就是一个本身;

怎么用:用对象调方法,

在这个接口内部有迭代器的方法;

这里便有三个方法:
可以用来取出集合的值;

Hasnext: 判断一下下一个的元素还有没有 本身返回的是一个boolean的值
Next取出下一个值 如果没有的话就报错了。(超过size 的长度就报错)
循环取值: 用remove

因为:
Size每次都会往前移一个; 自己笔画一下就明白了。
当 i=0的时候,进入打印语句就把A删除了;
当i=1的时候,进入打印语句就把C删除了;
如果见到没有见过的异常就API或者百度查询一下;
4 LinkedList集合
它是一个有特性的集合
LinkedList linkedlist=New LinkedList();
如果想要使用自身的方法时只能通过自身来创建对象

完事了
LinkedList集合里边由自己独特的方法,在其他里边集合里边没有的。
要想用Linkedlist里边的方法就得用Linkedlist来接收
因为他是独有的。

调方法就完事了
补充;

得到一个迭代器: 用对象去调

这儿是Iterator里边的方法,就要用iterator的对象去调用;
取值的话: (Iterator)对象.方法(next)取值;
 boolean hasNext()
          如果仍有元素可以迭代,则返回 true。
判断有没有下一个元素。
取值的话:Sysout(Inerator.next());
依次取出里边的值。

这儿只能删除调A,C 因为size的长度在变,数组会依次往前移动。

循环删除迭代器,只能通过迭代器里边的iter方法的remov去删除
双向迭代器:

5 案例
学生类的设计:
做一个学生类的crud(增删改查)
5 回顾:请说出四大访问权限修饰符的作用域;
Finaly: 异常处理机制,可以不写的,一般放在try cath之后的代码块里,他是一定会被执行的,除非关闭java虚拟机。
System.exit() 关闭虚拟机,Java运行环境被关闭了,就整个程序结束了
Fina: 一旦修饰就是最终的意思,不能继续写下一个。
Static: 一旦被修饰全局共享,不能在局部变量进行修饰。
Private: 私有化字段的,private可以修饰成员变量,成员方法,构造方法,不能修饰类。
Public: public是权限最大的修饰符,他可以修饰类,成员变量,成员方法,构造方法。被public修饰后,可以再任何一个类中,不管同不同包,任意使用。

protected可以修饰成员变量,成员方法,构造方法,但不能修饰类
课后作业:
1、请说说ArrayList与LinkedList的;联系与区别 5遍
答: ArrayList 底层是基于数组结构的,所以他查询和修改特别快。
LinkedList 底层是基于链表结构,所以删除和添加特别块。
1、把Iterator和Iterable的区别和作用每人都手抄至少两遍
Iterable是一个接口,约束某类是否可迭代。
Iterator iterator()
Iterator:迭代器,正在实现迭代类。
hasNext 查询是否有下一个值
Next 取值
Remove 删除
4 Overload与Override的区别
Overload:方法重载
在同一个类中,允许方法同名,与返回值无关(不看返回值),但是参数形式的个数和类型必须不一致。
Override:方法覆写
在同一个文件夹下面,子类可以继承父类,名称和参数完全相同。
这儿必须保证子类的方法和父类的方法返回值,参数类型和方法名必须一致。功能执行语句子类可以更改,表示子类的特性。
被覆写的方法子类的访问权限不能够比父类低。

4 类型(任意类型)

我的引用类型穿不进去,因为我设定的是一个int 类型的数据,所以引用数据不能传进去。

修改为Object就可以了,很简单。

下午
数据查找 修改 删除
1 查找:

根据传入的索引去查找对应的数据值;

查找的索引为3的位置的数组里边的数据;

第三个索引位置没有传入参数,所以就为null

这儿后边应该时size-1就时索引的长度???
判断一下传入查找的参数不能《0;还有传入的参数不能够超越size,当传入的参数小于我们默认的参数的时候那么后边就会打印(0,0,0,0,0(null,null,null)),是为了后边的不需要打印的null,不打印后边的null,那样子看起来不美观。(arr.length后边的长度里边始终有0000,Object类型的话一直有空的null)
如果在这个范围的话我们就给他抛一个异常

2.索引来查找出现的位置;

为什么要设置一个-1.因为如果用户传入了一个 不可打印的数据那么我们就要给他返回一个-1,必须要在我们设置的这个范围查找 比如我们传入一个

但是我们只是调用了4次,那么我们必须返回给他一个-1表示找不到。
根据索引的位置来查找他的出现的第一次。
2 修改

根据索引来修改指定的数组位置的索引

代码还要严谨一点的话就判断一下。
传入两个参数:修改原来数组的值的话就用后边的一个参数等于前边一个数组索引。
3 删除

删除数组的话,数组的长度是不会改变的。

Index传入的数据值,index+1从5的位置开始拷贝。拷贝到index的位置,拷贝长度应该是length-1-index个。 根据用户调用的次数来决定
为什么拷贝长度要设置为; length-1-index
因为length-1就是数组的索引长度为9
减去index就是把index的数据删除点,所以

第一步:客户传入的index范围必须在这里面,所以判断这个值必须要在这里面

关于拷贝从arr,index+1到arr,index处,后边在size-1-index处的问题,
从传入的参数的后一位开始拷贝,拷贝到新的数字的index删除的地方,就自动向上挤了一个。 数组长度不会改变的。 后边拷贝数组长度,就直接带入一个索引算就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值