HashMap其他注意事项
HashMap如果使用对象最为key,要注意什么?(难度:★★ 频率:★) 重写hashCode和equals。 对象比较为什么重写hashCode和equals?(难度:★★ 频率:★) 重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用; a: Map、Set等集合类型存放的对象必须是唯一的; b: 集合类判断两个对象是否相等,是先判断HashCode是否相等,如果HashCode返回TRUE,还要再判断equals返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。
HashMap扩容的原理
Java中的HashMap在内部使用一个动态可调整容量的数组来存储元素,每个数组元素称为桶(bucket),桶中存放的是键值对对象(Node、TreeNode,在JDK1.8中是链表或红黑树)。当向HashMap中添加新的键值对时,会根据键的哈希码计算出对应的桶位置。随着元素数量的增加,如果继续添加元素导致负载因子(load factor)规定的阈值被超过,则会触发扩容操作。 扩容原理如下: 扩容时机: 当HashMap中的元素个数(size)超过当前容量(capacity)与加载因子(默认为0.75)的乘积时,即 size > capacity *...
Java中的static的用法
使用位置包括:修饰成员属性,修饰成员方法,修饰代码块,修饰内部类,静态导包。 修饰成员属性 给属性加了static关键字之后,对象就不再拥有该属性了,该属性会由类去管理,即多个对象只对应一个属性。 使用场景 一般用于定义一些常量。 1234567891011package com.example.a;class Test{ public static String NAME = "Tony";}public class Demo { public static void main(String[] args) { System.out.println(Test.NAME); }} 执行结果 1Tony 修饰成员方法 方法本来就是存放在类的定义当中的。static修饰成员方法的作用是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗。 示例: 12345678910111213package...
Java堆和栈
在Java编程语言中,堆(Heap)和栈(Stack)是两种不同的内存区域,它们有着不同的用途和管理方式。 堆(Heap) 1. 定义与功能: 堆是Java程序运行时的一个内存区域,它主要负责存储对象实例。每当使用new关键字创建一个对象时,该对象的引用以及它的实际数据(成员变量)都会在堆中分配空间。堆内存的特点是可以动态地分配和回收,这意味着你不需要在编译时就知道需要多少内存,而是在运行时根据需要申请和释放。 2. 管理方式: Java虚拟机(JVM)通过垃圾回收机制自动管理堆内存。当一个对象不再被任何引用指向时,垃圾回收器会识别并回收这部分内存,以防止内存泄漏。由于垃圾回收的过程较为复杂,因此访问堆内存的速度相对栈来说较慢。 3. 存储内容: 堆上存储的是所有由new创建的对象和数组,包括基本类型包装类的对象实例。 栈(Stack) 1. 定义与功能: 栈是一种线程相关的内存区域,每个Java线程都有自己的栈空间。栈主要用于存储方法调用时的局部变量、方法参数、返回地址(即程序计数器PC寄存器的内容),以及中间计算结果等临时数据。每一个方法调用都会创建一个新的栈帧(Stack...
Java的异常的类型
Java异常的层次结构 Throwable有两个直接的子类: Error、Exception。 Error JVM内部的严重问题,比如资源不足等,无法恢复。 处理方式: 程序员不用处理 Exception JVM通过处理还可回到正常执行流程,即:可恢复。 分RuntimeException和其他Exception,或者说分为非受检异常(unchecked exception)和受检异常(checked exception)也可以称为运行时异常和编译时异常 1使用建议:将checked exceptions用于可恢复的情况,将unchecked exception用于编程的错误。 运行时异常RuntimeException(unchecked exception) 处理或者不处理都可以(不需try…catch…或在方法声明时throws) 编译时异常,其他Exception(checked exception) Java编译器要求程序必须捕获(try…catch)或声明抛出(方法声明时throws)这种异常。
List集合去重方法
在Java中,对List集合去重有多种方法,以下是一些常见的实现方式: 使用HashSet(无序去重): 123List<String> listWithDuplicates = ...; // 假设这是包含重复元素的列表Set<String> set = new HashSet<>(listWithDuplicates);List<String> distinctList = new ArrayList<>(set); 这种方法利用了HashSet自动去除重复元素的特性。先将List转换为HashSet,然后创建一个新的ArrayList来存储不重复的元素。 使用LinkedHashSet(有序去重): 123List<String> listWithDuplicates = ...;LinkedHashSet<String> linkedSet = new LinkedHashSet<>(listWithDuplicates);List<String>...
List集合进行排序
在Java中,对List集合进行排序可以使用多种方法,以下是几种常见的排序方式: 使用Collections.sort(): 12345import java.util.Collections;import java.util.List;List<Integer> numbers = Arrays.asList(5, 3, 2, 8, 1);Collections.sort(numbers); // 对整型列表进行自然排序(升序) 如果你的List里存储的是自定义对象,你需要确保该类实现了Comparable接口,并重写了compareTo()方法,这样Collections.sort()才能根据对象的自然顺序进行排序。 使用Comparator: 12345678910111213141516class User { String name; int age; // 构造函数、getter和setter省略...}List<User> users = ...; //...
Set接口及主要实现类
...
String不可变的含义、原因、好处
String不可变的含义 String不可变的含义是:将一个已有字符串"123"重新赋值成"456",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 也就是说:不可变的含义是内部数据不可变,而不是说引用不可变。 String为什么不可变 String的内部数据是一个char数组,是对字符串数组的封装,并且是被final修饰的,创建后不可改变。 123456789101112package java.lang;public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; //...