java
Luckie stone
Android应用开发。
展开
-
一步步解析java执行内幕
一 编写java源程序java源文件:指存储java源码的文件;当前比较主流的JAVA IDE?(1)Intellij IDEA(首推荐)(2)Eclipse先来看看如下代码://MyTest被public修饰,故存储该java源码的文件名为MyTestpublic class MyTest { public static void main(Stri...转载 2019-07-28 07:14:53 · 98 阅读 · 0 评论 -
Java 泛型,你了解类型擦除吗?
文章开始的地方,先给大家奉上一道经典的测试题。List<String> l1 = new ArrayList<String>();List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getClass());...转载 2019-04-22 05:56:31 · 261 阅读 · 0 评论 -
夯实JAVA基本之二 —— 反射(3):类内部信息获取
上两篇文章中,给大家讲了,有关类周边信息的获取方法,这篇文章中我们将深入到类的内部,看看类的构造函数,内部变量,函数等信息的获取方法。相比而言,这篇更重要。一、构造函数相关获取1、获取构造函数要获取类的构造函数,有下面几种方法://获取public类型的构造函数Constructor<?>[] getConstructors();Constructor<T> ...转载 2019-04-23 06:12:00 · 197 阅读 · 0 评论 -
夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取
在上篇中,我们简单给大家讲解了如何利用反射来获取普通类型的类的使用,今天给大家讲解下,有关如何使用反射来获取泛型中的信息。提前提个醒,本篇文章内容稍难,大家可能需要多看几篇。这篇文章将大量用到泛型的知识,如果对泛型声明及填充不太了解的同学,请先看完《夯实JAVA基本之一 —— 泛型详解系列》一、获取泛型超类和接口的相信信息在这部分内容中,我们将讲述如何获取泛型的超类和接口,把上篇中遗留下来...转载 2019-04-23 06:11:53 · 147 阅读 · 0 评论 -
夯实JAVA基本之二 —— 反射(1):基本类周边信息获取
今天开始给大家讲讲有关反射的知识,在应用程序开发时,如果纯做上层,搭搭框架啥的,那用到反射的机会不多,但如果你想做出来一个公共类或者公共模块给其它人用的时候,那用到反射的可能性就大大增加了。况且反射听起来也是蛮屌的名字,今天就我们彻底认识他下吧。一、引入在开始反射之前,我们先看看JVM是如何将我们写的类对应的java文件加载到内存中的。1、类的生命周期这部分我们先讲讲JVM的加载机制(可...转载 2019-04-23 06:11:46 · 156 阅读 · 0 评论 -
夯实JAVA基本之一——泛型详解(2):高级进阶
上一篇给大家初步讲解了泛型变量的各种应用环境,这篇将更深入的讲解一下有关类型绑定,通配符方面的知识。一、类型绑定1、引入我们重新看上篇写的一个泛型:class Point<T> { private T x; // 表示X坐标 private T y; // 表示Y坐标 public void setX(T x) { ...转载 2019-04-23 06:11:38 · 165 阅读 · 0 评论 -
夯实JAVA基本之一 —— 泛型详解(1):基本使用
一、引入1、泛型是什么首先告诉大家ArrayList就是泛型。那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码:ArrayList<String> strList = new ArrayList<String>();ArrayList<Integer> intList = new ArrayList<Integer>();...转载 2019-04-23 06:11:30 · 165 阅读 · 0 评论 -
三句话总结JAVA泛型通配符(PECS)
在JAVA的泛型集合中,默认都可以添加null,除此以外,还有以下三条规则。1. “?”不能添加元素以“?”声明的集合,不能往此集合中添加元素,所以它只能作为生产者(亦即它只能被迭代),如下:List<?> names = Lists.newArrayList("yiifaa");// 通配符声明的集合,获取的元素都是Object类型List<Object>...转载 2019-04-13 10:55:27 · 127 阅读 · 0 评论 -
深入理解 Java 泛型
为什么需要泛型?先来看一段代码,这段代码是用来计算两个数之和,可以看到每次新增一种数据类型,那么就要新增一个方法,这显然是不好的解决方法。public class NoGeneric { public int addInt(int a, int b) { return a + b; } public double addDouble(...转载 2019-04-13 10:53:32 · 206 阅读 · 0 评论 -
Synchronized与ReentrantLock区别总结
相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。功能区别:这两种方式最大区别就是对于Synchronized来说,它是java语言的关键...转载 2019-04-13 10:15:25 · 587 阅读 · 0 评论 -
java 枚举类比较是用==还是equals?
一般在Java代码里面,涉及到比较2个值的问题,除了是简单的一般数据类型意外,字符串除外,我们都是使用==来判断是否相等的,但是对于字符串和对象以及封装类型的数据都是使用equals方法,来判断2个值是否相等。所以,当我看到别人的代码中,枚举类型变量,直接使用==,来判断是不是相等,很是诧异。然后就有了下面的调查和测试。先看测试代码: /** * 测试枚举比较,使用equa...转载 2019-03-12 07:18:40 · 4393 阅读 · 3 评论 -
File 类的 getPath()、getAbsolutePath()、getCanonicalPath() 的区别
考虑一下几种路径:C:\temp\file.txt - 绝对路径,也是规范路径.\file.txt - 相对路径C:\temp\myapp\bin\..\..\file.txt 这是一个绝对路径,但不是规范路径粗略的认为规范路径就是不包含相对路径如 ..\ 或者 .\ 的绝对路径看一个例子:import java.io.File;public class PathTestin...转载 2019-01-28 17:52:03 · 2932 阅读 · 0 评论 -
java字符串的替换replace、replaceAll、replaceFirst的区别详解
如果不是刚刚复习了下正则表达式,我可能也不会注意到,原来String的replaceAll跟replaceFirst用到了正则表达式!不多解释,看代码:String s = "my.test.txt";System.out.println(s.replace(".", "#"));System.out.println(s.replaceAll(".", "#"));System...转载 2018-12-05 11:02:34 · 691 阅读 · 0 评论 -
unicode为12288的字符
今天做一个导入数据功能时发现一个问题,就是一个unicode为12288的字符显示为空格,但是用Java trim()函数无法去除。测试代码如下public class TstSeven { public static void main(String[] args) { String str = " "; printStrAscii(st...转载 2018-11-24 07:42:46 · 3170 阅读 · 0 评论 -
JVM对象引用与内存分配策略
关于引用在《JVM理解其实并不难! 》一文中提到,JVM是通过可达性分析来判断对象是否需要被回收,这可以弥补引用计数法的不足。即就算两个对象相互引用,只要这两个对象没有引用链连接GC Roots,这两个对象都会被判定为可回收的对象!注意,这里是指被判定位可回收的对象,并不是说他们就一定会被回收!这相当于“标记”的过程,即标记这个对象为可以回收的对象。什么意思呢?既然被标记为可回收的对象,难...转载 2018-08-09 06:30:20 · 143 阅读 · 0 评论 -
JVM理解其实并不难!
JVM内存区域我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题。为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识。JVM将内存主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器。JVM运行时数据区如下: 程序计数器程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令。占用的内存空间小,可以把它...转载 2018-08-09 06:30:11 · 164 阅读 · 0 评论 -
最简单的Lambda入门教程
Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在JAVA领域中发展较慢,直到java8,才开始支持Lambda。抛开数学定义不看,直接来认识Lambda。Lambda表达式本质上是匿名方法,其底层还是通过invokedynamic指令来生成匿名类来实现。它提供了更为简单的语法和写作方式,允许你通过表达式来代替函数式接口。在一些人看来,Lambda就...转载 2019-05-02 16:09:03 · 189 阅读 · 0 评论 -
增强的接口
默认方法在java8之前,接口(interface)中只允许存在抽像方法(abstract method),而在java8中允许我们使用default关键字,为接口添加非抽象方法,该方法被称为扩展方法(或者直接叫做默认方法),该方法无须子类实现。如下:interface Calculate{ int calculate(int i); default in...转载 2019-05-02 16:19:31 · 202 阅读 · 0 评论 -
Java8新特性--CompletableFuture
并发与并行Java 5并发库主要关注于异步任务的处理,它采用了这样一种模式,producer线程创建任务并且利用阻塞队列将其传递给任务的consumer。这种模型在Java 7和8中进一步发展,并且开始支持另外一种风格的任务执行,那就是将任务的数据集分解为子集,每个子集都可以由独立且同质的子任务来负责处理。这种风格的基础库也就是fork/join框架,它允许程序员规定数据集该如何进行...转载 2019-07-27 11:35:16 · 544 阅读 · 0 评论 -
编程的智慧
编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋。然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获。反复推敲代码有些人喜欢炫耀自己写了多少多少万行的代码,仿佛代码的数量是衡量编程水平的...转载 2019-07-27 11:28:46 · 140 阅读 · 0 评论 -
Java程序员容易犯的10大低级错误
本文根据java开发人员在编码过程中容易忽视或经常出错的地方进行了整理,总结了十个比较常见的低级错误点,方便大家学习。1、不能用“==”比较两个字符串内容相等。2、 对list做foreach循环时,循环代码中不能修改list的结构。3、 日志和实际情况不一致;捕获异常后没有在日志中记录异常栈。4、 魔鬼数字。5、 空指针异常。6、 数组下标越界。7、 将字符串转换为数...转载 2019-07-31 07:14:29 · 250 阅读 · 0 评论 -
浅析java程序的执行过程
一 jdk内容概述 当安装好jdk后(本示例jdk版本为11.0.1,不同版本,目录有细微差别,但bin目录包含的exe是一样的),打开bin目录,有两个重要的exe文件:javac.exe(编译器)和java.exe(.class文件执行器),详细见下图二 原理分析 java程序执行过程分为两步,下图为流程示意图 第一步:将java源码(...转载 2019-07-07 11:25:57 · 397 阅读 · 0 评论 -
【深入理解JVM】:类加载器与双亲委派模型
类加载器加载类的开放性类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类。虚拟机规范并没有指明二进制字节流要从一个Class文件获取,或者说根本...转载 2019-07-07 10:08:48 · 282 阅读 · 0 评论 -
【深入理解JVM】:类加载机制
概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行链接工作的语言不同,在Java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的,例如import java.util.*下面包含很多类,但是,在程序运行的时候,虚拟机只会加载哪些我们程序需要的类。这...转载 2019-07-07 10:02:00 · 148 阅读 · 0 评论 -
关于为什么要重写hashCode()方法和equals()方法及如何重写
我想写的问题有三个:1、首先我们为什么需要重写hashCode()方法和equals()方法2、在什么情况下需要重写hashCode()方法和equals()方法3、如何重写这两个方法*********************************************************************第一个问题:为什么需要重写hashCode()方法和equ...转载 2019-07-04 06:49:13 · 548 阅读 · 0 评论 -
Java8 Optional 使用
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。我个人觉得,java8之所以要提出这个对象,是因为java8中主要引入了lambda表达式,这种函数式编程中大量的链式调用,如果用原始的方法去判断nullpointException,会破坏lambda这种风格。还有一个原因是,其他语言比如kotlin,就提...转载 2019-07-02 06:49:56 · 1550 阅读 · 0 评论 -
java泛型全总结
概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类...转载 2019-06-14 06:40:11 · 557 阅读 · 0 评论 -
instanceof 与isAssignableFrom
instanceof 针对实例isAssignableFrom针对class对象isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。通常调用格式是 Class1.isAssignableFrom(Class2) 调用者和参数都是 Java.lang.Class 类型。 ...转载 2019-06-07 10:05:31 · 462 阅读 · 0 评论 -
MessageDigest的功能及用法
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。...转载 2019-06-07 09:58:46 · 908 阅读 · 0 评论 -
ArrayList中remove方法的陷阱
由于ArrayList集合底层存储结构是数组,所以ArrayList中的remove删除方法,其实就是数组的删除,大家或许对于数组的删除都不陌生,先遍历比较判断是否存在,存在便删除。源码如下:public boolean remove(Object o) { if (o == null) { for (int index = 0; index <...转载 2019-05-11 16:25:21 · 899 阅读 · 0 评论 -
Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.)Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一...转载 2019-04-20 11:09:56 · 88 阅读 · 0 评论 -
Java 泛型进阶
擦除在泛型代码内部,无法获得任何有关泛型参数类型的信息。例子1://这个例子表明编译过程中并没有根据参数生成新的类型public class Main2 { public static void main(String[] args) { Class c1 = new ArrayList<Integer>().getClass(); ...转载 2019-04-19 06:39:12 · 89 阅读 · 0 评论 -
认识函数式接口
在上一节中我们谈到Java8对原有的接口进行了增强,除此之外,Java8中还提出了一个新名词——函数式接口(Functional Interface),用来特指某类型的接口。这类接口中定义了唯一的抽象方法,在早期这类接口被叫做SAM类型接口(single abstract interface),比如我们常见的Runnable接口。需要注意的是接口的默认方法和静态方法并不影响一个接口成为函数式接口。...转载 2019-05-02 16:22:26 · 267 阅读 · 0 评论 -
《深入理解Java虚拟机》读书笔记7
一、Java内存模型 Java内存模型(Java Memory Model, JMM),用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。主要目标是定义程序中各个共享变量的访问规则。1、主内存与工作内存 Java内存模型规定所有(线程共享)变量都存储在主内存(Main Memory)中。每条线程还有自己的工作内存...转载 2018-08-01 06:18:46 · 177 阅读 · 0 评论 -
《深入理解Java虚拟机》读书笔记6
一、编译器 Java语言的编译器有: 前端编译器:把*.java文件转变成*.class文件的过程,例如:Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。 后端编译器(也称为JIT编译器,Just In Time Compiler):把字节码转变成机器码的过程,例如:HotSpot VM的C1、C2编译器 静态提前编译器...转载 2018-08-01 06:18:37 · 144 阅读 · 0 评论 -
《深入理解Java虚拟机》读书笔记5
一、运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机方法调用和方法执行的数据结构,它是虚拟机运行时数据区中虚拟机栈(Virtual Machine Stack)的栈元素。 对于执行引擎来说,活动线程中,只有栈顶的栈帧是有效地,称为当前栈帧(Current Stack Frame),这个栈帧所关联的方法称为当前方法(Current Method)。执行引擎所...转载 2018-08-01 06:18:26 · 137 阅读 · 0 评论 -
垃圾回收机制
本文将根据三个方面来描述垃圾回收机制:一、如何确定哪些是要回收的对象 二、垃圾回收算法思想 三、垃圾收集器一、如何确定哪些是要回收的对象1.1。引用计数算法 :引用计数算法就是给对象添加一个引用计数器,每当有一个地方引用该对象的时候就会+1,相反当失去一个引用的时候就-1,当引用数为0的时候也就说明这个对象不在被使用就可以被回收。这种算法实现简单,效率也很高,但是唯一的缺点就是在两个对象相互引用的...转载 2018-07-12 06:34:20 · 501 阅读 · 0 评论 -
Java运行时内存区域及对象的创建
一、Java运行时内存区域首先我们都知道Java的内存管理是由虚拟机管理的,但是如果我们不了解虚拟机的内存管理那么就会造成内存泄露进而导致内存溢出。而且如果不了解内存的分配情况,当我们真的出现了内存泄露或者溢出的时候,我们排查起来那将是异常艰难的,所以了解Java的内存分配是很必要的,对我们的程序的内存优化也是大有利益的。而且,很多人把虚拟机只分为堆内存和栈内存,这种说法是不对的,可是为什么又会有...转载 2018-07-12 06:34:10 · 248 阅读 · 0 评论 -
Java String "=="与"equals"区别
String 类--|一旦声明,就不可以改变;--|两种赋值方式--|Java的共享机制模式的一种运用"=="与"equals"区别:前者是数值比较,比较的是内存地址的值是否相等后着,则是内容的比较;匿名对象 new Person().shout();用法:如果对象只需要进行一次调用;或者是将对象作为实参传递个一函数调用String s= "liuwei"; 一个字符串就是一个匿名String对象...原创 2018-07-01 06:34:13 · 161 阅读 · 0 评论 -
Java 基类的非静态privite 变量
Java 基类的privite 变量(非静态),子类不可以直接使用,但可以通过基类的 public 方法间接使用。这时多个子类将每个子类单独有一个基类的privite 变量。且互不影响。...原创 2018-06-26 07:17:57 · 202 阅读 · 0 评论