【Java笔记】(八):数据结构与集合框架

Java的api文档:https://www.runoob.com/manual/jdk11api/java.base/java/util/package-summary.html

数组

数组声明

int[] arr2 = new int[5];//推荐这种
int arr[] = new int[5];

数组初始化

int arr[] = new int[]{
    
    1, 3, 5, 7, 9};
int[] arr2 = {
    
    2, 4, 6, 8, 10};

添加元素以及取出元素

int[] arr = new int[5];
arr[0] = 1;
int a = arr[0];

遍历数组

public static void main(String[] args) {
    
    
  int arr[] = new int[]{
    
    1, 3, 5, 7 ,9};
  int[] arr2 = {
    
    2, 4, 6, 8, 10};
  for (int i = 0; i < arr.length; ++i) {
    
    
    System.out.print(arr[i] + "\t"); // 1 3 5 7 9
  }
  for (int x: arr2) {
    
    
    System.out.print(x + "\t"); // 2 4 6 8 10
  }
}

Arrays工具类的常用操作

方法 功能 备注
fill(int[] a, int val) 填充数组
fill(int[] a, int fromIndex, int toIndex, int val) 填充指定索引区间数组 左闭右开
sort(int[] a) 数组排序
sort(int[] a, int fromIndex, int toIndex) 排序指定索引的元素
copyOf(int[] original, int newLength) 复制数组 指定新数组长度
copyOfRange(int[] original, int from, int to) 复制数组 指定所复制的原数组的索引
Arrays.asList(stringArray).contains(“a”); 检查数组中是否包含某一个值
Arrays.binarySearch(str) 定位元素位置 前提是有序数组有序数组
Arrays.asList.indexOf(str); 定位元素位置

ArrayUtils工具类的常用操作

方法 功能 备注
ArrayUtils.addAll(intArray, intArray2); 连接两个数组
ArrayUtils.reverse(intArray); 数组翻转
ArrayUtils.removeElement(intArray, 3) 从数组中移除一个元素 返回一个删除后的新数组

字符串

String是不可变类型,被final修饰,即赋值后不能被修改

字符串的格式化

String fs = String.format(
    "浮点型变量的值为%f," +
    "整型变量的值为%d," +
    "字符串变量的值为%s"
    , floatVar, intVar, stringVar);

String类常用操作

方法 功能 备注
charAt(int index) 返回指定索引处的 char 值。
contains() 判断是否包含指定的字符
endsWith(String suffix) 测试此字符串是否以指定的后缀结束。
equals(Object anObject) 将此字符串与指定的对象比较。
equalsIgnoreCase(String anotherString) 两个String 比较,不考虑大小写。
indexOf(String str) 返回子串在此字符串中第一次出现处的索引。
lastIndexOf(int ch) 返回字符最后一次出现处的索引。
int length() 返回此字符串的长度。
replace(char oldChar, char newChar) 替换子串 返回一个新的字符串
split(String regex) 字符串分割
substring(int beginIndex,int endIndex) 字符串切片 返回一个新的字符串
toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
trim() 删除字符串左右空元素 返回字符串的副本
isEmpty() 判断字符串是否为空。

集合框架

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。

扫描二维码关注公众号,回复: 12886887 查看本文章

Java集合框架图

在这里插入图片描述

Java集合框架体系图

在这里插入图片描述

ArrayList

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

在这里插入图片描述

初始化

import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>();  // 初始化

ArrayList类常用操作

方法 功能 备注
add() 将元素插入到指定位置的 arraylist 中
addAll() 添加集合中的所有元素到 arraylist 中
clear() 删除 arraylist 中的所有元素
clone() 复制一份 arraylist
contains() 判断元素是否在 arraylist
get() 通过索引值获取 arraylist 中的元素
indexOf() 返回 arraylist 中元素的索引值
removeAll() 删除存在于指定集合中的 arraylist 里的所有元素
remove() 删除 arraylist 里的单个元素
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList() 截取部分 arraylist 的元素 左开右闭
set(index,newValue) 更新指定索引的元素
sort() 对 arraylist 元素进行排序 默认为升序排列
toArray() 将 arraylist 转换为数组
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
retainAll() 保留 arraylist 中在指定集合中也存在的那些元素
containsAll() 查看 arraylist 是否包含指定集合中的所有元素
forEach() 遍历 arraylist 中每一个元素并执行特定操作

LinkedList

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表。

LinkedList 继承了 AbstractSequentialList 类。

LinkedList 实现了 Queue 接口,可作为队列使用。

LinkedList 实现了 List 接口,可进行列表的相关操作。

LinkedList 实现了 Deque 接口,可作为队列使用。

LinkedList 实现了 Cloneable 接口,可实现克隆。

LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。

在这里插入图片描述

LinkedList常用操作

