Java HashMap 本文为个人学习摘要笔记。 原文地址:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 使用频率最高的用于映射(键值对)处理的数据类型。 Java 为数据结构中的映射定义了一个接口 java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap、Hashtable、LinkedHashMap 和 TreeMap,类继承关系如下图所示 哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java 中 HashMap 采用了链地址法。链地址法,简单来说,就是数组加链表的结合。 系统将调用 key 的 hashCode() 方法得到其 hashCode 值(该方法适用于每个 Java 对象),然后再通过 Hash 算法的后两步运算(高位运算和取模运算)来定位该键值对的存储位置, 如果哈希桶数组很大,即使较差的 Hash 算法也会比较分散,如果哈希桶数组数组很小,即使好的 Hash 算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的
Java String 概览 String 被声明为 final,因此它不可被继承(Integer 等包装类也不能被继承)。 在 Java 8 中,String 内部使用 char 数组存储数据。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { String s5 = "bbb"; String s6 = "bbb"; System.out.println(s5 == s6); // true 在 Java 7 之前,String Pool 被放在运行时常量池中 而在 Java 7,String Pool 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 #18 = Utf8 java/lang/String #19 = Utf8 abc // ...
Java Stream Stream 总览 Stream 是 Java 8 新增加的类,用来补充集合类。 Stream 代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。 这是因为 Java 不保证这些副作用对其它线程可见,也不保证相同流管道上的同样的元素的不同的操作运行在同一个线程中。很多有副作用的行为参数可以被转换成无副作用的实现。 的 IntStream IntStream generated = IntStream.generate(() -> 3); // 得到一个无限循环的 IntStream, 值为 1, 3, 5, 7 =MALE, grade=FOUR)], THREE=[Student(name=大明, age=9, gender=MALE, grade=THREE), Student(name=小红, age=7, Stream 详解 Java 8 之基本类型优化
Java 异常 Throwable 可以用来表示任何可以作为异常抛出的类,分为两种:Error 和 Exception。 Error Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 例如,Java 虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。 这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止;还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。 在 Java 中,错误通常是使用 Error 的子类描述。 Exception Exception 分为两种: 受检异常:需要用 try...catch...
Java 枚举 本文为个人学习摘要笔记。 原文地址:恕我直言,我怀疑你没怎么用过枚举 为什么需要枚举 相比于使用接口或者常量类,枚举具有一个明确性的约束。 Calculator.DIVISION.execute(4.0, 2.0)); // 2.0 } } 枚举集合类 JDK5.0 中在增加 Enum 类的同时,也增加了两个工具类 EnumSet 和 EnumMap,这两个类都放在 java.util (User user : userList) { userStatisticMap.merge(user.getUserRole(), 1, Integer::sum); } 扩展阅读: Java
Java List 本文为个人学习摘要笔记。 具体详情可以参考:18 Java fail fast 这里再次分析下源码: public Iterator<E> iterator() { return new Itr(); } private
从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。 并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。 中两个比较重要的概念。 ,重载是一个编译期概念。 关于重载是不是多态有多种论调,有些人认为重载不属于多态的体现,可以参考:Java 中多态的实现方式 多态 上面总结了重写与重载的概念与他们之间的区别,这里再说一下多态,以及为什么说重载不属于多态。
基本原理 volatile 在Java中允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保使用排它锁来单独获得这个变量,Java中提供了 volatile,使之在多处理器开发中保证变量的可见性 synchronized 通过锁机制实现同步,在Java中每一个对象都可以作为锁,有以下三种形式: 对于普通同步方法,锁的是当前实例对象。 对于静态同步方法,所得是当前类 class 对象。 为了减少获得锁和释放锁带来的性能消耗,Java SE 1.6 引入了偏向锁和轻量级锁。
与大多数程序设计语言一样,Java中的注释也不会出现在可执行程序中。因此,可以在源程序中根据需要添加任意多的注释,而不必担心可执行代码会膨胀。 ~ 本篇主要记录内容包括:Java 注释、声明变量、变量的初始化、常量及枚举类型变量。 ---- 上一篇内容:Java基础:Java程序设计环境 下一篇内容:Java基础:Java数据类型 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中) ---- 文章目录 一、Java 注释 二、变量与常量 1、声明变量 2、变量的初始化 3、常量 4、枚举类型变量 三、方法 1、方法的构成 2、方法参数传递 3、方法的重载 ---- 一、Java 注释 与大多数程序设计语言一样,Java 与所有程序设计语言一样,Java 也使用变量来存储值,常量就是指不变的变量。 1、声明变量 在 Java 中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量名之前。
比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 2.java中的线程 一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。 其他线程通过使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 线程又分用户线程和守护线程。 4.创建一个线程 Java提供了两种创建线程方法: 通过实现Runable接口; 通过继承Thread类本身。 1、如果是扩展java.lang.Thread类的线程,则直接new即可。 6.线程的几个概念 在多线程编程时,你需要了解以下几个概念: 线程同步 线程间通信 线程死锁 线程控制:挂起、停止和恢复 7.线程同步和锁下次学习
在学习Java网络编程之前,先来了解一下涉及到的基础概念。 (7)把数据从内核缓冲区拷贝到用户缓冲区,这个过程用户进程阻塞。 (8)内核返回结果,用户进程解除阻塞。 IO多路复用 (1)当用户进程调用了select,用户进程会被阻塞。 (7)将数据从内核拷贝到用户空间缓存。 (8)内核返回结果,用户进程解除阻塞。 ---- 转载请注明出处——胡玉洋 《Java网络编程——基础概念》
并行(parallelism) 这个概念很好理解。所谓并行,就是同时执行的意思,无需过度解读。判断程序是否处于并行的状态,就看同一时刻是否有超过一个“工作单位”在运行就好了。 并发(concurrency) 要理解“并发”这个概念,必须得清楚,并发指的是程序的“结构”。当我们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。
Java final 与 static final 数据 声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
// 星期四 十二月 26, 2019 Date 对象有几个严重的问题:它不能转换时区,除了 toGMTString() 可以按 GMT+0:00 输出外,Date 总是以当前计算机系统的默认时区为基础进行输出 / 2019-12-27 6 10:11:10.657 Calendar 获取年月日这些信息变成了 get(int field),返回的年份不必转换,返回的月份仍然要加 1,返回的星期要特别注意,1~7 此外,新 API 修正了旧 API 不合理的常量设计: Month 的范围用 1~12 表示 1 月到 12 月; Week 的范围用 1~7 表示周一到周日。 下表是数据库类型与 Java 新旧 API 的映射关系: 数据库 对应 Java 类(旧) 对应 Java 类(新) DATETIME java.util.Date LocalDateTime DATE 15 System.out.println(timestampToString(ts, Locale.US, "America/New_York")); // Nov 19, 2019 7:
Java 只有值传递 本文为个人学习摘要笔记。 Java 中的值传递 上面的三个栗子,表现的结果不一样,导致大家对 Java 中传递类型产生困惑。 其实,上面的概念没有错,只是代码的例子有问题。 这里再复习下值传递和引用传递的概念,然后再举几个真正恰当的例子。 通过概念我们也能知道,这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。 简单点说,Java 中的传递,是值传递,而这个值,实际上是对象的引用。而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说 Java 的传递是按共享传递,或者说 Java 中的传递是值传递。
Java Object 通用方法 概览 public boolean equals(Object obj) public native int hashCode() protected native CloneExample e1 = new CloneExample(); // CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object CloneExample e2 = e1.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } java.lang.CloneNotSupportedException Effective Java 书上讲到,最好不要去使用 clone(),可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。
新生代使用:复制算法 老年代使用:标记 – 清除 或者 标记 – 整理 算法 垃圾收集器 以上是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器可以配合使用。 7. G1 收集器 G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。 通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。 其中二进制字节流可以从以下方式中获取: 从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。 从网络中获取,最典型的应用是 Applet。 好处 使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一。
2)八进制:0 - 7,满 8 进 1,以数字0开头。 3)十进制:0 - 9,满 10 进 1。 演示: 0237 => 0 3(011) 3(011) 7(111) => 0b11011111 // 八进制转二进制 0x23b => 0x 3(0011) 3(0011) b(1011) = 0b001100111011
字符串类: String类、StringBuffer类和StringBuilder类 String类和StringBuffer类都在Java的lang包中,并被定义为最终(final) 类,不能再派生子类 String类 String类被Java的开发者构造得非常接近基本数据类型,换句话说,在很多时候可以象用基本数据类型一样来使用tring类 构造方法: String s; //声明了一一个空字符串sString 判断一一个字符串是否包含指定的字符子串或指定的字符 ●两个字符串对象恒等比较 ●两个字符串对象大小比较 ●字符串连结,字符替换和字符串大小写转换 ●字符串截取 ●把基本数据类型转换为字符串 ●把字符串转换为字节数组或字符数组 ●Java 中可以使用关系运算符“==”判定两个字符串是否相等 ●与equals(方法不同的是,“==”判定两字符串对象是否是同一实例,即它们在内存中的存储空间是否相同 1、Java中可以使用关系运算符“==”判定两个字符串是否相等 JAVA基础 | java基础6(IO) 2. JAVA基础 | java基础5(异常介绍) ?
当声明一个方法或变量为使用static关键字时,就意味这这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域