Java学习
文章平均质量分 82
程序员掉头发
这个作者很懒,什么都没留下…
展开
-
Java 自定义比较器Comparator的底层实现原理
参考文献java comparator 升序、降序、倒序从源码角度理解前言正常在使用Collections.sort()中使用Comparator自定义比较器时会使用如下代码所示的写法List<String> list = new ArrayList<>();list.add("2");list.add("4");list.add("3");list.add("1");Collections.sort(list, new Comparator<String&g原创 2021-02-23 13:50:25 · 2564 阅读 · 2 评论 -
Java String占用的真实内存空间(附测试代码,求大佬解答遇到的问题)
前言因为String 并不是我们熟知的基本数据类型(int、double、char…),所以在Java中都会用对象来存储,那么String类型占用的内存到底有多少呢,本文将深度探索,并且附有测试代码!Java的对象首先了解一下Java的对象结构(在HotSpot虚拟机中)markword:占4个字节,主要包括hashCode信息,锁对象信息以及GC年龄信息等。class pointer :占4个字节,指向class对象文件length:占4个字节,如果这是数组对象,在对象头中还会包括数组长度原创 2020-10-23 17:40:30 · 992 阅读 · 1 评论 -
Java中数组、List、Set互相转换
数组转ListString[] staffs = new String[]{"Tom", "Bob", "Jane"};List staffsList = Arrays.asList(staffs);需要注意的是, Arrays.asList() 返回一个受指定数组决定的固定大小的列表。所以不能做 add 、 remove 等操作,否则会报错。List staffsList = Arrays.asList(staffs);staffsList.add("Mary"); // Unsuppor转载 2020-07-25 20:35:46 · 144 阅读 · 0 评论 -
Java 内存分配之堆、栈和常量池
Java内存分配主要包括以下几个区域:寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据静态域:存放在对象中用static定义的静态成员常量池:存放常量非RAM(随机存取存储器)存储:硬盘等永久存储空间Java内存分配中的栈在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用转载 2020-07-12 19:12:40 · 186 阅读 · 0 评论 -
Java static、final以及内部类详解
一、staticstatic能与属性、方法和内部类一起使用,表示静态的。类中的静态变量和静态方法都和类名一起使用,不需要创建类的对象来访问,所以static修饰的变量被称为“类变量”。类中一个static变量只有一个内存空间,类可能会有多个实例,但共享这个static 变量。static变量在类装载的时候就被初始化使用static的基本原则:一个类的静态方法只能访问静态属性一个类的静态方法不能直接调用非静态方法静态方法中不存在当前对象,所以不能使用this,super静态方法不能被非静态方原创 2020-07-12 17:34:20 · 354 阅读 · 0 评论 -
Java 对象序列化和反序列化详解
本文主要是整合了一下两篇博客的内容,第一篇引用其概念,第二篇引用了关于序列化ID的介绍,并结合自己的例子进行解释。https://www.cnblogs.com/xdp-gacl/p/3777987.htmlhttps://www.cnblogs.com/lukelook/p/11192677.html一、序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘.原创 2020-05-29 13:58:01 · 178 阅读 · 0 评论 -
并发和并行、同步和异步及多线程概念详解
并发:讲并发之前,要先看一张图:Concurrency,是并发的意思。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。微观角度:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。宏观角度:多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理。通俗点讲,并发就是只有一个CPU资源,程转载 2020-05-25 15:19:04 · 1587 阅读 · 1 评论 -
Java 到底是传值还是传引用
本文是节选自stackoverflow中的答案做一个总结,方便自己日后查看。结论:Java没有传引用,只有传值Dog myDog;myDog实际上是一个指向Dog的指针,不是真实的Dog。Dog myDog = new Dog("Rover");fuc(myDog);假定新创建的Dog对象存在内存地址42的位置使用fuc()函数传入的是 Dog对象 myDog的地址(也就是42)public void fuc(Dog someDog) { someDog.setName("Max翻译 2020-05-18 16:37:35 · 152 阅读 · 0 评论 -
Java 学习Static关键字
宜春的博客 讲解的非常详细。其中重点,static是静态的,在初次编译的时候就初始化,只喝类有关,和对象无关。而且static变量是被所有对象共享的。这里输出的结果是666因为this是当前对象,this.value是当前的成员变量value,method()中的value是局部变量,不是成员变量。而static定义的value是静态变量,被所有多想共享,所以输出666。如果有同学对于成...原创 2020-03-23 20:26:54 · 115 阅读 · 0 评论 -
Java HashMap中不能使用基本数据类型
Java为每个基本类型都提供了封装类,在HashMap,HashSet等结构中只能使用引用类型,不能使用原始数据类型。参考原文转载 2020-02-27 17:43:40 · 679 阅读 · 0 评论