目录
浅谈
Array数组
初始化(动与静)
动态初始化
静态初始化
CRUD
增
查
索引取值
遍历
改
删
走进底层
栈与堆
一个数组的诞生
多数组
避坑指南
索引越界
空指针异常
小试牛刀
Collection
List部落
介绍和特点
方法
ArrayList
介绍
方法
遍历
LinkedList
介绍
方法(特有)
Set部落
介绍
方法
HashSet
介绍
唯一性
LinkedHashSet
介绍
TreeSet
介绍
自然排序
比较器排序
Map
介绍和特点
方法的介绍
介绍
示例
遍历方式
容器: 容器是能够盛放物质的器皿,比如水杯,可以盛放水
Java中的容器可以整体认为三类: Array、Collection 和 Map,图中加粗是重点学习对象
// 动态初始化:数组动态初始化就是只给定数组长度, 由系统给出默认初始化值
// 动态初始化格式:数组类型[] 数组名 = new 数组类型[数组长度]
// 示例: int[] arr = new int[3] // 数组类型为int类型, 数组名为arr, 数组长度为3
// 示例: 动态初始化一个长度为5的数组, 并循环打印内部的所有元素
public class DemoTh {
public static void main(String[] args) {
// 动态初始化一个长度为5的数组
int[] arr = new int[5];
System.out.println(arr);
}
}
// 静态初始化: 数组静态初始化是指在创建数组时, 直接将元素确定.
// 静态初始化格式:
// 完整版:数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ....}
// 简化版:数组类型[] 数组名 = {元素1, 元素2, ....}
// 示例:创建一个包含1, 3, 5, 7, 9的数组, 并遍历输出其每一个元素
public class DemoOneToNine {
public static void main(String[] args) {
// 静态初始化数组
int[] arr = {1, 3, 5, 7, 9};
System.out.println(arr);
}
}
看初始化
public class DemoOneToNine {
public static void main(String[] args) {
// 静态初始化数组
int[] arr = {1, 3, 5, 7, 9};
System.out.println(arr[3]); // 7
}
}
// for循环示例: 按索引取出元素
public class DemoOneToNine {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0;i
// for循环示例: 直接遍历出元素
public class DemoOneToNine {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for(int item:arr) {
System.out.println(item);
}
}
}
public class Test01 {
public static void main(String[] args) {
// 静态初始化数组
int[] arr = {1, 3, 5, 7, 9};
arr[0] = 666;
for(int item:arr) {
System.out.println(item);
}
}
}
public class JavaMem {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arr);
}
}
arr2 = arr1
public class JavaMem {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;
System.out.println(arr1[0]); // 1
System.out.println(arr2[0]); // 1
arr1[0] = 66;
System.out.println(arr1[0]); // 66
System.out.println(arr2[0]); // 1
}
}
arr2 = {arr1[0], arr1[1], arr1[2]}
public class JavaMem {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {arr1[0], arr1[1], arr1[2]};
System.out.println(arr1[0]); // 1
System.out.println(arr2[0]); // 1
arr1[0] = 666;
System.out.println(arr1[0]); // 66
System.out.println(arr2[0]); // 66
}
}
索引越界是指使用索引获取数组元素时, 使用的索引不能超过数组元素的最大索引值, 超过后无法通过改索引获取指定的元素, 就会出现索引越界错误, 异常名称位: ArrayIndexOutOfBoundsException
当一个数组对象被创建了, 当使用的过程中如果让数组对象指向了null, 即将null赋值给数组, 意味着变量arr将不会再保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。
找出数组的最大值
public class GetMax {
public static void main(String[] args) {
int[] my_arr = {1, 5, 2, 0, -9, 8, 4};
int max = my_arr[0];
for (int i = 1; i < my_arr.length; i++) {
if (my_arr[i] > max) {
max = my_arr[i];
}
}
System.out.println(max);
}
}
返回两个元素的和等于定值,的这两个元素的索引
public class FindTarget {
public static void main(String[] args) {
int target = 8;
int[] arr = {1, 3, 5, 7, 9};
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] == target) {
System.out.println("索引分别为: " + i + "," + j);
}
}
}
}
}
方法名 |
描述 |
void add(int index,E element) |
在此集合中的指定位置插入指定的元素 |
E remove(int index) |
删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) |
修改指定索引处的元素,返回被修改的元素 |
E get(int index) |
返回指定索引处的元素 |
在java中ArrayList提供一种存储空间可变的存储模型, 存储的数据容量是可以发生改变的. ArrayList底层是「数组」实现的, 长度可以变化.
方法名 |
说明 |
public boolean add(E e) |
将指定的元素追加到此集合的末尾 |
public void add(int index,E element) |
在此集合中的指定位置插入指定的元素 |
public boolean remove(Object o) |
删除指定的元素,返回删除是否成功 |
public E remove(int index) |
删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) |
修改指定索引处的元素,返回被修改的元素 |
public E get(int index) |
返回指定索引处的元素 |
public int size() |
返回集合中的元素的个数 |
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
//创建ArrayList集合对象, 添加四个元素, 并输出在控制台中
ArrayList al = new ArrayList<>();
al.add("Hello");
al.add("World");
al.add("Hello");
al.add("Java");
System.out.println("al的值:" + al);
//获取索引为1的元素, 输出在控制台中
System.out.println("al索引为1的元素: " + al.get(1));
//修改索引为3的元素为"Hi"
al.set(3,"Hi");
//查看修改后的al
System.out.println("修改索引为3的元素后的al: " + al);
//移除索引为0的元素后输出al
al.remove(0);
System.out.println("移除索引为0的元素后的al: " + al);
//移除内容为"Java"的元素后输出al
al.remove("Java");
System.out.println("移除Java后的al: " + al);
}
}
import java.util.ArrayList;
public class ArrayListIterDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add("I");
al.add("love");
al.add("you");
//普通for遍历
for (int i=0;i
LinkedList功能与ArrayList一样,同样是一个List的实现类,功能也是存储数据使用。但LinkedList与ArrayList本质完全不同。
方法名 |
说明 |
public void addFirst(E e) |
在该列表开头插入指定的元素 |
public void addLast(E e) |
将指定的元素追加到此列表的末尾 |
public E getFirst() |
返回此列表中的第一个元素 |
public E getLast() |
返回此列表中的第一个元素 |
public E removeFirst() |
从此列表中删除并返回第一个元素 |
public E removeLast() |
从此列表中删除并返回最后一个元素 |
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList numbers_linklist = new LinkedList<>();
numbers_linklist.add(1);
numbers_linklist.add(2);
numbers_linklist.add(3);
numbers_linklist.add(4);
numbers_linklist.add(5);
// addFirst方法
numbers_linklist.addFirst(0);
System.out.println(numbers_linklist);
// addLast方法
numbers_linklist.addLast(6);
System.out.println(numbers_linklist);
// getFirst方法
System.out.println(numbers_linklist.getFirst());
// getLast方法
System.out.println(numbers_linklist.getLast());
// removeFirst方法
numbers_linklist.removeFirst();
System.out.println(numbers_linklist);
// removeLast方法
numbers_linklist.removeLast();
System.out.println(numbers_linklist);
}
}
Set为集合,不包含重复元素的集合, 并且最多只有一个空元素。
方法名 |
说明 |
add(E e) |
如果指定的元素不存在,则将其指定的元素添加(可选操作)。 |
clear() |
从此集合中删除所有元素(可选操作)。 |
contains(Objcet o) |
如果此集合包含指定的元素,则返回 true 。 |
equals(Object o) |
将指定的对象与此集合进行比较以实现相等。 |
hashCode() |
返回此集合的哈希码值。 |
isEmpty() |
如果此集合不包含元素,则返回 true 。 |
remove(Object o) |
如果存在,则从该集合中删除指定的元素(可选操作)。 |
size() |
返回此集合中的元素数(其基数)。 |
toArray() |
返回一个包含此集合中所有元素的数组。 |
前置知识:HashTable: 哈希表;HashCode: 哈希值
public class TreeSetDemo01 {
public static void main(String[] args) {
//创建集合对象
TreeSet ts = new TreeSet();
//添加元素
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20);
ts.add(30);
//遍历集合
for(Integer i : ts) {
System.out.println(i);
}
}
}
自然排序是在添加对象到集合内部时, 让其按照对象内部的比较方法进行自动排序. 构建TreeSet时使用无参构造方法即可.
上面的例子中, 我们构建ts对象, 并向其中添加一些整型, 遍历ts对象会发现, 打印的顺序是从小到达的. 经查看Integer类源码发现, Integer底层实现了两个方法, 一个compare方法和compareTo方法, 其中compare负责进行比较, 而compareTo内部调用compare方法, 当前数与另一个数进行比较时, 如果当前数小于那个数, 则返回-1, 如果相等则返回0, 如果当前数大于那个数则返回1. 如果是自定义类实例化而来的对象, 需要自己定义compareTo()方法, 在方法内部定义比较规则.
需求:定义学生类, 学生类内部定义compareTo方法, 按照学生年龄排序. 将学生类添加至TreeSet对象中, 遍历集合对象
public class Student implements Comparable {
private String name;
private int age;
public Student(){};
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student s) {
return this.age - s.age;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
Student s1 = new Student("成成", 18);
Student s2 = new Student("宝中", 17);
Student s3 = new Student("金喜", 20);
ts.add(s1);
ts.add(s2);
ts.add(s3);
for (Student stu : ts) {
System.out.println(stu.getName());
}
}
}
使用比较器排序, 需要自己实现一个比较器, 并在初始化TreeSet时使用有参构造, 并把比较器传入进去, 对象加入TreeSet对象时, 就会按照比较器的规则进行排序了
需求:定义学生类, 学生类内部定义compareTo方法, 按照学生年龄排序. 将学生类添加至TreeSet对象中, 遍历集合对象
public class Student {
private String name;
private int age;
public Student(){};
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet ts = new TreeSet(
new Comparator() {
@Override
public int compare(Student s1, Student s2) {
return s1.getAge() - s2.getAge();
}
}
);
Student s1 = new Student("小明", 18);
Student s2 = new Student("小红", 17);
Student s3 = new Student("小强", 20);
ts.add(s1);
ts.add(s2);
ts.add(s3);
for (Student stu : ts) {
System.out.println(stu.getName());
};
}
}
Map为一个接口, 将键映射到值的对象。 Map不能包含重复的键; 每个键可以映射到最多一个值。
interface Map K:键的类型;V:值的类型
特点:
基本使用:
import java.util.HashMap;
import java.util.Map;
public class MapDemo01 {
public static void main(String[] args) {
//创建HashMap对象
Map m = new HashMap();
//添加键值对
m.put("name_1", "Jeremy");
m.put("name_2", "Fish");
//输出
System.out.println(m); //{name_2=Fish, name_1=Jeremy}
}
}
//增:
- put(key, value): 添加键值对, 返回键对应的值
//删:
- remove(key, value): 如果指定的键对应的值为value, 则进行删除
- remove(key): 根据键删除键值对元素, 返回键对应的值
- clear(): 清空所有键值对元素
//改:
- put(key, value): 同则修改, 异则添加
//查:
- containsKey(key): 判断是否存在某个特定的key, 返回值为布尔值
- containsValue(Value): 判断是否包含指定的值, 返回值为布尔值
- isEmpty(): 判断Map对象是否为空, 返回值为布尔值
- size(): 获取Map对象键值对个数, 返回值为整型
- get(key): 获取指定键的值
- keySet(): 获取所有的键, 返回值为Set类型
- Values(): 获取所有值的集合
- enterSet(): 获取所有键值对对象的集合
import java.util.HashMap;
import java.util.Map;
public class MapDemo01 {
public static void main(String[] args) {
Map m = new HashMap();
m.put("name_1", "Jeremy");
m.put("name_2", "Fish");
System.out.print("put增加键值对后的m为: ");
System.out.println(m); //put增加键值对后的m为: {name_2=Fish, name_1=Jeremy}
m.remove("name_1", "Jer");
System.out.print("如果键name_1对应的值为Jer, 则移除: ");
System.out.println(m); //如果键name_1对应的值为Jer, 则移除: {name_2=Fish, name_1=Jeremy}
//直接移除name_1的键值对
m.remove("name_1");
System.out.print("移除name_1的键值对后, m的值: ");
System.out.println(m); //移除name_1的键值对后, m的值: {name_2=Fish}
//clear()后的m
m.clear();
System.out.print("clear()后m的值为: ");
System.out.println(m); //clear()后m的值为: {}
//空对象m重新添加name_1键值对
m.put("name_1", "Jeremy");
m.put("name_2", "Lucy");
System.out.print("重新添加name_1键值对的m为: ");
System.out.println(m); //重新添加name_1键值对的m为: {name_2=Lucy, name_1=Jeremy}
//重复添加name_1的键, 但是改变对应的值
m.put("name_1", "LiLi");
System.out.print("使用name_1键的新值覆盖原有值后m的值: ");
System.out.println(m); //使用name_1键的新值覆盖原有值后m的值: {name_2=Lucy, name_1=LiLi}
//判断是否包含指定的key
System.out.println(m.containsKey("name_2")); //true
//判断是否包含指定的value
System.out.println(m.containsValue("Lucy")); //true
//判断是否为空
System.out.println(m.isEmpty()); //false
//获取Map对象的长度
System.out.println(m.size()); //2
//获取指定键对应的值
System.out.println(m.get("name_1")); // LiLi
//获取所有键的集合
System.out.println(m.keySet()); //[name_2, name_1]
//获取所有值的集合
System.out.println(m.values()); //[Lucy, LiLi]
//获取所有的键值对
System.out.println(m.entrySet()); //[name_2=Lucy, name_1=LiLi]
}
}
方式一
使用增强for, 遍历集合的所有键或值进行操作
import java.util.HashMap;
import java.util.Map;
public class MapDemo02 {
public static void main(String[] args) {
Map m = new HashMap();
m.put("name_1", "金喜");
m.put("name_2", "帅帅");
m.put("name_3", "晨阳");
for(String key: m.keySet()){
System.out.println(key);
}
for (String value:m.values()){
System.out.println(value);
}
}
}
方式二
通过增强for遍历键值对组成的EntrySet对象
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo03 {
public static void main(String[] args) {
Map m = new HashMap();
m.put("name_1", "Jeremy");
m.put("name_2", "刘桂宁");
m.put("name_3", "毕奎成");
Set> items = m.entrySet();
for(Map.Entry item:items) {
System.out.println("键值对为: " + item);
System.out.println("键为: " + item.getKey());
System.out.println("值为: " + item.getValue());
System.out.println("-------------------------");
}
}
}