java
文章平均质量分 67
xiaopangcame
这个作者很懒,什么都没留下…
展开
-
一看就懂的java对象内存布局
Java 中一切皆对象,同时对象也是 Java 编程中接触最多的概念,深入理解 Java 对象能够更帮助我们深入地掌握 Java 技术栈。在这篇文章里,我们将从内存的视角,带你深入理解 Java 对象在虚拟机中的表现形式。我们都知道 CPU 有 32 位和 64 位的区别,这里的位数决定了 CPU 在内存中的寻址能力,32 位的指针可以表示 4G 的内存空间,而 64 位的指针可以表示一个非常大的天文数字。但是,目前市场上计算机的内存中不可能有这么大的空间,因此 64 位指针中很多高位比特其实是被浪费掉的。原创 2023-11-05 11:09:42 · 339 阅读 · 0 评论 -
一文讲透java弱引用以及使用场景
这是一个受会受到GC的特别关注的状态,当GC察觉到引用的可达性变化为“合适”的状态之后,reference实例的状态将变化为Pending或Inactive,到底转化为Pending状态还是Inactive状态取决于此Reference对象创建时是否注册了queue.如果注册了queue,则将添加此实例到pending-Reference list中。在垃圾回收器线程扫描它所管辖的内存区域的时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。当实例创建的时候加入了队列后的状态。原创 2023-09-12 23:21:21 · 626 阅读 · 1 评论 -
弱引用回调引发的坑
在开发中,常常会用到回调模型,为了避免回调监听未被主动释放,导致内存泄露,我们会用到 WeakReference 来存放回调引用,然而要注意的是回调类被回收的坑。本文记录笔者开发中遇到弱引用回调被回收的坑及思考。原创 2023-09-12 23:17:58 · 183 阅读 · 0 评论 -
Java 泛型深入解析:理解泛型原理与实际应用方法
Java 在 1.5 时增加了泛型机制,据说专家们为此花费了 5 年左右的时间(听起来是相当不容易)。有了泛型之后,尤其是对集合类的使用,就变得更规范了。看下面这段简单的代码。我们可以使用 Object 数组来设计Arraylist类。然后,我们向Arraylist中存取数据。对比一下,你就能明显地感受到泛型的优秀之处:使用解决了元素的不确定性——参数类型为 String 的集合中是不允许存放其他类型元素的,取出数据的时候也不需要强制类型转换了。原创 2023-07-22 18:17:21 · 120 阅读 · 0 评论 -
Java的Comparator升序降序的记法
在使用Java自带的排序函数时,往往需要根据自己的需求自定义比较器。以前一直对Comparator的升序降序疑惑。现在记录一下,加深下印象。: 那么此时返回正数,表示需要调整o1,o2的顺序,也就是需要把o2放到o1前面,这不就是降序了么。: 那么此时返回负数,表示不需要调整,也就是此时o1 比 o2大, 不还是降序么。首先o2是第二个元素,o1是第一个元素。这里o1表示位于前面的对象,o2表示后面的对象。举例说明:(分析说明在运行结果之后)下面来用我们之前的结论解释为什么。原创 2023-06-05 19:11:22 · 800 阅读 · 0 评论 -
JAVA中枚举如何保证线程安全
都是static类型的,因为static类型的属性会在类被加载之后被初始化,当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。所以,创建一个enum类型是线程安全的。原创 2023-02-17 00:23:47 · 137 阅读 · 0 评论 -
volatile与Java内存模型
内存屏障:是一种 屏障指令,它使得 CPU或编译器 对屏障指令的前和后所发出的内存操作 执行一个排序的约束。也叫内存栅栏 或栅栏指令。volatile写之前的操作,都禁止重排序到volatile之后volatile读之后的操作,都禁止重排序到volatile之前volatile写之后volatile读,禁止重排序的。原创 2023-02-12 23:13:30 · 195 阅读 · 0 评论 -
浅析Java中的final关键字
这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的 值。当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。原创 2023-01-25 12:31:30 · 2283 阅读 · 0 评论 -
Java基础-方法区以及static的内存分配图
简单口述下:p1.show() show方法入栈,在方法的内部有个指向堆内存的this引用,通过该引用可找到堆内存实体,打印country时,可通过该堆内存对象找到对应的类,读取对应静态区中的字段值。4. 静态变量:类变量,类的所有实例都共享,我们只需知道,在方法区有个静态区,静态区专门存放静态变量和静态块。(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。5. 到类classloader的引用:到该类的类装载器的引用。原创 2022-11-23 23:46:12 · 394 阅读 · 0 评论 -
jdk 8 、9 10 11 12 13 14和 jdk 1.8 什么关系?
jdk 8 就是 jdk 1.8。jdk9 就是 jdk 1.9。原创 2022-11-23 13:54:13 · 1439 阅读 · 0 评论 -
Java多线程系列--join()
join() 定义在Thread.java中。join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解:说明:上面的有两个类Father(主线程类)和Son(子线程类)。因为Son是在Father中创建并启动的,所以,Father是主线程类,Son是子线程类。在Father主线程中,通过new Son()新建“子线程s”。接着通过s.start()启动“子线程s”,并且调用s.join()。在调用s.join()之后,Father主线程会一原创 2022-06-28 09:14:06 · 216 阅读 · 0 评论 -
JAVA包装类
虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。这种借助于非面向对象技术的做法有时也会带来不便。比如:Java中对每种基本类型都有一个对应的包装类:每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变(类似于String类,可看源码)。原创 2022-06-07 23:12:50 · 194 阅读 · 1 评论 -
Java内部类详解
一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式: 1 2 3 4 5 6 7 8 9 10 11 12 13原创 2022-05-07 13:37:21 · 71 阅读 · 0 评论 -
JAVA中枚举如何保证线程安全
枚举类型到底是什么类呢?是enum吗?明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,首先写一个简单的枚举public enum T { APPLE,BANANA,ORANGE;}使用反编译查看源码:public final class T extends Enum{ private T(String s, int i) { super(s, i); } public stati.原创 2022-01-11 22:11:43 · 406 阅读 · 0 评论 -
socket的shutdownInput和shutdownOutput
虽然在大多数的时候可以直接使用Socket类或输入输出流的close方法关闭网络连接,但有时我们只希望关闭OutputStream或InputStream,而在关闭输入输出流的同时,并不关闭网络连接。这就需要用到Socket类的另外两个方法:shutdownInput和shutdownOutput,这两个方法只关闭相应的输入、输出流,而它们并没有同时关闭网络连接的功能。和isClosed、isConnected方法一样,Socket类也提供了两个方法来判断Socket对象的输入、输出流是否被关闭,这两个方法原创 2021-12-18 10:41:12 · 1956 阅读 · 0 评论 -
Mac OS查看和设置JAVA_HOME
1, 查看JAVA版本打开Mac电脑,查看JAVA版本,打开终端Terminal,通过命令行查看笔者的java版本::bogon:~ donny$ java -versionjava version "1.7.0_71"Java(TM) SE Runtime Environment (build 1.7.0_71-b14)Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)发现已安装Java运行环境。如果你的系统已经原创 2021-11-13 10:51:02 · 804 阅读 · 0 评论 -
ArrayList循环删除陷阱及迭代器介绍
一 ArrayList循环删除陷阱 模板测试代码如下:public class ArrayListRemove { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("a"); list.add("bb"); list.add("bb"); ...原创 2021-10-26 23:42:39 · 604 阅读 · 1 评论 -
Java 集合 List 与 Array 的转换
List 转 Array使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size()。反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[] 类,若强转其它类型数组将出现 ClassCastException 错误。反例:public static void main(String[] args) throws Exception { List<String> l原创 2021-10-20 17:59:25 · 247 阅读 · 0 评论 -
java消息队列,业务应用场景概述
1.异步处理场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式a、串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。b、并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行...原创 2021-09-15 23:24:09 · 438 阅读 · 0 评论 -
enum 实现 Parcelable 接口
enum 实现 Parcelable 接口当你创建一个枚举,想要使用上述插件时,就会发现无法序列号。这个是因为Parcel.writeXXX没有写入枚举的方法,所以无法直接实现 Parcelable。这个时候,我们只需要定义一个转换规则,将枚举转换为 `Parcel` 可以写入的类型,并且支持从 `Parcel` 获取变量找到对应的枚举即可。public enum Fruit implements Parcelable { /** * 水果 */ APPLE, BA..原创 2021-08-04 19:16:50 · 224 阅读 · 0 评论 -
volatile
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。vola原创 2021-06-19 21:37:17 · 82 阅读 · 0 评论 -
UDP Socket
UDP的Java支持UDP协议提供的服务不同于TCP协议的端到端服务,它是面向非连接的,属不可靠协议,UDP套接字在使用前不需要进行连接。实际上,UDP协议只实现了两个功能:1)在IP协议的基础上添加了端口;2)对传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。Java通过DatagramPacket类和DatagramSocket类来使用UDP套接字,客户端和服务器端都通过DatagramSocket的send()方法和receive()方法来发...原创 2021-06-19 17:45:51 · 882 阅读 · 0 评论 -
LinkedBlockingQueue
一、类签名从类名可知,LinkedBlockingQueue是基于链表实现的阻塞队列。 public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable 类特点:基于链表实现的阻塞队列,线程安全; 队头元素是存活时间最长的元素,队尾元素是存活时间最短的元素; 元素从原创 2021-06-09 22:07:45 · 411 阅读 · 0 评论 -
HashMap这一篇就够了
介绍下 HashMap 的底层数据结构现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。为什么要改成“数组+链表+红黑树”?主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。在什么时候用链表?什么时候用红黑树?对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大于等于 64,则会触发链原创 2021-05-29 17:05:07 · 179 阅读 · 2 评论 -
ArrayList源码解析
构造函数 /** * Constructs an empty list with an initial capacity of ten. * 使用10个初始容量构造一个空的集合 */ public ArrayList() { super(); // 用一个空的数组进行初始化 this.elementData = EMPTY_ELEMENTDATA; } // 来看看 elementData和EMPT原创 2021-03-23 21:49:17 · 96 阅读 · 0 评论 -
Java生成固定长度的随机字符串(以大小写字母和数字)
public class RandomStringUtil { public static ArrayList<String> strList = new ArrayList<String>(); public static Random random = new Random(); static { init(); } public static String generate32RandomStr() { .原创 2021-03-08 17:39:44 · 1604 阅读 · 0 评论 -
H264 SPS中得到宽高的代码(java)
数据需要去掉头,SPS测试数据 byte[] buffer = new byte[]{103, 66, -64, 12, -38, 5, 7, -56, 7, -124, 2} 得到结果宽320高240.public class H264SpsParser { private final static String TAG = H264SpsParser.class.getCanonicalName(); private final static int NAL_HEADER = 0;原创 2021-02-28 20:15:55 · 373 阅读 · 1 评论 -
android studio gradle配置国内阿里云镜像 快速更新
对单个项目生效,在项目中的build.gradle修改内容buildscript {repositories {maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}}}allprojects {repositories {maven { url 'http://原创 2020-11-26 22:08:51 · 2059 阅读 · 0 评论 -
Android LED电子表时钟字体digital font
字体效果如下图所示:这种类型的字体样式会被一些UI设计用于Android APP中时钟显示,比如交通灯倒计时。实现这种字体样式,先导入一个字体包:digital.ttf。这个digital.ttf文件,我已经上传,下载链接地址:http://download.csdn.net/download/zhangphil/9965392拿到digital.ttf文件后,作为Android assets资源文件导入,如下图所示:然后就可以使用了,我给出一个例子,重写一个TextView,Digi.原创 2020-11-10 10:28:12 · 5471 阅读 · 0 评论