文章目录
- Java集合框架
- List接口
- 包装类 和 装箱、拆箱
- 泛型
Java集合框架
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes .其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD
以下是Java集合框架结构图:
List接口
在集合框架中,List是一个接口,继承自Collection。Collection 和 Iterable 都是接口
List接口中的常见方法
站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
【注意】 List 是一个接口,所以不能直接实例化 List 对象,ArrayList 、 LinkedList 和 Stack 都实现了 List 接口,
所以如果实例化 ArrayList 、 LinkedList 或 Stack 对象,可以使用 List接口 接收。示例代码如下:
List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
List<Integer> stack = new Stack<>();
数据结构
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
包装类 和 装箱、拆箱
包装类
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。基本数据类型对应的包装类如下:
基本数据类型和对应的包装类除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。
装箱/拆箱
装箱(装包):
1.自动装箱
public static void main1(String[] args) {int i = 10;Integer a = i;//自动装箱Integer b = Integer.valueOf(99);//显式装箱
}
2.显式装箱
public static void main2(String[] args) {Integer i = 100;int a = i;//自动拆箱int aa = i.intValue();//显式拆箱double b = i.doubleValue();
}
面试题
以下代码输出结果是什么,为什么?
public static void main(String[] args) {Integer a = 100;Integer b = 100;System.out.println(a == b);Integer aa = 200;Integer bb = 200;System.out.println(aa == bb);
}
输出 true false
a b aa bb 这四个数据都是引用类型,通过“==”比较引用类型,其实比较的是它们的地址,那么出现了false 就说明有地址不一样,那么这四个数据地址怎么得到的呢?
我们发现a b aa bb 都发生了装箱,我们就可以看看装箱是怎么具体实现的,装箱会调用一个 valueOf 的方法,在这个方法里面,会判断被装箱的简单数据类型i,是不是在-127~128 的区间里,如果在这个区间,就会在缓存数组里面返回相应下标元素的地址,而我们在这个区间范围内传入两个相同的值,那么返回的地址也是相同的,输出的结果就是true;如果不在这个区间,就会创建一个新的对象,而我们在这个区间范围之外传入两个相同的值,此时会创建两个新的对象返回,这时的地址就会不同,输出结果就是false
泛型
这里只是简单介绍一下泛型,后序会补上 关于泛型 的详细笔记
泛型通俗来讲就是适用于许多许多类型
但是,泛型的主要目是:指定当前的容器,要持有什么类型的对象。让编译
器去做检查
<>里面必须是引用类型,不能是简单类型
泛型语法
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> {
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}
泛型的使用
List<Integer> list = new ArrayList<Integer>();
当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写
List<Integer> list = new ArrayList<>(); // 可以推导出实例化需要的类型实参为 Integer