方法 描述 备注
add(E e) 末尾添加元素 返回布尔值
add(int index, E element) 向指定位置插入元素。 返回布尔值
addFirst(E e) 元素添加到头部。
addLast(E e) 元素添加到尾部。
get(int index) 返回指定位置的元素。
getFirst() 返回第一个元素。
getLast() 返回最后一个元素。
remove() 删除并返回第一个元素。
removeFirst() 删除并返回第一个元素。
removeLast() 删除并返回最后一个元素。
remove(Object o) 删除某一元素 返回布尔值
remove(int index) 删除指定位置的元素。
set(int index, E element) 设置指定位置的元素。
contains(Object o) 判断是否含有某一元素。
indexOf(Object o) 查找指定元素从前往后第一次出现的索引。
lastIndexOf(Object o) 查找指定元素最后一次出现的索引。
clear() 清空链表。
size() 返回链表元素个数。
addAll(Collection c) 将一个集合的所有元素添加到链表后面 返回布尔值
addAll(int index, Collection c) 将一个集合的所有元素添加到链表的指定位置后面 返回布尔值

ArrayList与LinkedList的抉择

ArrayList :是顺序结构,查找和修改速度快,就像电影票

LinkedList :是链表结构,增加和删除速度快,就像佛珠

HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合

HashSet 允许有 null 值

HashSet 是无序的,即不会记录插入的顺序

HashSet 不是线程安全的

HashSet 实现了 Set 接口

在这里插入图片描述

HashSet类常用方法

方法 描述
add() 添加元素
remove(value) 删除元素
contoins(value) 判断是否存在元素
size() 得到元素个数
for-each 迭代

HashSet、LinkedHashSet、TreeSet的抉择

HashSet: 无序

LinkedHashSet: 按照插入顺序

TreeSet: 从小到大排序

HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

在这里插入图片描述

HashMap类常用操作

方法 功能
put() 将键/值对添加到 hashMap 中
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
remove() 删除指定键 key 的映射关系
containsKey() 是否存在指定的 key
keySet 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键/值对的数量
forEach() 对 hashMap 中的每个映射执行指定的操作。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。

HashMap与Hashtable的抉择

HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式

区别1:

  • HashMap可以存放 null
  • Hashtable不能存放null

区别2:

  • HashMap不是线程安全的类
  • Hashtable是线程安全的类

Collections工具类

Collections是一个类,由静态方法组成,是针对集合框架,容器的工具类,就如同Arrays是数组的工具类

方法 功能
reverse() 反转
shuffle() 随机打乱
sort() 升序排序
swap() 交换
synchronizedList() 线程安全化

自然排序的使用

retuen的结果会有什么影响:

  • return 负数----表示后面的比前面的小,后来的元素放在前面
  • return 0----表示两个是同一个元素
  • return 正数----表示后面的比前面的大,后来的元素放在后面

自定义排序的口诀:

升序this在前----降序this在后

方法:类去实现Comparable接口,重写compareTo方法

public class Student implements Comparable<Student> {
    
    

    int uid;
    int score;

    public Student(int uid, int score) {
    
    
        this.uid = uid;
        this.score = score;
    }

    @Override
    public int compareTo(Student student) {
    
    
        // 升序this在前----降序this在后
        return this.score-student.score;
    }
    public static void main(String[] args) {
    
    
        TreeSet<Student> studentHashSet = new TreeSet<>();
        studentHashSet.add(new Student(1,11));
        studentHashSet.add(new Student(5,6));
        studentHashSet.add(new Student(7,13));
        studentHashSet.add(new Student(2,17));
        studentHashSet.add(new Student(6,9));

        for (Student student : studentHashSet) {
    
    
            System.out.println(student.uid+":"+student.score);
        }
    }
}

自定义排序方法:比较器排序Comparator

使用comparator接口对ArrayList排序无效

public class Student {
    
    

    int uid;
    int score;

    public Student(int uid, int score) {
    
    
        this.uid = uid;
        this.score = score;
    }
    
    public static void main(String[] args) {
    
    

        TreeSet<Student> studentHashSet = new TreeSet<Student>(new Comparator<Student>() {
    
    
            @Override
            public int compare(Student student1,Student student2) {
    
    
                //升序前减后,降序后减前
                return student1.score-student2.score;
            }
        });
        studentHashSet.add(new Student(1,11));
        studentHashSet.add(new Student(5,6));
        studentHashSet.add(new Student(7,13));
        studentHashSet.add(new Student(2,17));
        studentHashSet.add(new Student(6,9));

        for (Student student : studentHashSet) {
    
    
            System.out.println(student.uid+":"+student.score);
        }
    }
}

Comparable与Comparator的对比

Comparable是通过放置的对象去实现Comparable接口的compareTo方法,升序this在前,降序this在后

Comparator是通过创建的集合去实现匿名内部类,升序前减后,降序后减前

哈希值与哈希表

哈希值是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值,可以通过对象的hashCode()方法获取,默认情况下不同对象的哈希值是不同的,重写hashCode()方法后可以让不同对象拥有相同哈希值

猜你喜欢

转载自blog.csdn.net/m0_46521785/article/details/114718514