随笔分类 - Java SE
摘要:一、前言 相信大家在使用gpp的时候都会遇到这样子都情况: 忘记密码 想要定时更换密码,保证安全 此时不用担心,gpg 的密码更新特别简单。 二、步骤说明 1> 执行命令获 gpg2 --list-keys 取对应key-id 2> 执行命令进 gpg2 --edit-key ${you key i
阅读全文
摘要:一、前言 最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始化。既然有这个产出后,肯定是希望能够上传到maven中央仓库,给更多的人使用,于是就产生了这次项目发
阅读全文
摘要:在前面的博文《小学徒成长系列—String关键源码解析》和《小学徒进阶系列—JVM对String的处理》中,我们讲到了关于String的常用方法以及JVM对字符串常量String的处理。但是在Java中,关于字符串操作的类还有两个,它们分别是StringBuilder和StringBuffer。我们先来就讲解一下String类和StringBuilder、StringBuffer的联系吧。String、StringBuilder、StringBuffer的异同点结合之前写的博文,我们对这三个常用的类的异同点进行分析:异:1>String的对象是不可变的;而StringBuilder和St
阅读全文
摘要:Java1.Java基础类型总结2.Java数组及其内存分配3. String, StringBuilder, StringBuffer类型的总结 1)Java对象创建方式及JVM对字符串处理 2)小学徒成长系列—String关键源码解析 3)小学徒进阶系列—JVM对String的处理 4) 小学徒成长系列—StringBuilder & StringBuffer关键源码解析4.线程 1)小学徒成长系列—线程 2)小学徒成长系列—线程同步、死锁、线程池 3)小学徒进阶系列—揭开ThreadPoolExecutor神秘的面纱5. Java内存回收机制 1)对象与内存管理 2)Java的内
阅读全文
摘要:最近一直在总结反思自己, 趁着现在请假在学校上课的空余时间,从基础开始重新温故学习下Java,充实下自己。一、数据类型从下图中,我们可以很清晰的看出Java中的类型,其中红色方框中的是Java的4种基本数据类型:下面我们来详细讲解上图中的基本类型:1.整数类型 1) 在Java中,整数类型共有4...
阅读全文
摘要:其实每次重装Ubuntu系统的时候都要进行一次基本到环境配置,而且每次总会忘记一些环境配置到东西,所以就写下这个博文,方便自己以后重装系统的时候回顾,同时也给大家做为重装系统后基本环境搭建的参考。因为本人系统是64位的,所以下文都是以64位位例子,32位的只要下载32位相应的安装包执行同样步骤安装即可,在参考的时候,注意将安装包名字替换成你的哦一、基本环境的介绍1.系 统:Ubuntu12.04 LTS x642.下载地址:http://www.ubuntu.org.cn/download3.基本原因: 1)具体看大家的需求 2) 一般不用最新的系统,因为我们开发需要的是稳定性,最新到系...
阅读全文
摘要:根据java官网文档的描述,String类代表字符串,是常量,他们的值在创建之后是不可变的,究竟String类型是怎么实现这些的呢?final关键字在探讨String类型的原理之前,我们应该先弄清楚关于final关键字的使用:1> 如果final修饰的是类的话,那么这个类是不能被继承的2> 如果final修饰的是方法的话,那么这个方法是不能被重写的3> 如果final修饰的是变量的话,那么这个变量的值在运行期间是不能被修改的当然,关于具体的赋值等操作,可以参考《对象与内存管理》中的最后一点,这里就不再重复了。String类与final的不解之缘现在,我们开始探讨String类
阅读全文
摘要:对于String类型,java官网的文档是这样子描述的: String类代表着字符串。java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。 字符串是常量,他们的值在创建之后不能更改。因为 String 对象是不可变的,所以可以共享。 那么,jvm是怎么共享这些字符串的呢? 为了节省内存,提高资源的复用,jvm引入了常量池这个概念,它属于方法区的一部分的,作用之一就是存放编译期间生产的各种字面量和符号引用。而从前面的博文《深入了解JVM—内存区域》我们可以知道,方法区的垃圾回收行为是比较少出现的,该区中的对象基本不会被回收,可以理解成是永久存在的。 因此,缓
阅读全文
摘要:前提摘要:本文是基于jdk1.7的,在分析ThreadPoolExecutor代码的过程中百度时发现1.6和1.7的实现还是有一定的区别的而且还挺大的,个人感觉1.6比较简单好理解。 为了方便大家阅读理解,我把说明以注释的形式嵌入到了代码中。 关于线程池,它不仅有效的复用了对象,更有效的复用了线程,减少了线程创建,销毁,恢复等状态切换的开销,提高了程序的性能。但是,究竟线程池是怎么复用对象的呢?它又是怎样去复用线程减少开销的呢?下面我们来一一揭开,ThreadPoolExecutor神秘的面纱。 1.基本变量和方法 为了能够更好的进行分析,我们先来做一些热身活动,了解下线程池的几个重...
阅读全文
摘要:在前一篇博文《小学徒的成长系列—线程》中,我们已经讲解了关于线程的基本概念及其常用的方法,现在在本次博文中,我们就讲解关于守护线程,同步,及线程池的知识吧。 1.守护线程(后台线程) 在Java中,线程定义有两种: 1> 非守护线程(有些教学书籍喜欢叫做非后台线程) 2> 守护线程(有些教学书籍喜欢叫做后台线程),下面是摘自《Java编程思想》的说法: 所谓后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分,因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。反过来说,只要有任何非后台线程还在运行,程序就
阅读全文
摘要:现在很多面向对象语言中都有了操作线程这个重要的功能,线程能够使复杂的一部代码变得更简单,大大的降低了复杂系统的开发,随着现在处理器数量的发展,充分的利用线程,就能够更好的发挥多处理器系统的强大能力。1.基本概念 1.1线程和进程的关系 在刚开始的时候,操作系统(OS)为了使多个程序能并发执行,从而提高资源利用率和系统吞吐量,从而提出了进程,后来为了减少时空的开销,提高并发性和CPU的利用率,就提出了线程这个概念。 在OS中,其实线程包含于进程内的,一个程序只有一个进程,但是却可以有很多的线程,如图: 从图中,我们也可以很好的知道,进程是操作系统中资源分配的基本单位,而线程只拥有...
阅读全文
摘要:在前面的几篇博文中,我们一起简单的了解jvm的基本知识,例如jvm对字符串的处理等等,或许大家看完后就把这当成一条准则来记住了,但是一些比较好奇的朋友有没有想过,这是为什么呢?他的原理是什么呢?下面就让我们开始一步一步的深入学习。 在这篇博文中呢,我打算主要就讲Java内存区域与内存溢出异常吧。下面言归正传吧。1.Java虚拟机运行时数据区 在前面的几篇博文中,我们只是简单的把内存区域分为了堆和栈,但其实,这种分法是十分粗糙的,jvm在实际运行的时候,内存区域的划分绝对不是那么简简单单的就两块,我们一起看下面这个图就知道了。从上图我们知道了,JVM虚拟机运行时数据区主要划分为:方法区、...
阅读全文
摘要:在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存。因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有限的内存的程序。1.Java在内存中的状态首先我们先写一个代码为例子:Person.java 1 package test; 2 3 import java.io.Serializable; 4 5 public cla...
阅读全文
摘要:1.Java程序中创建对象的5种常见方式 在讲Jvm对字符串的处理之前,我们先来讲一下,在Java中,最常见的5种创建对象的方式:1)通过关键字new调用构造器创建Java对象,eg :String str = new String("hello");2)通过Class对象的newInstance()方法调用构造器创建Java对象,eg : Class.forName("com.mysql.jdbc.Driver").newInstance();3)通过Java的反序列化机制从IO流中恢复Java对象,eg : 1 package test; 2 3 i
阅读全文
摘要:1.实例变量和类变量的内存分配类变量 :使用static修饰的成员变量是类变量,属于该类本身实例变量:没有使用static修饰的成员变量是实例变量,属于该类的实例由于同一个JVM内每个类只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间。对于实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间,所以,程序中有几个实例,实例变量就需要几块内存空间。2.类变量的初始化时机总是处于实例变量的初始化之前我们先看下下面三段代码:1)因为两个实例变量都是在创建变量的时候才开始分配空间,此时num2还没有分配,所以前向引用就会出现编译错误。1 int num ...
阅读全文
摘要:几乎所有的程序设计语言都支持数组。Java也不例外。当我们需要多个类型相同的变量的时候,就考虑定义一个数组。在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。1.数组的初始化方式及其内存分配对于Java数组的初始化,有以下两种方式,这也是面试中经常考到的经典题目:静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度,如:1 //只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为42 String[] computers = {"Dell&
阅读全文