Java容器常用方法

基本类型 :变量里直接存的是数据本身(值)。

java 复制代码
int a = 10; //变量a里直接写着10

引用类型:变量里存的是对象的地址(引用/指针),而不是对象本身。

java 复制代码
Person p = new Person();//p里存的是一个类似0x7f...的地址,真正的Person对象在地址0x7f...里。

ArrayList 方法

创建

java 复制代码
import java.util.ArrayList; // 引入 ArrayList 类

ArrayList<E> objectName =n ew ArrayList<>();  // 初始化
//如
ArrayList<Integer> nums = new ArrayList<>();
ArrayList<String> names = new ArrayList<>();

添加、检索、删除------add()、get()、remove()

删除有按索引删除按值删除。传入int按索引;传入对象按值。

注意:ArrayList存的是引用类型 ,所以里面存的是地址不是对象本身。举个例子:

当我们nums.add(111)时,首先创建了一个新Integrt对象,值为111,地址为X。ArrayList真正记录的不是Integrt对象,而是地址X。

同理set修改时nums.set(0,100),首先创建了一个新Integrt对象,值为100,地址为W。ArrayList真正记录的地址由X改为W。

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

//增加
nums.add(111);
nums.add(222);
nums.add(333);
System.out.println(nums); //[111,222,333]

//检索
System.out.println(nums.get(0)); //111
System.out.println(nums.get(1)); //222
System.out.println(nums.get(2)); //333

//删除1------穿如int类型,按下标删除
nums.remove(0); 
System.out.println(nums); //[222,333]
//删除2------传入对象类型,按值删除
nums.remove((Integer)222); 
System.out.println(nums); //[333]

修改------set()

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

//增加
nums.add(111);
nums.add(222);
nums.add(333);
System.out.println(nums); //[111,222,333]

//修改
//nums[0] = 100;  ❌
nums.set(0,100);
System.out.println(nums); //[100,222,333]

长度、判空------size()、isEmpty()

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

//长度和判空
System.out.println(nums.size()); //0
System.out.println(nums.isEmpty()); //true

nums.add(111);

//长度和判空
System.out.println(nums.size()); //1
System.out.println(nums.isEmpty()); //false

切片------subList()

和python一样的左闭右开,即subList(启示索引,截至索引+1)

注意:返回值为**"视图"而非"副本",和原始列表共享空间**。要用List,因为返回的是一个实现了 List 接口的对象(在 ArrayList 内部,它实际上是一个名为 SubList 的内部类)

视图比浅拷贝还浅。

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

//增加
nums.add(111);
nums.add(222);
nums.add(333);
System.out.println(nums); //[111,222,333]

//截取
System.out.println(nums.subList(1,3)); //[222,333]

//承接1------用List承接试图,此时共享空间
List <Integer> nums2 = nums.subList(1,3);
//承接2------创建独立的副本
ArrayList<Integer> nums3 = new ArrayList<>(nums.subList(1,3));

排序

sort的逻辑递增排序。按自定义规则排序本质上是按自定义规则递增。

自定义排序时,java和C++有本质区别:C++中定义的是a<b的判别器 ;Java中定义的是a-b的减法器

我们喜欢Collections的sort,封装的那个sort我不喜欢。

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

//增加
nums.add(222);
nums.add(111);
nums.add(-333);
        
//排序------升序(默认)
Collections.sort(nums);
System.out.println(nums); //[-333, 111, 222]
//排序------降序Collections.reverseOrder()
Collections.sort(nums,Collections.reverseOrder());
System.out.println(nums); //[222, 111, -333]
//排序------手写排序规。绝对值排序
Collections.sort(nums,(a,b)->{
    return Math.abs(a)-Math.abs(b);
});
System.out.println(nums); //[111, 222, -333]

拷贝

拷贝的三种类型:

引用拷贝 :两个不同的引用,指向同一个对象地址

浅拷贝 :两个不同的引用,指向不同对象的地址 。但对象内部的引用,指向相同的地址

深拷贝 :两个不同的引用,指向完全没有关系的两个对象的地址(对象内部的引用,也指向不同的地址)。

注意:ArrayList存的是引用类型 ,所以里面存的是地址不是对象本身

所以,浅拷贝ArrayList<Integer> nums3 = new ArrayList<>(nums);虽然创建了新的容器,但是里面存的是同一些地址。

java 复制代码
ArrayList<Integer> nums = new ArrayList<>();

Integer a = new Integer(111);
Integer b = new Integer(222);
Integer c = new Integer(333);

//增加;
nums.add(a);
nums.add(b);
nums.add(c);

//引用拷贝(或曰别名)
ArrayList<Integer> nums2 = nums;

//浅拷贝
ArrayList<Integer> nums3 = new ArrayList<>(nums);

//输出nums、nums2、num3指向容器的地址
System.out.println(System.identityHashCode(nums));  //705927765
System.out.println(System.identityHashCode(nums2)); //705927765
													//可得,引用拷贝和原数据用的是同一个容器
System.out.println(System.identityHashCode(nums3)); //366712642
													//可得,浅拷贝新建了一个容器

//输出对象a,b,c的地址
System.out.println(System.identityHashCode(a));	//1829164700
System.out.println(System.identityHashCode(b)); //2018699554
System.out.println(System.identityHashCode(c)); //1311053135

//输出对象原列表指向的对象的地址
System.out.println(System.identityHashCode(nums.get(0))); //1829164700
System.out.println(System.identityHashCode(nums.get(1))); //2018699554
System.out.println(System.identityHashCode(nums.get(2))); //1311053135

