随笔分类 - java
摘要:class Singleton{ //volatile关键字禁止指令重排 private volatile static Singleton instance; private Singleton(){} public Singleton getInstance(){ if(instance==nu
阅读全文
摘要:1. 迭代器遍历 2. for-each遍历 for(Map.Entry<String,Integer> cur:mp.entrySet()){ System.out.println(cur.getKey()+" "+cur.getValue()); }
阅读全文
摘要:TreeSet是Java里自排序的Set,对应C++中的set 排序代码: Set<String> dish=new TreeSet<>();//默认升序 Set<String> table=new TreeSet<>(new Comparator<String>() {//自定义排序 @Overr
阅读全文
摘要:1. 池化思想:线程池,字符串常量池,连接池 2. 线程池的优点: 提高线程利用率(利用创建好的线程反复去执行任务) 提高程序的响应速度(省去创建时间) 便于统一管理线程对象 可以控制最大并发数 3. 类比:银行柜台窗口 工作过程是先创建若干个线程,如果需要执行一个任务就派一个线程去执行,如果都在执
阅读全文
摘要:1. 内存模型概念 (1)内存模型(Java Memory Model)和内存结构(堆栈那些)不是一个层面的概念,JMM 定义了一套在多线程读写共享数据(成员变量,静态变量等,而不是局部变量这种线程私有的)时,对数据的可见性、有序性、和原子性的规则和保障。 (2)JMM规定了所有的变量都存储在主内存
阅读全文
摘要:1. 逃逸分析 概念:判断新建的对象是否逃逸,可以使用 -XX:-DoEscapeAnalysis 关闭逃逸分析。 逃逸分析利用的是JVM分层编译,JVM的执行状态分为五个层次: 即时编译器比起解释器多了Code Cache,下次遇到相同的代码直接执行不需要再编译,所以执行后面重复代码会更快。 2.
阅读全文
摘要:1. 类加载流程 2. 加载 类加载过程的第⼀步,主要完成下⾯3件事情: (1)通过全类名获取定义此类的⼆进制字节流 (2)将字节流所代表的静态存储结构转换为方法区的运行时数据结构(本质是C++的instanceKlass作为元数据来描述Java类) (3)在内存中⽣成⼀个代表该类的 Class 对
阅读全文
摘要:一. 特点 1. 常量池中的字符串仅是符号,第一次用到时才变为对象 2. 利用串池的机制,来避免重复创建字符串对象 3. 字符串变量拼接的原理是 StringBuilder(1.8),StringBuilder的toString()方法实际上是new出来的String 4. 字符串常量拼接的原理是编
阅读全文
摘要:Stack就是继承Vector的,而我们常常用Deque替代Stack(Deque可以当栈也可以当队列) 不使用Vector及子类原因如下: 1. 因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer 2. Vector空间满了之后,扩容是一倍,而ArrayList仅仅
阅读全文
摘要:1. 如何判断垃圾可以回收 (1)引用计数算法:引用时,计数+1,引用失效,计数-1,零时回收;缺点是遇到互相引用导致都不为零 (2)可达性分析算法(Java用):扫描堆中的对象,沿着GC Root对象为起点的引用链看能否找到该对象,如果能则其仍然存活,不能则判定为可回收的对象。 可作为GC Roo
阅读全文
摘要:1. 直接内存(Direct Memory)是一个数据缓冲区,属于操作系统内存,不由jvm管理 2. 特点:常用于NIO(ByteBuffer分配的就是直接内存),分配回收成本较高,但读写性能高 3. 正常文件读写过程:磁盘文件 -> 系统缓冲区 -> java缓冲区(new Byte[]) 直接内
阅读全文
摘要:1. 程序计数器 线程私有,是一个记录着当前线程所执行的字节码的行号指示器 2. Java虚拟机栈 线程私有,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 3. 本地方
阅读全文
摘要:1. java.util.Date (1)两个构造器 Date date1 = new Date(); Date date2 = new Date(10000000L); (2)两个方法 toString():获取当前的年月日时分秒 getTime():获取当前Date(创建时)到1970.1.1的
阅读全文
摘要:1. 构造代码块:用{}裹起来的代码片段,构造块在创建对象时会被调用,每次创建对象 时都会被调用,并且优先于类构造函数执行。 构造块中定义的变量是局部变量。 2. 静态代码块:用static{}裹起来的代码片段,只会被执行一次(第一次加载此类时执行,比如说用Class.forName("")加载类时
阅读全文
摘要:1. 为什么要序列化 当需要把对象存入文件或数据库,或想使用socket在网络上传输对象时,需要序列化。 也就是把对象变成一种可保存的形式。 字节序列还原成Java对象就是反序列化。 2. Serializable接口没有方法,只是标识
阅读全文
摘要:1. 无论向上转型还是向下转型,都需要有继承关系,否则编译器报错! 向上转型:子类型转向父类(自动类型转换) 向下转型:父类型转向子类(强制类型转换,需要加强制类型转换符) 2. 什么是多态? 多态是同一个行为具有多个不同表现状态的能力。 多种状态,编译时是一种状态,运行时是另一种状态。 编译时,是
阅读全文
摘要:1. Java5之后,支持基本数据类型与包装类型的互相转换,即自动装箱与自动拆箱 2. 做加减乘除运算时会自动拆箱,而==比较不会 Integer x=1000; Integer y=1000; System.out.println(x==y);//false// ==比较的是x和y的地址,两个对象
阅读全文
摘要:1. 反射是什么 加载完类之后,堆内存中就会有Class对象(一个类对应一个Class对象),这个对象包含了类完整的结构信息;我们可以通过这个对象看到类的结构,这个过程称为反射。 反射机制允许在运行期间利用Reflection API获得任何类的内部信息,并操作对象的方法。 通过反射可以调用一个类的
阅读全文
摘要:1. private private修饰的成员变量不能被继承,会被隐式指定为final private修饰的方法能被继承,但是任何其他类没有访问权限,子类继承了也无法访问 private不能修饰类 public class Father { private int a; private void s
阅读全文
摘要:1. final修饰变量 如果修饰的是基本数据类型的变量,该变量赋值后不能再更改 如果修饰是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象 如果修饰的是类的成员变量,赋值方法为:当场直接赋值、构造方法、构造代码块 2. final修饰类 final修饰的类无法被继承 3. final修
阅读全文

浙公网安备 33010602011771号