Java HashMap 本文为个人学习摘要笔记。 原文地址:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 使用频率最高的用于映射(键值对)处理的数据类型。 Java 为数据结构中的映射定义了一个接口 java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap、Hashtable、LinkedHashMap 和 TreeMap,类继承关系如下图所示 哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java 中 HashMap 采用了链地址法。链地址法,简单来说,就是数组加链表的结合。 如果哈希桶数组很大,即使较差的 Hash 算法也会比较分散,如果哈希桶数组数组很小,即使好的 Hash 算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的 TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); // 步骤5:
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 库中创建的都是串行流。Collection.stream() 为集合创建串行流而 Collection.parallelStream() 为集合创建并行流。 这是因为 Java 不保证这些副作用对其它线程可见,也不保证相同流管道上的同样的元素的不同的操作运行在同一个线程中。很多有副作用的行为参数可以被转换成无副作用的实现。 "A", "B", "C", "D").reduce("", String::concat)); // ABCD 基本类型 Java 8 提供了一些专门针对基本类型优化的 API,如 IntStream 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 注释 二、变量与常量 1、声明变量 2、变量的初始化 3、常量 4、枚举类型变量 三、方法 1、方法的构成 2、方法参数传递 3、方法的重载 ---- 一、Java 注释 与大多数程序设计语言一样,Java 与所有程序设计语言一样,Java 也使用变量来存储值,常量就是指不变的变量。 1、声明变量 在 Java 中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量名之前。 1、方法的构成 方法包括方法头和方法体,方法头又可以分成修饰符、返回值类型、方法名和参数列表,因此方法包括 5 个部分: 修饰符:修饰符是可选的,告诉编译器如何调用该方法。
比如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网络编程之前,先来了解一下涉及到的基础概念。 (4、5)用户进程再次发起read读取数据,如果数据还没准备好,直接返回。 (6)用户进程再次发起read读取数据,这时候数据已经拷贝到内核缓冲区了。 (5)将数据从内核拷贝到用户空间缓存,在此期间用户进程会被阻塞。 (6)内核返回结果,用户进程解除阻塞。 (4、5)内核等待数据返回后,会给用户进程发送一个SIGIO信号。 (6)用户进程在信号处理函数中调用recvfrom读取数据,数据返回前,用户进程阻塞。 (5)数据拷贝完成后,内核会给用户发送一个signal或者执行一个基于线程的回调函数来完成这次IO处理过程。 ---- 转载请注明出处——胡玉洋 《Java网络编程——基础概念》
并行(parallelism) 这个概念很好理解。所谓并行,就是同时执行的意思,无需过度解读。判断程序是否处于并行的状态,就看同一时刻是否有超过一个“工作单位”在运行就好了。 并发(concurrency) 要理解“并发”这个概念,必须得清楚,并发指的是程序的“结构”。当我们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。
Java final 与 static final 数据 声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
// 星期四 十二月 26, 2019 Date 对象有几个严重的问题:它不能转换时区,除了 toGMTString() 可以按 GMT+0:00 输出外,Date 总是以当前计算机系统的默认时区为基础进行输出 Calendar c = Calendar.getInstance(); // 清除所有 c.clear(); // 设置年月日时分秒 c.set(2019, 10, 20, 8, 15, 0); // 加5天并减去 2小时 c.add(Calendar.DAY_OF_MONTH, 5); c.add(Calendar.HOUR_OF_DAY, -2); // 显示时间 SimpleDateFormat sdf = dt = LocalDateTime.of(2019, 10, 26, 20, 30, 59); System.out.println(dt); // 2019-10-26T20:30:59 // 加5天减 3小时 LocalDateTime dt2 = dt.plusDays(5).minusHours(3); System.out.println(dt2); // 2019-10-31T17:30:59
Java 只有值传递 本文为个人学习摘要笔记。 Java 中的值传递 上面的三个栗子,表现的结果不一样,导致大家对 Java 中传递类型产生困惑。 其实,上面的概念没有错,只是代码的例子有问题。 这里再复习下值传递和引用传递的概念,然后再举几个真正恰当的例子。 通过概念我们也能知道,这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。 简单点说,Java 中的传递,是值传递,而这个值,实际上是对象的引用。而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说 Java 的传递是按共享传递,或者说 Java 中的传递是值传递。
Java Object 通用方法 概览 public boolean equals(Object obj) public native int hashCode() protected native 一个数与 31 相乘可以转换成移位和减法:31*x == (x<<5)-x,编译器会自动进行这个优化。 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(),可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。
通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。 具体内容请参考上面的第 5 小节。 4. 其中二进制字节流可以从以下方式中获取: 从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。 从网络中获取,最典型的应用是 Applet。 其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 5. 初始化 初始化阶段才真正开始执行类中定义的 Java 程序代码。 好处 使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一。
目录 前言 一、逻辑运算符 (1)逻辑运算符介绍 (2)逻辑运算符分类 (3)逻辑运算符运算规则 (4)逻辑与短路的区别 (5)演示 (6)逻辑异或 二、赋值运算符 (1)赋值运算符介绍 (2)赋值运算符分类 (3)赋值运算符特点 总结 ---- 前言 了解 逻辑运算符 和 赋值运算符 的基础知识。 )逻辑或(|):当 a 和 b 有一个为 true 时,结果为 true , 否则为 false 4)短路或(||):当 a 和 b 有一个为 true 时,结果为 true , 否则为 false 5) false 2)对于短路或来说,如果第一个条件为 true ,则后面的条件不会在判断,结果为 true 对于逻辑或来说,如果第一个条件为 true ,则后面的条件也会继续判断,结果为true (5) if((5 < 10)^ (10 > 100)) { System.out.print("正确"); } else { System.out.print("错误"); }
Java小工匠聊网络编程--JavaNIO-基础概念 1、同步与异步 同步与异步主要是从消息通知机制角度来说的。同步没有通知,异步有知。 5个IO模型
Java 中所有的变量、表达式和值都必须有自己的类型,没有“无类型”变量这样的概念。 学习任何一种编程语言都要了解其数据类型,几乎所有的编程语言中都会有数据类型,什么是数据类型呢? 换句话说,Java中的数据类型作用就是指导Java虚拟机在程序运行阶段到底应该给该变量分配多大的内存空间。 一、Java数据类型 变量就是申请内存来存储值。 二、Java的基本数据类型 Java语言提供了八种基本数据类型。 Java 默认的浮点型为 double,例如,11.11 和 1.2345 都是 double 型数值。 :Character.MIN_VALUE=0 最大值:Character.MAX_VALUE=65535 三、Java的引用数据类型 Java的引用数据类型建立在基本数据类型的基础上,包括数组、类和接口