Java
文章平均质量分 62
Java基础复习笔记、Java虚拟机、Java并发编程等
lxxxxxt
这个作者很懒,什么都没留下…
展开
-
堆外内存之DirectByteBuffer
堆内内存堆内内存是JVM可以直接管控的,我们平时在Java中创建的对象都处于堆内内存中,遵循JVM的内存管理机制,JVM的垃圾回收机制统一管理。堆外内存把内存对象分配在JVM的堆以外的内存,不属于JVM管控范围,分配的是系统本地的内存,直接受操作系统管理,能够在一定程度上减少垃圾回收对应用程序造成的影响。在Java中经常使用java.nio.DirectByteBuffer管理堆外内存。DirectByteBuffer中的**unsafe.allocateMemory(size)**是个一个nati原创 2022-04-08 15:28:05 · 835 阅读 · 0 评论 -
tomcat中catalina命名的原因
apache美国一个大学的实验室编写了初版,基于HTTP通信协议的服务器端和客户端程序,后来被很多研究者不断地添加功能,不断的对出现的bug打补丁。后来8个开发者成立一个小组,重写整个程序,命名为Apache(和 A Patchy谐音)tomcat开发者希望用一种能自己照顾自己的动物代表。作为服务器的容器支持基于Java语言编写的程序在服务器上运行,这样的程序被称为Servlet,因为它是运行在“Server”上的“Applet”。通常开发者会让tomcat与其他对Web服务器一起协同工.原创 2022-03-31 20:52:33 · 1038 阅读 · 1 评论 -
java8 新特性
lambdaparameter -> expression body可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。...原创 2022-01-12 17:07:44 · 415 阅读 · 0 评论 -
Collector.toMap value不能null
Collector.toMap()底层用到了Map.merge方法Map.merge方法不允许value为null推断:Collectors.toMap可以使用ConcurrentHashMap为最终收集结构,而ConcurrentHashMap不允许Value为Null避免产生二义性和CAS的ABA问题,所以Map.merge为了兼容ConcurrentHashMap等多线程环境下使用的数据结构不允许value为null。ConcurrentHashMap key和value不能null.原创 2022-01-06 11:23:48 · 1835 阅读 · 0 评论 -
Random、ThreadLocalRandom、UUID
Random & ThreadLocalRandom生成随机数,ThreadLocalRandom相比Random减少了多线程的资源竞争。Random类使用CAS,在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试。Random在多线程下多个线程可能都拿同一个老的种子去计算新的种子,这会导致多个线程产生的新种子是一样的,由于随机数算法是固定的,所以会导致多个线程产生相同的随机值。ThreadLocal的出现就是为了解决多线程访问一个变量时候需要进行同步的问题,让转载 2021-07-12 17:40:33 · 184 阅读 · 0 评论 -
RSA加密算法及java使用
RSA算法原理RSA算法随机两个质数p,q。n = p * q,n的值就是模(modulu),n的二进制位数就是秘钥长度,一般是1024/2048。指数e(exponent)在(1,(p-1)(q-1))之间,随机一个整数,且与(p-1)(q-1)互质,一般是65537。计算e对于(p-1)(q-1)的模反元素d,即整数d使得(e * d) mod (p-1)(q-1) = 1公钥就是(n, e),私钥就是(n, d)。JAVA实现// 获得公私钥对,(modulus, exponent原创 2021-06-17 18:24:28 · 560 阅读 · 0 评论 -
String的trim()和substring()
trim() public String trim() { int len = value.length; int st = 0; char[] val = value; /* avoid getfield opcode */ while ((st < len) && (val[st] <= ' ')) { st++; } while ((st <转载 2020-09-07 20:18:52 · 802 阅读 · 0 评论 -
OOM内存溢出的原因和解决方法
一 堆溢出java.lang.OutOfMemoryError: ......java heap space.....原因:要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,自然不会去回收。在这个溢出之前,可能系统会提前先报错关键字为 java.lang.OutOfMemoryError:GC over head limit exceeded。这种情况是当系统处于高频的GC状态,而且回收的效果依然转载 2020-09-07 10:55:40 · 2080 阅读 · 1 评论 -
Java的自动拆箱和装箱
【转载】详解Java的自动装箱与拆箱(Autoboxing and unboxing)什么是拆箱装箱拆箱就是自动将包装器类型转换为基本数据类型。(Integer——> int)装箱就是自动将基本数据类型转换为包装器类型。(int ——> Integer)这个过程是自动执行的。public class Main { public static void main(String[] args) { //自动装箱,系统自动执行:Integer emp= Integer.v转载 2020-09-06 16:30:25 · 124 阅读 · 0 评论 -
Java网络编程
ServicerClient创建ServerSocket(…)对象,绑定某一端口号创建Socket("…",…)要指定服务器的IP地址+端口号通过accept()侦听方法,阻塞,等待对方连接发送请求并被accept()侦听到,并建立连接通过输入、输出流传递信息通过输出、输入流传递信息释放资源释放资源服务器端demopublic class LogicServicer { public static void main(String[] args) {...原创 2020-09-02 12:28:36 · 86 阅读 · 0 评论 -
Java(错题)
8.28哪个修饰符可以使在一个类中定义的成员变量只能被同一包中的类访问:无修饰符。下面程序的输出结果为:1201public class Demo { public static String sRet = ""; public static void func(int i) { try { if (i%2==0) { throw new Exception(); //抛出异常进入catch,不抛不进 } } cat原创 2020-08-30 11:07:47 · 226 阅读 · 0 评论 -
String类string.indexOf(int ch)
【转载】String.indexOf(int ch)中的int类型在JAVA中返回一个字符在字符串的位置首次出现的位置时候,String 给我们提供几个有效的API。 int indexOf(int ch) //返回指定字符在此字符串中第一次出现处的索引。 int indexOf(int ch, int fromIndex) //返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 int indexOf(String str)转载 2020-08-25 14:37:39 · 671 阅读 · 0 评论 -
《Java程序设计实用教程》复习笔记
一 绪论Java特性:①跨平台:一个应用程序能够运行于不同的操作系统平台。利用Java虚拟机实现,运行于操系统之上,解释Java编译后的.class字节码。②面向对象:利用类和对象的机制将数据和方法封装在一起,通过统一的接口与外界交互,通过类的继承机制实现代码重用。③可靠性:异常处理、垃圾回收机制。④安全性:域管理,本地代码和远程代码都可以通过配置策略设定可访问的资源域。⑤多线程⑥支持分布式网络应用对C/C++的改进:Java包:二 Java语言基础基础复习:简介,命原创 2020-08-23 17:15:49 · 1745 阅读 · 0 评论 -
Java比较器Comparable/Comparator
java.util.Comparator 接口声明了: int compare<T o1, T o2> 方法public interface Comparator<T>{ public int compare(T o1,T o2);}比较用来排序的两个参数:1)如果o1大于o2,则返回1;2)如果o1小于o2,则返回-13)如果o1等于o2,则返回0定义排序规则:参数中两个对象进行比较,如果比较结果为1进行交换,其他不进行交换。当后一个对象比当前对象大..原创 2020-08-20 17:29:34 · 560 阅读 · 0 评论 -
equals与==的区别
优美的讲解equals和的区别关于和equals的区别和联系在JVM中,内存分为堆内存跟栈内存。他们二者的区别是: 当创建一个对象(new Object)时,会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中,同时在栈内存中生成对应的引用,在后续代码中调用的都是栈内存中的引用。需要注意的是,基本数据类型是存储在栈内存中。==操作符既可以用于比较基本的数据类型,也可以用于比较对象,而equals只可以用于对象之间的比较,所有类从Object类中继承equals方法。==如果作用于基本数据类型的原创 2020-08-16 22:35:26 · 190 阅读 · 0 评论 -
《Java并发编程》---10 Executor框架
Executor框架10.1 简介两级调度模型原创 2020-04-11 15:35:13 · 143 阅读 · 0 评论 -
《Java并发编程》--- 8 并发工具类
7 Java中的13个原子操作类13个原子操作类属于4种类型原子更新基本类型类AtomicInteger、AtomicBoolean、AtomicLong原子更新数组类原子更新引用类型类原子更新字段类...原创 2020-04-04 22:06:57 · 162 阅读 · 0 评论 -
线程的阻塞和中断
1 线程的阻塞阻塞和非阻塞是形容多个线程之间的相互影响的,一个线程占用了临界区资源,那么其他线程必须在临界区外等待,阻塞是操作系统层面挂起,上下文切换了,所以性能不高。如果一个线程一直占用不释放资源,那么其他需要该临界区资源的线程都必须一直等待。非阻塞就是运行多个线程同时进入临界区,只要保证不把数据修改坏就行。阻塞情况分为三种:等待阻塞:运行的线程执行wait()方法,JVM会把该线...转载 2020-04-04 20:58:00 · 2565 阅读 · 0 评论 -
java后台开发知识体系
建立完整知识体系知识点反复巩固Java知识体系1 Java基础核心APIJava反射机制序列化和反序列化异常处理2 Java集合类基础集合框架HashMapTreeMap3 Java并发编程《Java并发编程的艺术》多线程基础JUC并发包组件(java.util.concurrent),concurrentHashMap并发工具类、阻塞队列、原子类等源...原创 2020-04-17 11:10:39 · 313 阅读 · 0 评论 -
Java字符数组转字符串
字符数组char[] ch= new char[] {'a','b','c'} 与字符串String的转换方法一String str = String.valueOf(ch);方法二String str = new String(ch);.toString()Object里有一个方法toString(),java里所有的类都是从这个类继承的,都有一个toString的方法。ja...原创 2020-04-01 18:43:57 · 1329 阅读 · 0 评论 -
Iterator和ListIterator
Iterator迭代器接口,提供遍历所有Collection的接口hasNext():如果迭代器中还有元素,则返回true。next():返回迭代器中的下一个元素remove():删除迭代器新返回的元素。每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。Iterator在遍历过程中使用了锁定,Iterator.remove...原创 2020-03-31 21:29:01 · 142 阅读 · 0 评论 -
HashMap为什么线程不安全
1 扩容时出现的问题多线程同时扩容时,出现环形链表(JDK1.7)。扩容原理见:HashMap底层实现–扩容原因如下:JDK1.7中,在HashMap扩容时,会改变链表中的元素的顺序,将元素从链表头部插入。说是为了避免尾部遍历。JDK1.7中扩容的transfer方法:JDK1.8 中扩容自己重写了扩容方法,resize()。1.7 是在 while 循环里面,单个计...转载 2020-03-29 17:02:38 · 301 阅读 · 0 评论 -
解决hash冲突的主要办法
1 开放定址法当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。探测技术分为线性探查法、线性补偿探测法、随机探测法(以后补充)2 拉链法每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来。h...原创 2020-03-29 16:04:57 · 156 阅读 · 0 评论 -
HashMap底层实现--扩容
在 HashMap 中,桶数组的长度均是2的幂,阈值大小为桶数组长度与负载因子的乘积。当 HashMap 中的键值对数量超过阈值时,进行扩容。HashMap 的扩容机制与其他变长集合的套路不太一样,HashMap 按当前桶数组长度的2倍进行扩容,阈值也变为原来的2倍(如果计算过程中,阈值溢出归零,则按阈值公式重新计算)。扩容之后,要重新计算键值对的位置,并把它们移动到合适的位置上去。1 源...原创 2020-03-29 15:42:36 · 357 阅读 · 0 评论 -
Java多线程线程安全面试题
如何在Java中实现线程?可以继承 java.lang.Thread 类,该类的实例就是一个线程(本身就是调用的Runnable接口),重写run()方法。直接调用Runnable接口来重写run()方法实现线程。创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。创建 Callable 实现类的实例,使用 Futu...原创 2020-03-28 20:28:46 · 140 阅读 · 0 评论 -
Java线程池
1 线程池出现背景:对于服务器端的程序,经常面对的是客户端传入的短小的任务(执行时间多,工作内容较单一),需要服务器快速处理并返回结果。如果服务器每次接受到一个任务,创建一个线程然后执行,当面对成千上万个任务递交给服务器时,将会创建数以万计的线程。会使操作系统频繁的进行线程上下文切换,线程的创建和销毁也需要耗费系统资源。线程池能够很好的解决这个问题,它预先创建若干数量的线程,并且不能由...原创 2020-03-25 23:18:37 · 144 阅读 · 0 评论 -
Java反射机制
1 概述反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。程序中对象的类型一般都是在编译...转载 2020-03-25 18:31:58 · 110 阅读 · 0 评论 -
《Java并发编程》---6 并发容器和框架
6 Java并发容器和框架6.1 ConcurrentHashMapHashMap不安全,HashTable效率低(采用synchronized,)锁分段技术结构:Segment数组结构+HashEntry数组结构,每个segment守护HashEntry中的一个元素。初始化segment数组,segmentShift和segmentMask;初始化每个segment元素;定位segm...原创 2020-03-24 15:47:23 · 115 阅读 · 0 评论 -
HashMap底层实现分析
扩容时出现环形数据结构https://blog.csdn.net/qq_21993785/article/details/80384250值覆盖https://www.cnblogs.com/lchzls/p/6714689.html https://www.cnblogs.com/lchzls/p/6714689.htmlhttps://www.cnblogs.com/lonel...原创 2020-03-24 10:37:09 · 108 阅读 · 0 评论 -
Java位运算
1 位运算符1.1 位运算符&:按位与。|:按位或。~:按位非。^:按位异或。<<:左位移运算符。>>:右位移运算符。<<<:无符号右移运算符。位运 算 符 中 ,除 ~ 以 外 ,其余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和字 符 型 数 据 。Java使用补码表示二进制数,在补码表示中,最高位为...转载 2020-03-23 11:54:19 · 889 阅读 · 0 评论 -
《Java并发编程》--- 4-5 线程和锁
线程简介Java程序天生就是多线程程序,main()方法就是一个名为main的线程处理器上核心数量越来越多,一个线程在一个时刻只能运行在一个处理器核心上。。线程优先级:.setPriority(int priority)设置优先级操作系统可能会忽略对优先级的设置Thread.yield():让步,根据语义理解就是线程让出当前时间片给其他线程执行。这个函数取决于各个不同...原创 2020-03-22 12:52:13 · 97 阅读 · 0 评论 -
Java序列化
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可...原创 2020-03-19 15:25:49 · 86 阅读 · 0 评论 -
Java刷题常用API
https://blog.nowcoder.net/n/aeda6921b3a644509011213c8c311920原创 2020-08-16 21:53:01 · 303 阅读 · 0 评论 -
Java大文件复制
利用通道public void transfer(File source, File target){ FileInputStream in = null; FileOutputStream out = null; if(!source.exists()||!source.isFile()){ throw new IllegalArgumentException("file no...原创 2020-03-19 15:09:38 · 94 阅读 · 0 评论 -
Java中的各种锁
【参考】https://www.cnblogs.com/jyroy/p/11365935.html乐观锁 vs 悲观锁无锁 vs 偏向锁 vs 轻量级锁 vs 重量级锁公平锁 vs 非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。优点:等待锁的线程不会饿死。缺点:整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的...原创 2020-04-08 12:24:44 · 105 阅读 · 0 评论 -
Java垃圾回收机制
在java运行时内存区域的各个部分中,程序计数器(存放下一条执行的指令)、虚拟机栈、本地方法栈(用于支持native方法的执行,存储了每个native方法调用的状态)随着线程存在和消亡,每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性。不需要过多的考虑回收问题。栈:每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区...原创 2020-03-16 15:23:00 · 93 阅读 · 0 评论 -
Java集合框架
【参考文档】冰湖一角 https://www.cnblogs.com/bingyimeiling/p/10255037.htmlhttps://www.cnblogs.com/TestMa/p/10641367.html源码https://www.baidu.com/link?url=Dl-bDcNxelFW3ZOD93gRJYdtcY3rEebyCcBvFxMV1ptlZRJgaitx7...原创 2020-03-13 22:49:15 · 162 阅读 · 0 评论 -
static/final/abstract/interface
staticstatic关键字可以修饰属性(成员变量,不能修饰局部变量)、方法、内部类、代码块。static修饰的资源属于类级别,是全体对象实例共享的资源静态属性:是全体类的实例共享的变量。在类加载期间初始化的。类变量只会被创建一次。使用类名.属性:Math.PI;第一步加载类,static在类加载期间初始化第二步在内存中分配对象空间。属性自动初始化,为“0”值第三步进行...原创 2020-03-11 22:18:57 · 183 阅读 · 0 评论 -
《Java并发编程的艺术》3 java内存模型
3 Java内存模型3.1 Java内存模型基础线程之间的通信:共享内存、消息传递共享内存:通过读写内存中的公共状态进行隐式通信消息传递:线程之间没有公共状态,通过发送消息来显式通信线程之间的同步:程序中用于控制不同线程间操作发生的相对顺序的机制。共享内存并发模型中,显式同步,程序员必须指定某个方法或某段代码需要在线程之间互斥进行。消息传递并发模型中,隐式同步,因为消息...原创 2020-03-08 17:54:06 · 115 阅读 · 0 评论 -
《Java并发编程的艺术》1-2并发机制底层实现
1 并发编程的挑战并发编程是为了提高程序运行速度,但不是启动更多线程就能让程序最大限度运行,并发编程时面临很多挑战,比如上下文的切换、死锁、硬件软件资源的限制等。上下文切换CPU通过给每个线程分配CPU时间片来实现多线程,时间片一般几十毫秒,CPU不停的切换线程执行,让我们感觉多个线程在同时执行。上下文切换:任务切换时,会保存切换前的任务状态以便下次加载,然后加载将要执行的任...原创 2020-03-05 20:36:27 · 161 阅读 · 0 评论