JDK

Java 浅析 Thread.join()

£可爱£侵袭症+ 提交于 2021-01-12 17:59:18
1. join() 的示例和作用 1.1 示例 1 // 父线程 2 public class Parent { 3 public static void main(String[] args) { 4 // 创建child对象,此时child表示的线程处于NEW状态 5 Child child = new Child(); 6 // child表示的线程转换为RUNNABLE状态 7 child.start(); 8 // 等待child线程运行完再继续运行 9 child.join(); 10 } 11 } 1 // 子线程 2 public class Child extends Thread { 3 public void run() { 4 // ... 5 } 6 } 上面代码展示了两个类:Parent(父线程类),Child(子线程类)。 Parent.main()方法是程序的入口,通过 Child child = new Child(); 新建child子线程(此时 child子线程处于NEW状态); 然后调用child.start()(child子线程状态转换为RUNNABLE); 再调用child.join(),此时,Parent父线程会等待child子线程运行完再继续运行。 下图是我总结的 Java 线程状态转换图: 1.2 join() 的作用

解决哈希冲突的三种方法

若如初见. 提交于 2021-01-12 09:10:08
一、拉链法 上篇博文我们举的例子,HashMap,HashSet其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,我们采用链表(jdk1.8之后采用链表+红黑树)的数据结构来去存取发生哈希冲突的输入域的关键字(也就是被哈希函数映射到同一个位桶上的关键字)。首先来看使用拉链法解决哈希冲突的几个操作: ①插入操作:在发生哈希冲突的时候,我们输入域的关键字去映射到位桶(实际上是实现位桶的这个数据结构,链表或者红黑树)中去的时候,我们先检查带插入元素x是否出现在表中,很明显,这个查找所用的次数不会超过装载因子(n/m:n为输入域的关键字个数,m为位桶的数目),它是个常数,所以插入操作的最坏时间复杂度为O(1)的。 ②查询操作:和①一样,在发生哈希冲突的时候,我们去检索的时间复杂度不会超过装载因子,也就是检索数据的时间复杂度也是O(1)的 ③删除操作:如果在拉链法中我们想要使用链表这种数据结构来实现位桶,那么这个链表一定是双向链表,因为在删除一个元素x的时候,需要更改x的前驱元素的next指针的属性,把x从链表中删除。这个操作的时间复杂度也是O(1)的。 与开放定址法相比,拉链法有如下几个优点: ①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短; ②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

ArrayList和LinkedList的区别

醉酒当歌 提交于 2021-01-12 07:02:59
ArrayList和LinkedList都实现了List接口,他们有以下的不同点: ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。 也可以参考ArrayList vs. LinkedList。 1) 因为 Array 是基于索引 (index) 的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array 获取数据的时间复杂度是 O(1), 但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。 2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况

【基础回溯2】Java 基础知识疑难点/易错点

﹥>﹥吖頭↗ 提交于 2021-01-12 06:31:38
本文已经收录自 https://github.com/Snailclimb/JavaGuide (59k+ Star):【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 阅读原文即可获取最新更新! ps: 之前发过这篇文章,不错后面又对内容重新完善和增加了部分内容,而且为了应读者要求做一个文章分类目录菜单,为了保证文章的质量和准确性重新发送了一遍。 1. 基础 1.1. 正确使用 equals 方法 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 举个例子: // 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 String str = null ; if (str.equals( "SnailClimb" )) { ... } else { .. } 运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。: "SnailClimb" .equals(str); // false 不过更推荐使用 java.util.Objects#equals (JDK7 引入的工具类)。 Objects.equals( null , "SnailClimb" ); // false 我们看一下 java.util

java基础知识疑难点

坚强是说给别人听的谎言 提交于 2021-01-12 05:17:44
1、“static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。 2、 是否可以在static环境中访问非static变量? static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。 3、Java支持的数据类型有哪些?什么是自动拆装箱? Java语言支持的8中基本数据类型是: byte short int long float double boolean char 自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。 4、 Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

面试真题-----hashMap原理

ぃ、小莉子 提交于 2021-01-12 04:37:24
HashMap详解 JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等 简介 Java为数据结构中的映射定义了一个接口java.util.Map HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null 。非线程安全。 如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是 它承自Dictionary类 。线程安全。并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。 LinkedHashMap:LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。 TreeMap:TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器

