java
濯君
求知,内敛,有趣,勤静
展开
-
java stream 实现双重for循环
给定列表[1, 2, 3]和列表[3, 4],返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。import java.util.*;import java.util.stream.Collectors;public class Main { public static void main(String[] args) { List<Integer> numbers1 = Arrays.asList(1, 2原创 2021-08-15 10:45:20 · 5906 阅读 · 2 评论 -
JVM-对象的内存分配
大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。大对象直接进入老年代,大对象是指需要大量连续内存空间的java对象,典型的大对象是那种很长的字符串以及数组。虚拟机提供了一个-XX:PretenureSizeThreshold参数,存储空间大于这个设置值的对象直接在老年代分配,这么做是为了避免在Eden区及两个Survivor区之间发生大量的内存复制。长期存活的对象将进入老年代,虚拟机会给每个对象设置一个对象年龄(Age)计数器。如果对象原创 2020-08-24 14:14:10 · 138 阅读 · 0 评论 -
JVM垃圾收集算法
标记-清除算法分为标记,清除两个阶段,首先标记所有需要回收的对象,标记完成后统一回收所有被标记的对象。主要有两个不足:一是标记和清除两个过程的效率都不高;二是标记,清除之后会产生大量不连续的内存碎片。空间碎片太多,可能会导致以后在冲程序运行过程中,需要给较大对象分配内存时,无法找到足够的连续内存而提前触发垃圾收集操作。复制算法复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将还存活的对象复制到另一块上面,然后再吧已使用过的那块内存空间一次清理掉。这样使得原创 2020-08-24 08:17:56 · 132 阅读 · 0 评论 -
java方法区的回收
方法区(Hotspot虚拟机中的永久代)的垃圾回收主要收集两部分的内容:废弃常量和无用的类。废弃常量的回收以常量池中字面量的回收为例,加入一个字符串“abc”已经进入常量池中,但是当前系统没有任何一个string对象叫作“abc”,即没有任何string对象引用常量池中的“abc”常量,也没有其他地方引用这个字面量。如果这时候发生内存回收,且有必要的话,这个“abc”常量就会被系统清理出常量池。常量池中的类(接口),方法,字段的符号引用也类似。类的回收当类满足以下三个条件,才能认为是无用的类。该原创 2020-08-23 19:17:51 · 446 阅读 · 0 评论 -
如何判断对象是否存活
判断对象是否存活的方法主要有两种:引用计数算法,可达性分析算法引用计数算法给对象添加一个引用计数器,当有一个地方引用它时,引用计数器+1,当有一个引用失效时,引用计数器-1,引用计数器为0时,表示对象不可能再被使用。这个方法实现简单,判断效率高,但是不能解决对象之间循环引用的问题。比如两个对象相互持有对方的引用,除此之外,再无其他引用,实际上这两个对象已经不能再被访问,但是因为它们互相引用对方,导致引用计数器不为0,导致垃圾收集器不能回收它们。可达性分析算法java,C#都是通过可达性分析算法来原创 2020-08-23 18:41:48 · 1129 阅读 · 0 评论 -
java中对象的访问定位
java程序通过栈上的reference数据来操作堆上的具体对象。目前主流的访问方式有两种使用句柄,直接指针。使用句柄java堆中会划分出一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象的实例数据与类型数据各自的具体地址信息。直接指针java堆对象的布局中必须考虑如何放置访问类型数据的相关信息,reference中存放的是对象地址。使用句柄的访问方式,优势是,reference中存放的是稳定的句柄地址,在对象被移动时(垃圾收集时移动对象是很普遍的行为),只会原创 2020-08-22 20:41:57 · 178 阅读 · 0 评论 -
java对象的创建过程
以下为普通java对象的创建过程,不包括数组和Class对象等虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符合引用,并且检查这个符合引用代表的类是否已被加载,解析和初始化过。如果没有,再执行相应的类加载过程。在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后就可以确定。为对象分配内存的任务即等同于。把一块确定大小的内存从java堆中划分出来。划分的方法有两种,取决于java堆中内存是否规整。而java堆中内存是否规整又由所采用的垃圾收原创 2020-08-22 20:17:10 · 154 阅读 · 0 评论 -
Java 运行时数据区
Java运行时数据区主要分为线程私有的程序计数器,虚拟机栈,本地方法栈,线程共享的堆,方法区,如下图一:程序计数器程序计数器是一块较小的内存空间,线程私有,可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时,通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等功能都是依靠这个计算器来完成的。如果线程正在执行的是java方法,则计数器里存放的是正在执行的java字节码指令的地址;如果执行的是native方法,则计数器里的值为空。此内存区域是jav原创 2020-08-22 16:23:10 · 106 阅读 · 0 评论 -
二叉树前序,中序,后续,层次遍历统一的算法
public class TreeNode { //二叉树节点定义 int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }一:前序遍历import java.util.ArrayDeque;import java.util.ArrayList;import java.util.Deque;import java.util.List;class Solution原创 2020-05-11 12:10:46 · 258 阅读 · 0 评论 -
Java基础水平需掌握的知识技术
一、基础主要看《java核心技术:卷一》的重点章节掌握java常用技术,io、多线程、反射、常用集合框架数据结构看一遍,作用至少要清楚。如hash冲突解决办法,常用排序算法的应用场景和空间/时间复杂度等数据库,能看懂ER关系,熟悉数据库三大范式,熟练常用SQL语句可以掌握一点java网络编程方面的知识,对tcp/ip有初步的认识课程不能落下,专业课程(计算机网络,操作系统,数据结构,数据库,计算...转载 2020-05-01 11:14:19 · 272 阅读 · 0 评论 -
Java 获取文件的基本信息
package testfile;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.i转载 2017-01-11 20:46:18 · 4878 阅读 · 0 评论 -
Java 把字符串转换为字符串数组以及把字符串数组转化为字符串
一:把字符串转换为字符串数组String content = "aksddjasj";String array[] = new String[content.length()];for (int i = 0; i < array.length; i++) { array[i] = String.valueOf(content.charAt(i));原创 2017-01-16 16:25:46 · 5266 阅读 · 0 评论 -
java运算符优先级
原文 序列号符号名称结合性(与操作数)目数说明1.点从左到右双目 ( )圆括号从左到右 [ ]方括号从左到右转载 2016-10-23 15:59:04 · 478 阅读 · 0 评论 -
两个Long类型如何比较大小
Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象是否是同一个对象如果比较两个Long对象值是否相等,则不可以使用双等号进行比较,可以采用如下方式:1. 使用 equals 方法Long a = new Long(3);Long b = new Long(3);System.out.println(a.equals(b));2. 使用 Long转载 2016-10-20 15:39:28 · 7026 阅读 · 0 评论 -
java里的subString方法
1.两个例子"hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile"2. String s = "asklj我aslkjdhs们aaksd"; String s1 = s.substring(s.indexOf("我") + 1, s.indexOf("们"));原创 2016-10-20 15:57:46 · 724 阅读 · 0 评论 -
Java学习笔记
1.为了继承,一般的规则是将所有的数据成员指定为private,将所有方法指定为public。原创 2016-10-09 16:05:26 · 507 阅读 · 0 评论 -
Java 使用匿名内部类直接new接口
java中的匿名类有一个倍儿神奇的用法,见下面代码示例:package contract; public interface ISay { void sayHello(); }上面是一个简单的接口,下面是如何使用:package jimmy;import contract.ISay;public class Program { public static void main(转载 2017-01-15 15:01:18 · 1618 阅读 · 0 评论 -
Java中匿名内部类的总结
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法abstract class Person { public abstract void eat();}class Child extends Person { public void转载 2017-01-15 15:12:29 · 405 阅读 · 0 评论 -
Java IO流学习笔记
一:读取中文出现乱码的解决方法: 构造InputStreamReader时加入编码方式“utf-8”BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(new File("F:/download/test.txt")),"utf-8"))二:使用FileW原创 2017-01-11 16:31:12 · 403 阅读 · 0 评论 -
Java IO流之对象的序列化与反序列化
一:需要序列化的类 实现Serializable接口package testfile;import java.io.Serializable;public class Person implements Serializable{ private String name; private int age; public Person(String name, int age)转载 2017-01-11 16:34:44 · 499 阅读 · 0 评论 -
Java WatchService监视文件变动
package testfile;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.i转载 2017-01-11 20:45:12 · 905 阅读 · 0 评论 -
《JAVA知识点列表》V1.0
《Java知识点列表》V1.0 1 开发环境Java SDK 下载和安装2 环境变量的配置(path和classpath)3 编程基础 标识符命名规范4 Java数据类型5 运算符6 分支语句(if,switch)7 循环语句(for,while)8 函数的定义方法9 面向对象基础 面向对象与面向过程语言之间的区别10 面向对象基本转载 2016-09-23 13:21:47 · 735 阅读 · 0 评论