//输出对象浅拷贝列表指向的对象的地址。可得两个列表存的是同一些对象的地址
System.out.println(System.identityHashCode(nums3.get(0))); //1829164700
System.out.println(System.identityHashCode(nums3.get(1))); //2018699554
System.out.println(System.identityHashCode(nums3.get(2))); //1311053135

遍历

java 复制代码
//普通for循环
for (int i = 0; i<list.size(); i++){
    System.out.println(list.get(i).getName());
}
//增强型 For 循环
for (Person p : list) {//p是引用拷贝,即p指向和list元素的指向相同
    System.out.println(p.getName());
}
//迭代器
Iterator<Person> it = list.iterator();//获取迭代器
while (it.hasNext()) {
    Person p = it.next();
}
方法 描述
常用
add() 将元素插入到指定位置的 arraylist 中
get() 通过索引值获取 arraylist 中的元素
set() 替换 arraylist 中指定索引的元素。set(下标,新值)
remove() 删除 arraylist 里的单个元素。remove((int)下标) 或 remove((对象)值)
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList() 截取部分 arraylist 的元素,返回视图,共享同一个容器
clear() 删除 arraylist 中的所有元素
toArray() 将 arraylist 转换为数组

集合

java 复制代码
import java.util.HashSet; // 引入 HashSet 类

HashSet<String> sites = new HashSet<String>();
方法 说明
add(Object e) 添加元素到集合,成功返回 true,重复元素返回 false
remove(Object o) 删除指定元素,成功返回 true,元素不存在返回 false
contains(Object o) 检查集合是否包含指定元素。
size() 返回集合中的元素数量。
isEmpty() 判断集合是否为空。
clear() 清空集合中的所有元素。
toArray() 将集合转换为数组。
addAll(Collection<? extends E> c) 添加另一个集合的所有元素(并集操作)。
retainAll(Collection<?> c) 仅保留与指定集合共有的元素(交集操作)。
removeAll(Collection<?> c) 删除与指定集合共有的元素(差集操作)。

Map

方法 功能 返回值 补充
put(K key, V value) 放入键值对。若 Key 已存在,则覆盖旧值。 返回旧值 (若无则 null) 最基础的添加/更新操作。
get(Object key) 根据 Key 获取 Value。 返回 Value (若无则 null) 查询数据。
getOrDefault(key,0) 根据 Key 获取 Value,没有返回默认值。 自定义默认值 查询数据。
remove(Object key) 删除指定 Key 的映射。 返回被删除的 Value (若无则 null) 删除数据。
containsKey(Object key) 判断是否包含某个 Key。 boolean 检查 Key 是否存在 (比 get()!=null 更严谨,因为 Value 可能为 null)。
containsValue(Object value) 判断是否包含某个 Value。 boolean 检查 Value 是否存在 (性能较差,需遍历)。
size() 获取键值对数量。 int 获取大小。
isEmpty() 判断是否为空。 boolean 快速判空。
clear() 清空所有元素。 void 重置 Map。

Deque队列

java 复制代码
LinkedList<Integer> L = new LinkedList<>();
for(int i = 0; i<5; i++)
    L.add(i);//队尾,入队
for(int i = 5; i<10; i++)
    L.push(i);//队头,入栈


LinkedList<Integer> L2 = new LinkedList<>(L);
for(int i = 0; i<10; i++)
    System.out.print(L.get(i));// 9876501234
System.out.println();
for(int i = 0; i<10; i++)
    System.out.print(L.poll());// 9876501234
System.out.println();
for(int i = 0; i<10; i++)
    System.out.print(L2.pop());// 9876501234
java 复制代码
Deque<Integer> L = new ArrayDeque<>();
for(int i = 0; i<5; i++)
    L.add(i);//队尾,入队
for(int i = 5; i<10; i++)
    L.push(i);//队头,入栈

Deque<Integer> L2 = new ArrayDeque<>(L);
for (Integer element : L2) {
    System.out.print(element);// 9876501234
}
System.out.println();

//poll和pop一样,都是取第一个。
for(int i = 0; i<10; i++)
    System.out.print(L.poll());// 9876501234
System.out.println();
for(int i = 0; i<10; i++)
    System.out.print(L2.pop());// 9876501234
相关推荐
SunnyDays10112 分钟前
Java实战指南:如何高效将PDF转换为高质量TIFF图片
java·pdf转tiff
Seven975 分钟前
【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite
java
Yeh2020587 分钟前
maven
java·maven
ths5127 分钟前
测试开发python中正则表达式使用总结(二)
开发语言·python·算法
色空大师7 分钟前
【java打包方式详解】
java·开发语言·部署·打包·启动脚本·jar包分离
人道领域8 分钟前
2026年Java后端热点全景解析:从LTS革新到云原生跃迁
java·开发语言
heimeiyingwang8 分钟前
【架构实战】API接口防刷与限流策略
开发语言·python·架构
188号安全攻城狮10 分钟前
【前端基础知识】JavaScript 数组方法总结:从表格速查到分类详解
开发语言·前端·javascript·网络安全
鱼鳞_10 分钟前
Java学习笔记_Day26(不可变集合)
java·笔记·学习
不爱吃炸鸡柳10 分钟前
5道经典贪心算法题详解:从入门到进阶
开发语言·数据结构·c++·算法·贪心算法