🛸~~ 🚁🚁🚁🛩️🛩️🛩|

n1ce2cv

园龄:5年2个月粉丝:4关注:1

07 2024 档案

字节流
摘要:字节输出流(OutputStream) java.io.OutputStream 是字节输出流的超类(父类),我们来看一下它定义的一些共性方法: 1、 close() :关闭此输出流并释放与此流相关联的系统资源。 2、 flush() :刷新此输出流并强制缓冲区的字节被写入到目的地。 3、 writ
8
0
0
Java IO模型
摘要:Java 的 IO 分为两大类,一类是传统的 IO(Blocking IO),一类是 NIO(New IO)。 传统的 IO 基于字节流和字符流,以阻塞式 IO 操作为主。常用的类有 FileInputStream、FileOutputStream、InputStreamReader、OutputS
39
0
0
文件流
摘要:java.io.File 类是专门对文件进行操作的类,注意只能对文件本身进行操作,不能对文件内容进行操作,想要操作内容,必须借助输入输出流。 File 类是文件和目录的抽象表示,主要用于文件和目录的创建、查找和删除等操作。 File 构造方法 比较常用的构造方法有三个: 1、 File(String
10
0
0
Seralizable
摘要:class CSer { private String name; private int age; public CSer() { } public CSer(String name, int age) { this.name = name; this.age = age; } public St
21
0
0
IO体系
摘要:IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。 Java 中是通过流处理IO 的,那么什么是流? 流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。 当程序需要读取数据的时候,
10
0
0
生产者消费者
摘要:生产者-消费者,实际上包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中获取数据,不需要关心生产者的行为。如果共享数据区
17
0
0
CopyOnWriteArrayList
摘要:ArrayList 是一个线程不安全的容器,如果在多线程环境下使用,需要手动加锁,或者使用 Collections.synchronizedList() 方法将其转换为线程安全的容器。否则,将会出现 ConcurrentModificationException 异常。 CopyOnWriteArr
24
0
0
ConcurrentHashMap
摘要:ConcurrentHashMap 是 Java 并发包 (java.util.concurrent) 中的一种线程安全的哈希表实现。 HashMap 在多线程环境下扩容会出现 CPU 接近 100% 的情况,因为 HashMap 并不是线程安全的,我们可以通过 Collections 的Map<K
12
0
0
并发容器
摘要:Java 的并发集合容器提供了在多线程环境中高效访问和操作的数据结构。这些容器通过内部的同步机制实现了线程安全,使得开发者无需显式同步代码就能在并发环境下安全使用,比如说:ConcurrentHashMap、阻塞队列和 CopyOnWrite 容器等。 java.util 包下提供了一些容器类(集合
12
0
0
LockSupport
摘要:LockSupprot 用来阻塞和唤醒线程,底层实现依赖于 Unsafe 类(后面会细讲)。 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开。 public class Main { public static void main(String[] a
16
0
0
ThreadLocal
摘要:ThreadLocal 是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。 通常,我们会使用 synchronzed 关键字 或者 lock 来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获
11
0
0
ScheduledThreadPoolExecutor
摘要:定时任务 ScheduledThreadPoolExecutor 类有两个用途:指定时间延迟后执行任务;周期性重复执行任务。 JDK 1.5 之前,主要使用Timer类来完成定时任务,但是Timer有以下缺陷: Timer 是单线程模式; 如果在执行任务期间某个 TimerTask 耗时较久,就会影
10
0
0
ForkJoin框架
摘要:并发编程领域的任务可以分为三种:简单并行任务、聚合任务和批量并行任务,见下图。 这些模型之外,还有一种任务模型被称为“分治”。分治是一种解决复杂问题的思维方法和模式;具体而言,它将一个复杂的问题分解成多个相似的子问题,然后再将这些子问题进一步分解成更小的子问题,直到每个子问题变得足够简单从而可以直接
44
0
0
通信工具类
摘要:类 作用 Semaphore 限制线程的数量 Exchanger 两个线程交换数据 CountDownLatch 线程等待直到计数器减为 0 时开始工作 CyclicBarrier 作用跟 CountDownLatch 类似,但是可以重复使用 Phaser 增强的 CyclicBarrier Sem
9
0
0
Unsafe
摘要:Unsafe 基础 Unsafe 是 Java 中一个非常特殊的类,它为 Java 提供了一种底层、"不安全"的机制来直接访问和操作内存、线程和对象。正如其名字所暗示的,Unsafe 提供了许多不安全的操作,因此它的使用应该非常小心,并限于那些确实需要使用这些底层操作的场景。 Unsafe 在 st
27
0
0
原子操作类Atomic
摘要:原子操作的基本数据类型 基本类型的原子操作主要有这些: AtomicBoolean:以原子更新的方式更新 boolean; AtomicInteger:以原子更新的方式更新 Integer; AtomicLong:以原子更新的方式更新 Long; 这几个类的用法基本一致,这里以 AtomicInte
57
0
0
BlockingQueue
摘要:BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。 最常见的"生产者-消费者"问题中,队列通常被视作线程间的
21
0
0
线程池
摘要:使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 线
12
0
0
Condition
摘要:Condition 接口一共提供了以下 7 个方法: await():线程等待直到被通知或者中断。类似于 Object.wait()。 awaitUninterruptibly():线程等待直到被通知,即使在等待时被中断也不会返回。没有与之对应的 Object 方法。 await(long time
31
0
0
ReentrantReadWriteLock
摘要:ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。 在并发场景中,为了解决线程安全问题,我们通常会使用关键字 synchronize
21
0
0
可重入锁ReentrantLock
摘要:ReentrantLock 重入锁,是实现Lock 接口 的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。 要想支持重入性,就要解决两个问题: 在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功;
37
0
0
锁的分类和JUC
摘要:锁的分类 乐观锁、悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java 中,synchronized 关键字是最典型的悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会加锁,只是
17
0
0
抽象队列同步器AQS
摘要:AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器,从字面上可以这样理解: 抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现; 队列:使用先进先出(FIFO)的队列存储数据; 同步:实现了同步的功能。 AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单
53
0
0
VuePress安装
摘要:linux 下预构建二进制文件安装 Nodejs Nodejs预购建二级制文件下载地址 安装 Nodejs 和 npm # 解压 tar xvf node-v20.15.1-linux-x64.tar.xz # 移动解压出的文件夹到 /usr/local下,并且重命名为nodejs mv ./nod
24
0
0
乐观锁CAS
摘要:在 Java 中,我们可以使用 synchronized 关键字和 CAS 来实现加锁效果。 悲观锁: 对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 synchronized 是悲观锁,尽管随着 JDK 版本的
28
0
0
偏向锁
摘要:public class Test { static int i; public void test() { synchronized (this) { i++; } } } 0 aload_0 1 dup 2 astore_1 // monitorenter 指令在编译后会插入到同步代码块的开始位
23
0
0
synchronized的四种锁状态
摘要:Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。 类锁,其实就是 Class 对象的锁。 Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应
67
0
0
synchronized关键字
摘要:在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 的另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变
39
0
0
volatile关键字
摘要:volatile 可以保证可见性,但不保证原子性: 当写一个 volatile 变量时,JMM 会把该线程在本地内存中的变量强制刷新到主内存中去; 这个写操作会导致其他线程中的 volatile 变量缓存无效。 volatile 会禁止指令重排 重排序需要遵守的规则: 重排序不会对存在数据依赖关系的
14
0
0
JMM
摘要:Java 内存模型 Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。它主要涉及到多线程环境下的共享变量可见性、指令重排等问题,是理解并发编程中的关键概念。 两种并发模型: 如何通信 如何同步 消息传递并发模型
19
0
0
线程组和线程优先级
摘要:线程组 每个 Thread 必然存在于一个 ThreadGroup 中,Thread 不能独立于 ThreadGroup 存在。执行main()方法的线程名字是 main,如果在 new Thread 时没有显式指定,那么默认将父线程的线程组设置为自己的线程组。 public static void
14
0
0
Java线程的六种状态
摘要:OS 中的进程/线程状态 操作系统中的进程/线程状态转换图: Java 线程的六个状态: // Thread.State 源码 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } NEW
95
0
0
获取线程的执行结果
摘要:无返回值的 Runnable public interface Runnable { public abstract void run(); } public static void main(String[] args) throws ExecutionException, Interrupted
22
0
0
Java多线程入门
摘要:创建线程的三种方式 继承Thread类 class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + " " +
13
0
0
类加载机制
摘要:类的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺
29
0
0
对象存在位置
摘要:对象优先在 Eden 分配 堆分为新生代和老年代,新生代用于存放使用后就要被回收的对象(朝生夕死),老年代用于存放生命周期比较长的对象。 创建的大部分对象,都属于生命周期较短的对象,所以会存放在新生代。新生代又细分 Eden、From Survivor、To Survivor,对象会优先在 Eden
23
0
0
垃圾收集器
摘要:JVM 的垃圾收集器主要分为两大类:分代收集器和分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1 和 ZGC 分代收集器 CMS 以获取最短回收停顿时间为目标,采用“标记-清除”算法,分 4 大步进行垃圾收集,其中初始标记和重新标记会 STW,JDK 1.5 时引入,JDK9 被标记
29
0
0
垃圾回收机制
摘要:垃圾回收的概念 垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存爆掉。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。 垃圾判断算法 引用计数算法 引用计数算法(Reachability Counting)是通过在
11
0
0
运行时数据区
摘要:Java 源代码文件经过编译器编译后会生成字节码文件,经过加载器加载完毕后会交给执行引擎执行。在执行的过程中,JVM 会划出来一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区 根据 Java 虚拟机规范的规定,运行时数据区可以分为以下几个部分: 程序计数器(Program C
35
0
0
字节码指令
摘要:加载与存储指令 public int add(int a, int b) { int res = a + b; return res; } 字节码指令 public int add(int, int); descriptor: (II)I flags: (0x0001) ACC_PUBLIC Cod
31
0
0
JVM栈帧
摘要:Java 的源码文件经过编译器编译后会生成字节码文件,然后由 JVM 的类加载器进行加载,再交给执行引擎执行。在执行过程中,JVM 会划出一块内存空间来存储程序执行期间所需要用到的数据,这块空间一般被称为运行时数据区。 栈帧(Stack Frame)是运行时数据区中用于支持虚拟机进行方法调用和方法执
15
0
0
javap和字节码
摘要:javap 字节码的基本信息 public class Test { private int age = 10; public int getAge() { return age; } } 在 class 文件的同级目录下输入命令 javap -v -p Test.class 来查看一下输出的内容
22
0
0
JVM类文件结构
摘要:.java源文件 package test.JVM; public class Test { public static void main(String[] args) { System.out.println("haha"); } } 十六进制查看.class文件 魔数 第一行中有一串特殊的字符
19
0
0
认识JVM
摘要:类加载器 运行时数据区 执行引擎 执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令 JVM架构图
10
0
0
反射
摘要:缺点 破坏封装:由于反射允许访问私有字段和私有方法,所以可能会破坏封装而导致安全问题。 性能开销:由于反射涉及到动态解析,因此无法执行 Java 虚拟机优化 应用场景 开发通用框架:像 Spring,为了保持通用性,通过配置文件来加载不同的对象,调用不同的方法。 动态代理:在面向切面编程中,需要拦截
21
0
0
按值传递
摘要:值传递:当一个参数按照值的方式在两个方法之间传递时,调用者和被调用者其实是用的两个不同的变量——被调用者中的变量(原始值)是调用者中变量的一份拷贝,对它们当中的任何一个变量修改都不会影响到另外一个变量 引用传递: 当一个参数按照引用传递的方式在两个方法之间传递时,调用者和被调用者其实用的是同一个变量
7
0
0
拆箱和装箱
摘要:// 手动装箱 Integer integer = new Integer(10); // 手动拆箱 int i = integer.intValue(); // 自动装箱,通过 Integer.valueOf() 完成 Integer integer = 10; // 自动拆箱,通过 Intege
8
0
0
浅拷贝深拷贝2
摘要:// Cloneable 接口是一个标记接口,用来表示某个功能在执行的时候是合法的 public interface Cloneable { } 没有引用类型字段时 class Writer implements Cloneable { private int age; private String
7
0
0
StringBuffer和StringBuilder
摘要:public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence { public StringBuffer() { super(16); } public sync
6
0
0
intern
摘要:当调用 intern() 方法时,如果字符串池中已经存在相同内容的字符串,则返回字符串池中的引用;否则,将该字符串添加到字符串池中,并返回对字符串池中的新引用。可以确保所有具有相同内容的字符串共享相同的内存空间 对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.
30
0
0
字符串源码
摘要:String类的声明 // final不可被继承 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { } 比较字符串内容 public boolean equals
9
0
0
字符串拼接
摘要:StringBuilder的append() String s1 = "ha"; String s2 = "xi"; // 编译的时候被替换成 new StringBuilder(s1).append(s2).toString(); System.out.println(s1 + s2); Stri
9
0
0
字符串常量池
摘要:new String()创建了几个对象 // 使用new,每次都会创建一个新的对象 String s = new String("hh"); 先在位于堆中的字符串常量池中查找是否已经存在hh字符串对象 如果有,直接在堆中创建一个hh字符串对象,然后把这个堆中新创建的对象地址返回给栈中的变量s 如果没
6
0
0
判断字符串相等
摘要:“==”操作符用于比较两个对象的地址是否相等。 .equals() 方法用于比较两个对象的内容是否相等。 String s1 = new String("hh"); String s2 = new String("hh"); // true System.out.println(s1.equals(
28
0
0
基本数据类型缓存池
摘要:基本数据类型的包装类除了 Float 和 Double 之外,其他六个包装器类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池。 Byte:-128~127,也就是所有的 byte 值 Short:-128~127 Long:-128~127 Ch
24
0
0
注解
摘要:注解 注解的生命周期有 3 种策略,定义在 RetentionPolicy 枚举中 1)SOURCE:在源文件中有效,被编译器丢弃。 2)CLASS:在编译器生成的字节码文件中有效,但在运行时会被处理类文件的 JVM 丢弃。 3)RUNTIME:在运行时有效。这也是注解生命周期中最常用的一种策略,它
9
0
0
内部类
摘要:内部类 一个类定义在另外一个类里面或者一个方法里面,这样的类叫做内部类 成员内部类 package test.InnerClass; class CSer { String weapon; private int hp; static int money = 800; public CSer() {
5
0
0
类和对象
摘要:类和对象 直接通过匿名对象调用方法 // 匿名对象意味着没有引用变量,它只能在创建的时候被使用一次 new Person().initialize("沉默王二", 18, 1); Object类 对象比较 public native int hashCode() public native int
6
0
0
接口
摘要:接口 定义接口 public interface Electronic { // 常量 String LED = "LED"; // 抽象方法 int getElectricityUse(); // 静态方法 static boolean isEnergyEfficient(String elect
9
0
0
关键字
摘要:this 调用当前类的方法; this() 可以调用当前类的构造方法,但必须放在构造方法的第一行; this 可以作为参数在方法中传递; this 可以作为参数在构造方法中传递; this 可以作为方法的返回值,返回当前类的对象。 super 指向父类对象; 调用父类的方法; super() 可以调
141
0
0
封装、继承和多态
摘要:封装 1、良好的封装能够减少耦合。 2、类内部的结构可以自由修改。 3、可以对成员进行更精确的控制。 4、隐藏信息,实现细节。 继承 Java 有三种实现多继承效果的方式,分别是内部类、多层继承和实现接口。 父类的构造方法不能被继承 子类的构造过程必须调用其父类的构造方法:Java 虚拟机构造子类对
7
0
0
方法
摘要:方法 访问权限 public:该方法可以被所有类访问。 private:该方法只能在定义它的类中访问。 protected:该方法可以被同一个包中的类,或者不同包中的子类访问。 default:如果一个方法没有使用任何访问权限修饰符,那么它是 package-private 的,意味着该方法只能被同
9
0
0
代码初始化块
摘要:代码初始化块 类实例化的时候执行代码初始化块; 实际上,代码初始化块是放在构造方法中执行的,只不过比较靠前; 代码初始化块里的执行顺序是从前到后的。 class A { A () { System.out.println("父类构造方法"); } } public class B extends A
9
0
0
抽象类
摘要:抽象类 抽象类不能被实例化。 抽象类应该至少有一个抽象方法,否则它没有任何意义。 抽象类中的抽象方法没有方法体。 抽象类的子类必须给出父类中的抽象方法的具体实现,除非该子类也是抽象类。 // 命名规范以Abstruct或者Base开头 public abstract class AbstractPl
8
0
0
不可变类
摘要:不可变类 一个类的对象在通过构造方法创建后如果状态不会再被改变,那么它就是一个不可变(immutable)类。它的所有成员变量的赋值仅在构造方法中完成,不会提供任何 setter 方法供外部类去修改。 不可变类String 1)常量池的需要 字符串常量池是 Java 堆内存中一个特殊的存储区域,当创
7
0
0
变量
摘要:变量 局部变量 在方法体内声明的变量被称为局部变量,该变量只能在该方法内使用,类中的其他方法并不知道该变量。 局部变量声明在方法、构造方法或者语句块中。 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,将会被销毁。 访问修饰符不能用于局部变量。 局部变量只在声明它的方法、构造
10
0
0
摘要:包 Java 定义了一种名字空间,称之为包:package。一个类总是属于某个包,类名(比如Person)只是一个简写,真正的完整类名是包名.类名。使用package来解决名字冲突。 包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。 包的作用域 不用p
10
0
0
20个异常处理的最佳实践
摘要:尽量不要 catch RuntimeException,比如 NullPointerException、IndexOutOfBoundsException 等等,应该用预检查的方式来规避。 尽量使用 try-with-resource 来关闭资源:禁止在 try 块中直接关闭资源,因为一旦 clos
24
0
0
异常处理全面解析
摘要:checked和unchecked异常 checked 异常(检查型异常)在源代码里必须显式地捕获或者抛出,否则编译器会提示你进行相应的操作;而 unchecked 异常(非检查型异常)就是所谓的运行时异常,通常是可以通过编码进行规避的,并不需要显式地捕获或者抛出。 NoClassDefFoundE
18
0
0
TreeMap
摘要:TreeMap 由红黑树实现,可以保持元素的自然顺序,或者实现了 Comparator 接口的自定义顺序 红黑树(英语:Red–black tree)是一种自平衡的二叉查找树(Binary Search Tree),结构复杂,但却有着良好的性能,完成查找、插入和删除的时间复杂度均为 log(n)。
12
0
0
Stack
摘要:继承自 Vector,是线程安全的 在 Java 中,推荐使用 ArrayDeque 来代替 Stack,因为 ArrayDeque 是非线程安全的,性能更好 push public E push(E item) { addElement(item); return item; } 调用了 Vect
4
0
0
PriorityQueue
摘要:PriorityQueue 是 Java 中的一个基于优先级堆的优先队列实现,它能够在 O(log n) 的时间复杂度内实现元素的插入和删除操作,并且能够自动维护队列中元素的优先级顺序。 // 传入比较器 PriorityQueue<String> priorityQueue = new Prior
6
0
0
List、Set、Queue、Map
摘要:![](https://img2024.cnblogs.com/blog/1900828/202407/1900828-20240713231926347-1764342020.png)
7
0
0
LinkedList
摘要:静态内部类Node private static class Node<E> { E item; // 双向链表 Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element
11
0
0
LinkedHashMap
摘要:HashMap 是无序的,LinkedHashMap 是可以维持插入顺序的 LinkedHashMap 继承了 HashMap,内部追加了双向链表,来维护元素的插入顺序 // LinkedHashMap.Entry 继承了 HashMap.Node static class Entry<K,V> e
10
0
0
Iterator和Iterable
摘要:Java遍历List有三种方式 public static void main(String[] args) { List<String> list = new ArrayList<>(); // for循环 for (int i = 0; i < list.size(); i++) { Syste
8
0
0
HashMap
摘要:HashMap 的实现原理是基于哈希表的,它的底层是一个数组,数组的每个位置可能是一个链表或红黑树,也可能只是一个键值对。当添加一个键值对时,HashMap 会根据键的哈希值计算出该键对应的数组下标(索引),然后将键值对插入到对应的位置。 当通过键查找值时,HashMap 也会根据键的哈希值计算出数
19
0
0
for-each循环陷阱
摘要:for-each删除元素报错 public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("haha"); list.add("xixi"); list.add("hehe"); f
6
0
0
Comparator和Comparable
摘要:Comparable 实现了 Comparable 接口,重写 compareTo() 方法,就可以按照自己制定的规则将由它创建的对象进行比较 public interface Comparable<T> { // 返回值可能为负数,零或者正数,代表的意思是该对象按照排序的规则小于、等于或者大于要比
7
0
0
ArrayList
摘要:创建ArrayList 不指定初始大小 List<String> list = new ArrayList<>(); 调用无参构造方法,创建一个初始容量为10的空列表 private static final int DEFAULT_CAPACITY = 10; private static fin
13
0
0
ArrayDeque
摘要:ArrayDeque 又实现了 Deque 接口(Deque 又实现了 Queue 接口) public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable {}
9
0
0
泛型
摘要:自定义泛型 class MyArrayList<E> { private Object[] elementData; private int size = 0; public MyArrayList(int initialCapacity) { this.elementData = new Obje
15
0
0
点击右上角即可分享
微信分享提示
深色
回顶
收起