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 com.example.a;class...
Java堆和栈
在Java编程语言中,堆(Heap)和栈(Stack)是两种不同的内存区域,它们有着不同的用途和管理方式。 堆(Heap)1. 定义与功能:堆是Java程序运行时的一个内存区域,它主要负责存储对象实例。每当使用new关键字创建一个对象时,该对象的引用以及它的实际数据(成员变量)都会在堆中分配空间。堆内存的特点是可以动态地分配和回收,这意味着你不需要在编译时就知道需要多少内存,而是在运行时根据需要申请和释放。 2. 管理方式:Java虚拟机(JVM)通过垃圾回收机制自动管理堆内存。当一个对象不再被任何引用指向时,垃圾回收器会识别并回收这部分内存,以防止内存泄漏。由于垃圾回收的过程较为复杂,因此访问堆内存的速度相对栈来说较慢。 3. 存储内容:堆上存储的是所有由new创建的对象和数组,包括基本类型包装类的对象实例。 栈(Stack)1. 定义与功能:栈是一种线程相关的内存区域,每个Java线程都有自己的栈空间。栈主要用于存储方法调用时的局部变量、方法参数、返回地址(即程序计数器PC寄存器的内容),以及中间计算结果等临时数据。每一个方法调用都会创建一个新的栈帧(Stack...
Java的异常的类型
Java异常的层次结构 Throwable有两个直接的子类: Error、Exception。 ErrorJVM内部的严重问题,比如资源不足等,无法恢复。处理方式: 程序员不用处理 ExceptionJVM通过处理还可回到正常执行流程,即:可恢复。分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; // Default to 0 //...
java stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 1234无状态:指元素的处理不受之前元素的影响;有状态:指该操作只有拿到所有元素之后才能继续下去。非短路操作:指必须处理所有元素才能得到最终结果;短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。 什么是 Stream?Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源 流的来源。 可以是集合,数组,I/O...