直面Java
文章平均质量分 64
大唐雨夜
这个作者很懒,什么都没留下…
展开
-
BigDecimal在生产上怎么用?
使用BigDecimal#valueof方法与直接使用字符串构造相同。原创 2022-09-17 21:00:57 · 153 阅读 · 0 评论 -
Java数组foreach赋值不生效的问题
问题是我在完成LeetCode第23题时遇到的,我采用的是最小堆加上递归的解决方式。递归中,我对参数数组lists做了foreach,并且赋值,发现lists的值不会改变,结果是栈溢出。当改成直接修改数组元素时AC。for (int i = 0; i < lists.length; i++) { if (lists[i] != null && minVal == lists[i].val) { pre.next = lists[i]; li原创 2022-04-04 23:18:42 · 2961 阅读 · 0 评论 -
HashMap底层原理与面试题
文章目录1 类图2 属性2.1 常见属性介绍2.2 底层数据结构2.3 重要常量2.4 链表和树的问题1 为什么不直接采用红黑树?2 为什么采用红黑树,而不是AVL平衡树?3 构造器3.1 常用构造器4 put方法4.1 put操作的整体思路4.2 树操作(略)5 get方法6 哈希处理6.1 如何有效较少碰撞6.2 hash的实现6.2 HashMap底层数组为什么总是2的n次方?7 扩容resize7.1 代码分析7.2 扩容的问题源码分析地址参考资料1 类图HashMap是非常常用的工具类,实现M原创 2020-09-09 23:52:33 · 2678 阅读 · 0 评论 -
ArrayList底层实现原理
ArrayList是List接口的动态数组实现,允许存放所有元素,包括null。除了实现List接口外,ArrayList类还提供了操作数组大小的方法。功能与Vector类似,但是不同步。原创 2020-01-01 07:14:15 · 2090 阅读 · 0 评论 -
ThreadLocal#ThreadLocalMap内部类实现细节
ThreadLocalMap实现思想二、属性与构造方法三、核心方法3.1 hashcode的计算3.2 set()方法3.3 getEntry()方法3.4 remove()方法3.5 rehash()方法3.6 对于清理过期数据的关键实现方法1. replaceStaleEntry()方法2. cleanSomeSlots方法3. expungeStaleEntry(int stal...原创 2019-11-26 21:49:44 · 868 阅读 · 0 评论 -
彻底搞懂ThreadLocal底层实现原理
当访问共享的可变数据时,通常需要使用同步。一种避免同步的方式就是不共享数据,仅在单线程内部访问数据,就不需要同步。该技术称之为线程封闭。当数据封装到线程内部,即使该数据不是线程安全的,也会实现自动线程安全性。原创 2019-11-26 21:47:18 · 958 阅读 · 0 评论 -
String源码分析:底层实现原理
`String`的不变性指的是类值一旦被初始化,就不能被改变。我们从源码出发,可以看到`String`类由`final`修饰,即类不能被继承,`String`中的方法不能被继承重写。String通过一个`char`数组`value`来保存数据,同样是`final`修饰的,即`value`数组一旦被赋值,内存地址无法修改。`String`的不变性,充分利用了`final`关键字的性质。原创 2019-11-25 00:00:58 · 862 阅读 · 0 评论 -
Java8特性详解(二):lambda表达式与方法引用
通过行为参数化传递代码有助于应对不断变化的需求,而lambda表达式和方法引用便是Java8对行为参数化的新实践。Lambda表达式和方法引用不仅实践了行为参数化,也极大地简化了代码。原创 2019-12-24 23:02:25 · 841 阅读 · 0 评论 -
Java8特性详解(一):行为参数化--将代码传递给方法
行为参数化是使方法接受多种行为作为参数,并在内部使用,完成不同的行为。行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量,是可以帮助你处理频繁变更的需求的一种软件开发模式。原创 2019-12-15 23:53:18 · 4566 阅读 · 11 评论 -
Integer源码分析与高速区间数据缓存
包装类存在的意义1基本类型与包装类(1)一切皆对象,但是基本类型却不是对象。(2)声明方式不同,引用数据类型需要用new关键字来创建,基本数据类型不需要。(3)存储位置不同,基本数据类型直接存储保存在堆栈中,能高效存取,引用数据类型需要引用指向实例,具体的实列保存在堆中。(4)引用数据类型的初始值为null,基本数据类型的初始值依其数据类型而定。2 包装类存在的意义基本数据类型不是对...原创 2019-12-19 22:30:51 · 438 阅读 · 0 评论 -
transient关键字与ArrayList序列化的实现
transient关键字用于类成员变量,标记该变量不是对象的持久状态的一部分。JVM默认序列化和反序列化创建字节流过程中,自动忽略transient修饰的变量。ArrayList虽然不能对数组做默认JVM序列化,但是通过定义writeObject和readObject方法,自定义实现了列表元素的序列化与反序列化。原创 2019-11-28 07:34:59 · 1032 阅读 · 1 评论 -
Java反编译工具
本文主要介绍三款Java反编译工具,分别为javap、jad、CFR,三款工具各有优缺点,可以根据需求合理选择。文章目录一、理解Java编译与反编译1.1 宏观上的概念1.2 Java编译与反编译二、灵活选取Java反编译工具2.1 JDK自带的工具--javap2.2 好用的工具--jad2.3 功能强大的工具--CFR一、理解Java编译与反编译1.1 宏观上的概念编程语言分为低级...原创 2019-12-12 00:13:10 · 5131 阅读 · 1 评论 -
深入理解Java常用语法糖
语法糖的存在主要是方便开发人员使用,使程序更加简洁,提高程序可读性。Java虚拟机并不支持这些语法糖,这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。原创 2019-12-08 21:40:00 · 3718 阅读 · 2 评论 -
通过字节码分析Java值传递
在C++中存在值传递、引用传递、指针传递,而在Java中的参数传递也经常令人疑惑,是值传递,还是引用传递?文章目录1 形参和实参2 值传递和引用传递3 通过一个经典案例理解Java值传递1 形参和实参形式参数,是在方法定义阶段,是定义某个函数时使用的参数,用于接收实参传入。例f(x,y)中x和y是形参。实际参数,是在方法调用阶段,是主调函数调用有参函数时,实际传递的内容。例f(3,7...原创 2019-12-05 23:14:44 · 1193 阅读 · 0 评论 -
Java I/O:文件处理与过滤器
1 绝对路径与相对路径1.1 了解路径绝对路径:完整路径,如果是Windows,则以盘符开始。相对路径:指的是相对于当前项目根目录的路径。路径使用时,不区分大小写。由于路径是字符串,对于反斜杠需要进行转义,因此表示反斜杠通过“\‘表示。1.2 路径分割符在不同操作系统中,路径分隔符以及目录分割符是不一样的。// 路径分隔符 windows:; linux::System.out...原创 2019-12-01 18:34:51 · 363 阅读 · 0 评论 -
常用数据库连接池的区别与配置
数据库连接是稀缺的、昂贵的资源,一个数据库连接对象对应一个物理数据库的连接,如果每次数据库操作都创建新的连接,使用完后释放,会导致系统性能低下,这就引出了连接池的概念。原创 2019-11-17 17:25:42 · 591 阅读 · 1 评论 -
class.getResourceAsStream()和class.getClassLoader().getResourceAsStream()的区别
对于Java web项目,XX.class.getResourceAsStream(filepath)和XX.class.getClassLoader().getResourceAsStream(filepath)两种方式都是用来获取classpath路径下配置文件的输入流。原创 2019-11-17 10:55:12 · 1347 阅读 · 2 评论 -
Java反射初探
类对象类对象对象之间的区别区别在于,各对象有不同的属性值(名称、血条、移动速度) 类之间的区别他们的区别在于有不同的方法,不同的属性。类对象,就是用于描述这种类,都有什么属性,什么方法的获取类对象获取类对象有3种方式 .class 1 Class.forNameString className = "java.util.Date";Class cl = Class.forName(classN原创 2017-04-04 08:15:56 · 566 阅读 · 0 评论 -
synchronizied 静态方法和非静态方法
1.Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。 Java中每个对象都有一个锁,并且是唯一的。假设分配的一个对象空间,里面有多个方法,相当于空间里面有多个小房间,如果我们把所有的小房间都加锁,因为这个对象只有一把钥匙,因此同一时间只能有一个人打开一个小房间,然后用完了还回去,再由JVM 去分配下一个获得钥匙的人。情况1:同转载 2017-04-03 22:55:22 · 627 阅读 · 0 评论 -
下压栈:链表实现
下压栈链表实现,主要用到了单链表头部添加和头部删除两个内容。 根据栈的特性:后进先出。打印必须逆序打印JAVA实现import java.util.Iterator;/** * 下压堆栈 * * @author Administrator * * @param <Item> */public class Stack<Item> implements Iterable<Item> {原创 2017-03-16 09:27:53 · 509 阅读 · 0 评论 -
Error:No JVM could be found on your system. Please define EXE4J_JAVA_HOME to
Error:No JVM could be found on your system. Please define EXE4J_JAVA_HOME to point to an installed 32-bit JDK or JRE or download a JRE from www.java.com解决方法: 这是Java版本问题,需要升级Java,或者重新下载高版本的Java。原创 2017-03-25 15:19:01 · 3925 阅读 · 2 评论 -
Java网络编程:多线程聊天
聊天程序如果是单线程,会导致没人只能说一句,并且说了以后,必须等到另一个人的回复,才能说第二句。收发都在主线程中,不能同时进行。 解决方法: 将收发放到两个不同的线程 1. SendThread 发送消息线程 2. RecieveThread 接受消息线程 3. Server一旦接受到连接,就启动收发两个线程 4. Client 一旦建立了连接,就启动收发两个线程转载 2017-03-23 15:31:45 · 982 阅读 · 0 评论 -
Java网络编程:ip地址和端口
1原创 2017-03-21 16:01:34 · 1625 阅读 · 0 评论 -
Java网络编程:URL
URLURL表示网络上某一资源的地址,由协议名称和资源名称组成,以冒号隔开。import java.io.IOException;import java.net.URL;public class TestSocket { public static void main(String[] args) throws IOException { // 创建实例 U原创 2017-03-21 21:38:20 · 552 阅读 · 0 评论 -
Java网络编程:简单聊天机器人实现案例
创建数据库和表,准备表数据首先创建一个数据库android 然后创建一个表dictionary,字段: id int receive varchar(100) response varchar(100)receive 表示受到的信息 response 表示回应的信息create database android;use android;create table dictionary(原创 2017-03-22 22:27:30 · 6588 阅读 · 0 评论 -
Java网络编程:socket tcp编程
Socket传输协议UDP协议:用户数据报协议面向无连接、不可靠、无序的数据以数据报作为数据传输的载体传输数据时,首先将要传输的数据定义成数据报(Datagram),在数据报中指明要达到的socket(主机地址和端口号),然后再将数据发出。 类: DatagramPacket——表示数据报包 DatagramSocket——进行端到端通信TCP协议:传输控制协议面向连接、可靠、有序的数原创 2017-03-22 21:16:20 · 710 阅读 · 0 评论 -
Java 容器ArrayList.toArray() 问题
ArrayList.toArray() API介绍 Object[] toArray() 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。 T[] toArray(T[] a) 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 【注】直接构造进行数原创 2017-03-15 09:36:35 · 713 阅读 · 0 评论 -
JDBC连接MySQL数据库
为项目导入mysql-jdbc的jar包访问MySQL数据库需要用到第三方的类,需要为项目导入mysql的专用Jar包。mysql-connector-java-5.0.8-bin.jar。通常都会把项目用到的jar包统一放在项目的lib目录下。E:\project\j2se\lib 然后在eclipse中导入这个jar包 导包步骤: 右键project->property->java build原创 2017-03-19 09:21:20 · 1180 阅读 · 0 评论