一.Java中集合的概念
1.数组和集合的区别:
在Java中,数组和集合都是用于存储多个元素的数据结构
但是数组是Java中内置的数据结构,且在声明数组时必须指定数组类型和元素大小(大小固定,声明后就不能更改数组的大小了)
如:
java
int[] arr = new int[5];
而集合是Java框架(java.util包)中的一组接口和类
集合可以动态调整大小(自动扩容)
如:
java
List<Integer> list = new ArrayList<>();
除了类型和定义,大小可变与否,数组和集合还有几点点值得关注的区别:
1.数组可以存储基本数据类型,如int、char等,也可以存储引用数据类型,如String、Object等
而集合只能存储引用类型(对象),若要用集合存储基本类型,则必须使用对应的包装类
2.数组不支持泛型,集合支持泛型
3.数组天然支持多维,集合要通过嵌套才能实现多维集合
4.数组功能没有集合丰富,数组仅支持基本的索引访问和遍历,集合提供了额外的增删改查等操作
2.什么是包装类:
Java是一种面向对象的编程语言,但为了效率,它提供了8种基本数据类型,如int、char、boolean等
然而这些基本类型不是对象,不能直接用于需要对象的场景(如集合List、泛型、反射等)
为了解决这个问题,Java为每种基本类型都提供了一个对应的包装类,将基本类型"包装"成对象。
| 基本类型 | 包装类(位于 java.lang 包) |
|---|---|
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
注:所有的包装类都是final类(不可继承),并且是不可变对象(一旦创建,不可以更改)
而在集合中,只能存储引用类型的数据,且泛型只接受引用类型。所以在使用集合存储基本数据类型的数据时,要使用它们的包装类
3.名词解释:装箱和拆箱
1.装箱
把基本类型转换为对应的包装类对象
早期的Java都是手动装箱,如:
java
int num = 100;
Integer obj = new Integer(num); // 已过时(JDK 9+ 废弃构造器)
// 或
Integer obj = Integer.valueOf(num); // 推荐方式
现在普通是自动装箱
如:
java
int num = 100;
Integer obj = num; // 自动调用 Integer.valueOf(num)
2.拆箱
把包装类对象转换为基本类型
手动插箱:
java
Integer obj = new Integer(100);
int num = obj.intValue();
自动拆箱:
java
Integer obj = 100;
int num = obj; // 自动调用 obj.intValue()
二.集合的简单使用
java
package arraylistdemo;
import java.util.ArrayList;
public class ArrayListDemo1 {
// 集合是用于存储对象的容器,提供了比数组更灵活的数据结构操作能力
// 区别:
// 集合的大小是动态变化的,数组在创建时就固定了大小
// 集合主要用于存储对象,但可以通过泛型指定类型。数组只能存储类型相同的数据(基本类型或对象)
// 集合提供了丰富的操作方法,但可能有额外的性能开销。数组访问速度快,内存连续分配
public static void main(String[] args){
// 泛型:用于确定集合中存储的对象类型,用<>括起来
ArrayList<String> list = new ArrayList<String>();
System.out.println(list); // []
System.out.println(list.add("hello")); // true 表示添加成功
System.out.println(list.add("world"));
list.add("java");
list.add("javascript");
System.out.println(list); // [hello, world, java, javascript]
// 删除元素
System.out.println(list.remove("hello")); // true
System.out.println(list); // [world, java, javascript]
System.out.println(list.remove("hello")); // false 表示删除失败
// remove()方法还可以根据索引删除
System.out.println(list.removeFirst()); // world
// 修改元素
System.out.println(list.set(1,"JavaScript")); // javascript
System.out.println(list); // [java, JavaScript]
// 获取集合的长度
System.out.println(list.size()); // 2
// 遍历集合
for (int i = 0; i < list.size(); i++){
System.out.println(list.get(i)); // get()方法用于按索引获取集合中的元素
}
}
}
java
package arraylistdemo;
import java.util.ArrayList;
public class ArrayListDemo2 {
// 定义一个集合,添加数字并进行遍历
public static void main(String[] args){
// 集合存储的是对象,但是可以通过自动装箱机制使得基本类型被自动转换为对应的包装类
// 包装类的映射关系:
// int -> Integer
// char -> Character
// boolean -> Boolean
// float -> Float
// double -> Double
// long -> Long
// short -> Short
// byte -> Byte
ArrayList<Integer> list = new ArrayList<>();
// 添加元素
list.add(10);
list.add(20);
list.add(30);
for (Integer integer : list) {
System.out.println(integer);
}
}
}