- 容器(集合)
之前学过的容器------数组
弊端:只能存制定数据类型,数组长度不可改变
解决方法:list Set Map
- List 接口
实现类:ArrayList LinkedList Vector
List中常用的方法
(1)添加元素add(值) 和 addAll(值)
把集合里的所有元素都添加到list,把listA看作一个数组对象加入list中
输出结果为
(2)获取元素get(index)
获取下标为2的值
(3)插入元素add(index,值)
在指定位置插入元素,其他元素向后移
list 有序的、连贯的,若插入的下标之前有空,则显示下标越界
输出list类型的数值直接调用toString方法
- 设置元素set(index,值)
- 查找对象contains(值) 和containsALL(值)
查找list是否包含某一个对象,找不到就返回-1
是否包含另一个集合的所有元素containsAll()
- 删除元素remove(值)
删除掉找到的第一个
参数传对象 删除这个对象 返回 boolean
参数传下标 删除下标位置对象 返回被删除的对象
- 获取数组长度size()和获取元素get()
- 迭代器Iterator()
- 扩容方式
ArrayList
初始容量 10,扩容1.5倍,数组存储
LinkedList 链表存储
ArrayList 和 LinkedList性能比较
ArrayList 是通过数组存储的 查找数据非常快
LinkedList 查找数据慢 通过双向检索的方式优化检索速度
ArrayList 插入和删除慢 LinkedList插入删除快
- 改变list中的值
在代码片段中,objs可以修改list的内容,是因为item引用的是list中的一个元素,而这个元素本身是一个List对象。当你将item强制转换为List类型并赋值给objs时,objs实际上引用了list中的那个List对象。
在Java中,对象是通过引用传递的。这意味着当你在循环中处理item时,item只是一个指向某个对象的引用。因此,当你将item转换为List类型并赋值给objs时,objs和item都指向同一个List对象。
由于objs现在直接引用了list中的List对象,所以通过objs调用List的方法(如set)会直接修改list中对应的元素。这是因为objs和list中的元素实际上是同一个对象,对它的任何修改都会反映出来。
然而,对于item = 44.44;这一行,情况不同。尽管item引用了list中的一个元素,但是当你将item重新赋值为44.44时,你只是改变了item引用的内容,而不是list中的元素。这是因为item现在指向了一个全新的Double对象,而list中的元素仍然是原来的对象,没有受到影响。只有当item引用的对象是可变的,并且你通过item修改了这个对象本身时,list中的元素才会被修改。在List的例子中,List对象本身就是可变的,因此可以通过objs来修改它。
- 内部类
- 静态内部类
特点:
1.独立存在:
静态内部类可以不依赖于外部类的实例而独立存在。可以创建静态内部类的实例,而不需要先创建外部类的实例。
2.访问外部类的静态成员:
静态内部类可以访问外部类的所有静态成员(包括字段、方法),即使这些成员是私有的。但是,它不能直接访问外部类的非静态成员,除非通过外部类的实例来访问。
- 成员内部类
特点:
1.被定义在另一个类的内部,作为外部类的一个成员
2.成员内部类的实例总是与外部类的实例相关联。不能独立地创建成员内部类的实例,除非首先创建了外部类的实例。
3.成员内部类可以访问外部类的所有成员,包括私有成员。这是因为它实际上持有对包含它的外部类实例的引用。
4.与静态内部类不同,成员内部类可以访问外部类的非静态成员,因此它可以有非静态和静态成员。
- 局部内部类
定义在方法中 出不了这个方法
- 匿名内部类
创建一个抽象类,在里面定义一个抽象方法,实例化是必须实现这个抽象方法。
- Lambda表达式
简化了函数式接口的使用,使得代码更加灵活和表达力更强。通过使用 Lambda 表达式,可以写出更少的代码,同时保持代码的清晰度和可维护性。
- 代码块
- 静态代码块
在程序运行时,只会执行一次,加载类对象时执行
- 成员代码块
每一次new对象时执行,成员代码块在构造方法之前运行
- 构造方法
- 示例
子类代码如下:
父类代码如下:
主函数如下:
执行代码的顺序是
1.父类静态代码块
2.子类静态代码块
3.父类的成员代码块
4.父类的构造方法
5.子类的成员代码块
6.子类的构造方法
输出结果为:
虽然没有写super,但是再执行代码时要写执行父类的构造方法。