在JDK8及以后,可以通过如下指令来获取到所有的hash算法, java -XX:+PrintFlagsFinal | grep hashCode 具体大概有如下几种,第5个算法是默认使用的,用到了异或操作和一些偏移算法来生成 通过下面的例子,可以清楚的看到,21和5在原来的数组中都处于相同的位置,但是在新的数组中,21到了新的位置,位置为原来的位置加上16,也就是旧的Capacity;但是5还在原来的位置。 ---- 参考: https://tech.meituan.com/2016/06/24/java-hashmap.html https://juejin.im/post/5aa5d8d26fb9a028d2079264 中继承过来的;5-6是LinkedHashMap独有的。 ---- 参考: https://www.infoq.cn/article/java-blocking-queue
【强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。
TileMap类 package com.funfree.arklis.engine.tilegame; import java.awt.Image; import java.util.LinkedList [2]); flyAnim[i] = createFlyAnim( images[i][3], images[i][4], images[i][5] TileMapRenderer类 package com.funfree.arklis.engine.tilegame; import java.awt.*; import java.util.Iterator .*; import java.awt.event.*; import java.util.Iterator; import static java.lang.System.*; import javax.sound.midi.Sequence Graphics2D)image.getGraphics(); Composite alpha = AlphaComposite.getInstance(AlphaComposite.DST_OVER, .5f
很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。 面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》, 这个类在JUC包java.util.concurrent.locks下面。 一句话总结:AQS是FIFO先进先出双向队列,队列里存的是线程Thread。 说到双向链表,这回大家就不陌生了。
4.编程计算一个点 ( Point 对象) 是否在圆 ( Cricle 对象)内。 5.定义一个表示学生的类Student。 (5)编写main函数对类进行测试。 5)编写main函数对类进行测试。 编程计算一个点 ( Point 对象) 是否在圆 ( Cricle 对象)内。 1)设计一个类代表二维空间的一个点。 5)编写一个Java Application程序,创建Student类的对象,并验证新增加的功能。
上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文章来了解剩下的四种阻塞队列 public class LinkedTransferQueue<E> extends AbstractQueue<E> implements TransferQueue<E>, java.io.Serializable 7 种阻塞队列的特点 这篇文章介绍的 4 种加上上一篇 细说并发4:Java 阻塞队列源码分析(上) 中 3 种,总共 7 种阻塞队列,这么多队列看的眼都花了。 我们结合源码和《Java 并发编程的艺术》相关章节分两篇文章介绍了 Java 中的阻塞队列,了解了 7 种阻塞队列的大致源码实现,后面遇到需要使用阻塞队列时心里应该有些底了。 Thanks 《Java 并发编程的艺术》 http://blog.csdn.net/goldlevi/article/details/7705180 http://stevex.blog.51cto.com
在java线程中,可以通过priority来控制线程优先级,线程优先级的范围从1~10。 默认值是5,优先级大的分配的时间片会大于优先级低,所以频繁阻塞线程可以设置高优先级,而占用cpu比较长的线程(计算线程)可以设置较低的优先级。但是在有的操作系统会无视对线程有限制。 线程的状态 状态名称 解释 NEW 初始状态,线程被构建,但是还没执行start()方法 RUNNABLE 运行状态,Java中将就绪与运行统称为 ”运行中“ BLOCKED 阻塞状态,表示线程阻塞与获取锁的过程 e.printStackTrace(); } } } } } } java /** * @author yukong * @date 2018/9/5 * @description 线程池接口,抽象出来,定义规范 */ public interface ThreadPool
1.3 状态的所有权所有权在 Java 中是属于类设计中的一个要素,不像 C或C++,需要认真考虑所有权的处理,Java 通过垃圾回收机制,减少了许多在引用共享方面常见的错误,降低了在所有权处理上的开销 2.1 Java监视器模式Java 监视器模式来自于 Hoare 对监视器机制的研究工作。 遵循 Java 监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。Java 监视器模式的简单使用示例可以参考上面的 Counter 类。 Java 监视器模式模式仅仅是一种编写代码的约定,对于任何一种锁对象,只要自始至终都使用该锁对象,都可以用来保护对象的状态。 下一篇我们将要学习Java类库中的并发基础构建模块,敬请期待!
在找工作的时候,我的简历上写了 Java 和 Go 两种,都还算是比较熟悉了,所以 Java 和 Go 相关的工作岗位都在看。 如果不是这样的话,假如我继续从事 Java 相关的工作,rosedb 可能并不会发展成现在的样子,因为我的工作并不是 Go 相关的,这个项目可能没多长时间就慢慢的置之不理了。 总之,我找到了一份互联网中厂的 Go 开发岗位,从 Java 转到了 Go 语言,并且 rosedb 项目也刚开始开源出去,虽然并没有获得什么关注。 推荐阅读 我的编程故事—4 第一份工作 我的编程故事—3 秋招之旅 我的编程故事—2 决定自学 我的编程故事—1 上大学了
本文是微信公众号【Java技术江湖】的《不可轻视的Java网络编程》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章, 该系列博文会告诉你如何从计算机网络的基础知识入手,一步步地学习Java网络基础,从socket到nio、bio、aio和netty等网络编程知识,并且进行实战,网络编程是每一个Java后端工程师必须要学习和理解的知识点 ,进一步来说,你还需要掌握Linux中的网络编程原理,包括IO模型、网络编程框架netty的进阶原理,才能更完整地了解整个Java网络编程的知识体系,形成自己的知识框架。 我们回到 Selector,毕竟 JVM 就是这么一个屏蔽底层实现的平台,我们面向 Selector 编程就可以了。 ;import java.nio.ByteBuffer;import java.nio.channels.CompletionHandler;import java.nio.charset.Charset
2 并发容器 Java5提供了多种并发容器来改进同步容器的性能。 同步容器将所有对容器状态的访问都串行化,以实现他们的线程安全性。 在Java 5中增加了 ConcurrentHashMap,用来替代同步且基于散列的Map,增加了对一些常见符合操作的支持,例如“若没有则添加”、替换以及有条件删除等。
#1.程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x>y 则将 x 与 y
:5) at InterruptExample$$Lambda$1/713338599.run(Unknown Source) at java.lang.Thread.run(Thread.java:745 5 6 6 7 7 8 8 9 9 2. 6 7 8 9 0 1 2 3 4 5 6 7 8 9 4. var1+var2 的变量为 var5+var4。 this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; } 3.
编程只是执行命令而已,不要想的过于复杂 编程注重思想,理解作者的思想 不求甚解 不要刻意理解面"向对象思想",只是个定义,就像现在你用的电脑只是把他称之为电脑,java封装的类只是作者整理的共用的方法, 归结到一个文件里面,当方法越来越多,整理的文件就越来越多,然后作者把他整理成文件夹,只是合理的分类而已 不要刻意去学习框架,即学即用 对于java可以重点关注jdk api,看下作者怎么分包,包下有哪些类 要做到编程的时候实现某个功能知道去哪个包下面找对应的类,然后找对应的方法 最后做到预知哪个包下面有哪些类,哪个类里面有哪个方法 因为你也有可能成为一个语言的创造者 对于java其实抽象越深越复杂,学习起来越难以理解
本文为《Java Coding Problems》读书笔记。学习语言从解决问题开始,《Java Coding Problems》一书中包含了Java编程中常遇到的一些问题。 57Working With Date And Time 58-77Type Inference 78-98Arrays, Collections, And Data Structures 99-128Java I/O Paths, Files, Buffers, Scanning, And Formatting 129-148Java Reflection Classes, Interfaces, Constructors 书中以Java的方式解决诸多常见问题。后续文章中记录这些问题的解法,以此学习Java语言的常规技巧。 参考资料:https://learning.oreilly.com/library/view/java-coding-problems/9781789801415/。
本书从基本的编程术语入手,用代码示例诠释计算机科学概念,旨在教会读者像计算机科学家那样思考,并掌握解决问题这一重要技能。书中内容共分为14章、3个附录,每章末都附有术语表和练习。 本书适合想学习计算机科学和编程相关内容的初学者。
1.什么是编程? 就是通过一些人为的编写一串指令(代码)让计算机去解决每一个问题。实现我们想要的结果,达到最终的目的。 2.数据类型和变量 2.1.什么是数据类型? 也就是对数据的分类。 而Java的数据类型有: 整数类型 byte/short/int/long 小数类型 float/double 字符类型 char 真假类型 boolean 这些也都是Java的基本数据类型(八种基本的数据类型 ),Java也存在引用数据类型。 这样也包含了整个开发过程种所需要的各种数据类型,可以是Java本身的数据类型买,也可以是我们自己所编写的数据类型。 double num1 = 5.5; int num2 = (int) num1; // 将double类型的num1强制转换为int类型 System.out.println(num2); // 输出5(
使用UDP协议实现的网络聊天室 package com.jmy.tcpip; import java.io.IOException; import java.net.*; import java.util.Scanner * @see java.net.InetAddress */ dp = new DatagramPacket ; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress ; import java.net.Socket; public class Client { public static void main(String[] args) throws IOException ; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket
Java网络编程 Socket技术 通过Socket技术(它是计算机之间进行通信的一种约定或一种方式),我们就可以实现两台计算机之间的通信 Socket也被翻译为套接字,是操作系统底层提供的一项通信技术 ,它支持TCP和UDP 而Java就对socket底层支持进行了一套完整的封装,我们可以通过Java来实现Socket通信 //服务端 public static void main(String[]
比如说读取磁盘文件时,假设读取操作花费了5秒钟,如果没有线程调度机制,这5秒钟CPU什么都做不了,其他代码只能等待。 所以才有了后面的【非阻塞IO】和【异步IO】优化 Java 线程 创建和运行线程 每个Java程序启动的时候,默认都创建了一个主线程(main方法),如果想在主线程外创建线程,可以使用如下方法。 task1, "t1"); Thread t2 = new Thread(task2, "t2"); // 在启动前设置优先级(可选,默认 NORM_PRIORITY = 5) $main$0(Test10.java:19) at java.lang.Thread.run(Thread.java:748) 08:32:04.201 [main] DEBUG io.ray - 因为 Java 中对静态变量的自增、自减并不是原子操作,要彻底理解,必须从字节码来进行分析。