Flutter mac上打包安卓APK遇到的坑

这一生的挚爱 提交于 2021-01-12 02:59:56
1. 创建签名 keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 通常会遇到 No Java runtime present, requesting install. 用以下命令替换吧 /Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/bin/keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 成功会提示输入: 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么 ? ... 后面的请接着 这里 . 来源: oschina 链接: https://my.oschina.net/u/4395893/blog/3318284

阿里大牛再写传奇:并发原理JDK源码手册GitHub已破百万

て烟熏妆下的殇ゞ 提交于 2021-01-11 16:11:32
写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性; 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人,尤其是初学者。 由浅入深看源码,探究多线程原理由浅入深看源码,探究多线程原理 本手册的目的在于 基于JDK 7和JDK 8,对整个Concurrent包进行全面的源码剖析。JDK 8中大部分并发功能的实现和JDK 7一样,但新增了一些额外特性。例如CompletableFuture、ConcurrentHashMap的新实现、StampedLock、LongAdder等。对整个Concurrent包的源码进行分析, 看源码,并非学习和总结源码,先能够粗略 的 浏览大量的原码 并保证知晓有这么个东西,有个基本概念,再对其中的设计原理,优化方案进行学习 下面会给大家展示出这本书的部分内容截图和完整目录,需要获取的小伙伴可以直接转发+关注 即可免费获取到这份《Java并发实现原理JDK源码剖析》 我们的口号是:由浅入深看源码,探究多线程原理 目录展示 目录非的长,但是阅读起来需要看那段直接点击目录就可以跳转非常的方便! 部分内容展示: 多线程基础 Atomic类 Lock与ConditionLock与Condition 同步工具类 并发容器 线程池与Future线程池与Future ForkJoinPoolForkJoinPool

Java集合4-3

做~自己de王妃 提交于 2021-01-11 09:42:46
Java集合4-3 文章目录 Java集合4-3 类集结构图 一、链表和二叉树思路 二、Collection接口 三、List接口 1.ArrayList 2.Vector 3.LinkedList 四、Iterator和ListItertor 五、forEach 六、Set接口 七、HashSet 八、TreeSet类与Comparable接口 九、Map 接口 1.哈希表 2.HashMap/HashTable/ConcurrentHashMap/TreeMap/LinkedHashMap 3.Map集合各子类区别分析 4.存储自定义对象 十、JDK9集合新特性 类集结构图 集合是Java中一些成熟的数据结构的实现 一、链表和二叉树思路 (1)链表 class Node { Object data; Node next; } (2)二叉树 class Node { Object data; Node left; Node right; } 二、Collection接口 一般不会直接使用Collection接口,而是使用其子接口List和Set,都是存储单值的集合类,前者可以重复,后者不可以重复 三、List接口 List的实现类,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期实现

心之所向,身之所往

浪尽此生 提交于 2021-01-11 01:41:13
欢迎关注我的微信公众号【 Mflyyou 】获取持续更新。 github.com/zhangpanqin/MFlyYou 收集技术文章及我的系列文章,欢迎 Star。 对于一个多月都没有双休的奋斗狗来说,明天能睡个懒觉真是太幸福了。 最近在赶项目进度,没时间更新博客,计划更新的内容(Mysql 系列,有时间再加更 JUC 相关)等到放假回家慢慢补吧。 ### 2020,再见 2020 年技术上算是有个不小的突破吧,我很满意,哈哈~ 看完《深入理解计算机系统》、《Linux 内核设计与实现》、《TCP/IP 详解 卷一》、《图解 TCP》、《图解 HTTP》五本书,再加上之前的《HTTP 权威指南》、算是打牢了自己的基础,对突破架构师有不小的助力。 深入研究了 redis 。看了一套收费教程和《Redis 深度历险》 Mysql 方面看了《Mysql 技术内幕 InnoDB 存储引擎》《Mysql 8 Cookbook》《Mysql 性能调优和高可用架构实践》,加上以前看的 《DBA 修炼之道》和 《高性能 Mysql》,Mysql 这块等系列博客写完,Mysql 这块我也算是过关了。 我始终认为会玩和玩的出神入化有着天壤之别。就像打农药,你上个王者还是轻轻松松的,但是上个国服还是挺有难度的。 因此对某项技术我都会花费很多的精力去研究,避免闭门造车,坐井观天。 2020 年开始写博客