![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaSE
文章平均质量分 81
奔跑在梦想的道路上
用思想影响人类,用技术改变世界。
展开
-
探秘Java类加载
Java是一门面向对象的编程语言。面向对象以抽象为基础,有封装、继承、多态三大特性。宇宙万物,经过抽象,均可归入相应的种类。不同种类之间,有着相对井然的分别。Java中的类,便是基于现实世界中的类别抽象出来的。类本身表示一类事物,是对这类事物共性的抽象与封装。类封装了一类事物的属性和方法。类与类之间,有着不同的层级。以生物界中的分类为例,遵循“界门纲目科属种”的级别体系,人...原创 2019-01-04 09:05:13 · 416 阅读 · 0 评论 -
Java的Timer定时器
Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证。 上面提到了守护线程的概念。 Java分为两种线程:用户线程和守护线程。 所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程...原创 2019-01-02 08:49:31 · 12776 阅读 · 0 评论 -
Java的BIO,NIO与AIO
Java中的IO操作可谓常见。在Java的IO体系中,常有些名词容易让人困惑不解。为此,先通俗地介绍下这些名词。 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 我们先来弄明白什么是同步,异步,阻塞,非阻塞,只有这几个概念理解...原创 2019-01-01 09:35:14 · 1429 阅读 · 0 评论 -
Java常量池
一.相关知识 1.何为常量 第一种常量:是一个值,我们将这个值本身称为常量。比如:整型常量:1024实型常量:1.024字符常量:'g' 'c' 'w'字符串常量:"gcw"逻辑常量:true false 例如,我们可以将数字1024称为一个int类型的常量。 第二种常量:不可变的变量,我们也称为常量。被关键字final修饰的变量,其值就不可以改变。可能...原创 2019-01-01 09:34:55 · 236 阅读 · 0 评论 -
Java中的值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。 基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的空间里。 Java的内存空间主要包括5部分:栈区,堆区,静态变...原创 2019-01-01 09:34:39 · 287 阅读 · 0 评论 -
面向对象三大特征及代码优化七大原则
面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 一.面向对象的三大基本特性 1.封装 封装,就是把客观事物封装成抽象的类,并且...原创 2019-01-01 09:34:23 · 636 阅读 · 1 评论 -
Java并发编程的4个同步辅助类
我在《JDK1.5引入的concurrent并发包》中,曾经介绍过CountDownLatch、CyclicBarrier两个类,还给出了CountDownLatch的演示案例。这里再系统总结下Java并发编程中的4个类CountDownLatch、CyclicBarrier、Semaphore、Phaser。 1.CountDownLatch CountDownLatch可以理解...原创 2019-01-01 09:34:09 · 277 阅读 · 0 评论 -
JDK8的新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 应该说,相对于Java7,Java8 新增了很多特性,我们主要讨论以下几个: 1.Lambda表达式。 Lambda 表达...原创 2019-01-01 09:33:07 · 820 阅读 · 0 评论 -
JDK1.5引入的concurrent并发包
并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术。但是多线程又存在资源竞争的问题,引发了同步和互斥,并带来线程安全的问题。于是,从jdk1.5开始,引入了concurrent包来解决这些问题。 java.util.concurrent 包是专为 Java并发编程而设计的包。在Java中,当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将...原创 2019-01-01 09:32:28 · 573 阅读 · 0 评论 -
Java集合里的一些“坑”
这里主要谈下Java集合在使用中容易被忽略、又容易出现的两个“坑”,一个是集合与数组互相转换,另一个是集合遍历删除。主要通过代码演示。 一.集合与数组互相转换中的“坑” //Test1.javapackage com.itszt.test0419;import java.util.ArrayList;import java.util.Arrays;import java...原创 2018-12-31 08:37:24 · 173 阅读 · 0 评论 -
算法之素数
素数(prime number)又称质数,有无限多个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。接下来通过代码判断一个自然数是否素数:package com.itszt.test8;/** * 素数 */public class Test5 { public static void main(String[] args) { judg...原创 2018-12-21 08:42:38 · 127 阅读 · 0 评论 -
算法之水仙花数
水仙花数(Narcissistic number)是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。例如:1^3 + 5^3+ 3^3 = 153。 接下来通过代码求100-999之间的水仙花数。 package com.itszt.test8;/** * 水仙花数 */public class Test4 { public static void main(...原创 2018-12-21 08:42:00 · 250 阅读 · 0 评论 -
深入理解ThreadLocal
JDK 1.2的版本中就提供了java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是专属于某个Thread的局部变量集。 上面提到“ThreadLocal为解决多线程程序的并发问题提供了一种新的思路”,那么,我们就先来看下多线程并发...原创 2019-01-02 08:49:42 · 124 阅读 · 0 评论 -
JVM内存分配及GC详述
在阐述JVM的内存区域之前,先来看下计算机的存储单位。从小到大依次为Bit,Byte,KB,MB,GB,TB。相邻的单位相差2的10次方。 计算机运行中的存储元件主要分为寄存器(位于CPU)和内存,寄存器和内存之间通过地址总线连接。地址总线的宽度影响了物理地址的索引范围,因为总线宽度决定了处理器一次可以从寄存器或内存中获取多少个Bit,同时也决定了处理器最大可以寻址的地址空间。 这...原创 2019-01-02 08:49:54 · 1117 阅读 · 0 评论 -
用Executors工具类创建线程池
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。另外,通过适当地调整线程池中的线程数目可...原创 2019-01-03 08:55:58 · 470 阅读 · 0 评论 -
Java中的BlockingQueue队列
BlockingQueue位于JDK5新增的concurrent包中,它很好地解决了多线程中,如何高效安全地“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。 阻塞队列,顾名思义,它首先它是一个队列,在数据结构中,队列是一种线性表。 我们通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出。常用的队列主要有以下两种:...原创 2019-01-03 08:55:34 · 989 阅读 · 0 评论 -
Java集合概述
Java中的集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Value形式的键值对。 Collection中最常用的又分为两种类型的接口:List和Set,两者最明显的差别为List支持放入重复的元素,而Set不支持。 List最常用的实现类有:ArrayList、LinkedList、Vector及St...原创 2018-12-24 22:07:41 · 127 阅读 · 0 评论 -
Java中的UDP应用
我在《JavaSE项目之聊天室swing版》中通过遵守TCP协议的ServerSocket与Socket实现了聊天室的群聊窗口。同时,在介绍OSI与TCP/IP参考模型时,也曾提及TCP与UDP(全称User Datagram Protocol,用户数据报协议)。总的来说,TCP与UDP的区别有:1.TCP与UDP的基本区别:(1)TCP基于连接,UDP基于无连接;(2)TCP要求...原创 2018-12-24 22:06:21 · 1431 阅读 · 0 评论 -
Java线程池
在Java中,多线程有着广泛运用。在实际应用中,好的软件设计不建议手动创建和销毁线程。线程的创建和销毁是非常耗 CPU 和内存资源的,因为这需要 JVM 和操作系统的参与。为此,我们在面临多线程问题时,通常会采用线程池。一般情况下,每个线程池会由这些模块组成:一个任务队列,一个工作线程的集合,一个线程工厂,管理线程状态的元数据。线程池可以解决两个问题:一是由于减少了每个任务调用的开销,它们通常...原创 2018-12-24 22:05:44 · 78 阅读 · 0 评论 -
Java定时器
在Java多线程中,有的时候,我们需要按照指定间隔时间来执行一些任务,这时,我们就要用到定时器。我们在这里以Java中的Timer定时器为例,演示定时器的应用。package com.itszt.test;import java.util.Timer;import java.util.TimerTask;/** * Java定时器 */public class Test { ...原创 2018-12-24 22:05:10 · 117 阅读 · 0 评论 -
LinkedList演示栈和队列
在数据结构中,栈和队列是两种重要的线性数据结构。它们的主要不同在于:栈中存储的元素,是先进后出;队列中存储的元素是先进先出。我们接下来通过LinkedList集合来演示栈和队列的操作。import java.util.LinkedList;/** * 用LinkedList集合演示栈和队列操作 * * @author 李章勇 */public class Test1 { ...原创 2018-12-24 22:03:47 · 125 阅读 · 0 评论 -
Java注解中的元注解
Java注解中的四个元注解分别是:@Target,@Retention,@Documented,@Inherited。 元注解是java API提供的,是专门用来定义注解的注解,其作用分别如下: (1)@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括: ElemenetType.CONSTRUCTOR-------...原创 2019-01-03 08:54:30 · 357 阅读 · 0 评论 -
SAXParser解析XML文件
我在之前的一篇文《用dom4j操作xml文件》里曾介绍了XML文件,以及用dom4j操作xml文件。其实,java有个扩展包(javax.xml)里也提供了解析xml的方法。我接下来通过案例予以介绍。 首先,定义xml文件内的元素规则(user.xsd):<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w...原创 2019-01-02 08:51:16 · 493 阅读 · 0 评论 -
详述Java对象创建
Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(克隆、反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此。我们看一下在虚拟机层面上创建对象的步骤: (1)虚拟机遇到一条new指令,首先去检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有,那么必须先执行...原创 2019-01-02 08:51:05 · 135 阅读 · 0 评论 -
Java代码优化总结
代码优化是一个很重要的课题。一般来说,代码优化的目标主要有两个,一个是减小代码的体积,另一个是提高代码运行的效率。 代码优化的细节有很多,此处列举部分: 1、尽量指定类、方法的final修饰符。 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。 为类指定final修饰...原创 2019-01-02 08:50:50 · 207 阅读 · 0 评论 -
算法之斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。 斐波那契当时是为了描述如下情况的兔子生长数目: 第一个月初,有一对刚诞生的兔子 第二个月之后(第三个月初),它们可以生育 每月每对可生育的兔子会诞生下一对新兔子 兔子永不死去 可...原创 2018-12-21 08:41:20 · 207 阅读 · 0 评论 -
算法之汉诺塔
汉诺塔源于印度一个古老传说的益智玩具。相传大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。现在暂以3个圆盘为例,代码如下:package com.itszt.test8;/** * 汉诺塔 *...原创 2018-12-21 08:40:42 · 152 阅读 · 0 评论 -
算法之韩信点兵
已知:韩信点兵,不足百人,3人一行多一人,7人一行少两人,5人一行正好。请问韩信点的兵人数多少?代码实现如下:package com.itszt.test8;/** * 韩信点兵 * a total%3 1 * b total%7 5 * c total%5 0 * total {1,100} */public class Te...原创 2018-12-21 08:40:03 · 1436 阅读 · 0 评论 -
UUID工具类
在数据库中,一张数据表中的主键,通常会用自增的整型值或者UUID字符串来表示。其中,UUID可以产生全球唯一的标识符,从而确保主键的唯一。import java.util.UUID;/** * 工具类 */public class UUIDUtils { /** * 产生全球唯一的字符串 * @return */ public static String getU...原创 2018-12-28 08:35:07 · 573 阅读 · 0 评论 -
MD5加密
我们曾经介绍过RSA加解密,这是一种非对称的、可逆式加密规则。在实际使用中,还有一种不可逆的加密规则,即MD5加密,比如将敏感信息的密码MD5加密后存储到数据库。MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值...原创 2018-12-28 08:34:13 · 5427 阅读 · 1 评论 -
log4j日志
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条 日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。 在使用中,我们需要引入log4j的jar包依赖,并在项目源码的根路径下放置log4j.pr...原创 2018-12-27 10:29:53 · 88 阅读 · 0 评论 -
Java自定义注解
注解在Java开发中有着广泛的运用,合理地运用注解,可以使得程序变得更加简洁。举例来说,方法覆写时,我们会在覆写的方法上看到@Override的注解等。可以说,看到这些注解,我们就能快速对注解施加影响的类、方法、属性等有个清晰的认识。 那么,什么是注解呢? Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响...原创 2018-12-27 10:29:43 · 94 阅读 · 0 评论 -
Java单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行...原创 2018-12-27 10:29:27 · 3688 阅读 · 1 评论 -
日期、字符串及长整型之间的互相转换
我们在数据库中存储日期时间时,通常建议存储为长整型数字,既有利于数据优化,也有利于操作日期数据时的统一。这就需要用到日期、字符串即长整型数据之间的互相转换。我们接下来就解决这样的问题。 1.将长整型数字转换为日期格式的字符串 1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3...原创 2018-12-26 15:44:08 · 2241 阅读 · 2 评论 -
用dom4j操作xml文件
XML的全称是eXtensible Markup Language,即“可扩展标记语言”。XML文件的作用主要是数据存储,文件配置,数据传输。 html与xml的区别是:①html语法松散,xml语法严格;②html做页面展示,xml做数据存储;③html的所有标签都是预定义的,xml所有标签都是自定义的。xml文档中必须有且只能有一个根元素;元素需要正确闭合;元素需要正确嵌套;元素名称...原创 2018-12-26 15:43:22 · 298 阅读 · 0 评论 -
RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推...原创 2018-12-26 15:38:17 · 769 阅读 · 0 评论 -
线程通信之生产者消费者模型
线程通信,是指线程之间的消息传递。 多个线程在操作同一个资源时,它们对共享资源的操作动作可能不同;它们共享同一个资源,互为条件,相互依赖,相互通信,从而让任务向前推进。 另外,在线程的同步策略中,虽然可以解决并发更新同一个资源,保障资源的安全,但不能用来实现线程间的消息传递。因此,线程通信与线程同步往往会融合使用。 生产者消费者模型堪称是线程通信中的一个典型案例,我们接下来通...原创 2018-12-26 15:37:35 · 159 阅读 · 0 评论 -
深入理解Java线程池
零.引子 线程是程序运行中一个非常重要的概念。通常情况下,程序从静态代码,到解析为机器码被加载入内存开始动态运行,就转变为一个进程。也可以说,程序是一个静态概念,程序运行起来后就变成了一个进程,进程是计算机分配CPU、内存等各种资源的基本单位。 我们平时在电脑中开启一些程序时,比如开启eclipse,idea等开发工具时,会发现程序启动较慢,这是因为进程运行所依赖的资源较多,故开启...原创 2018-12-26 15:36:54 · 110 阅读 · 0 评论 -
集合与数组互转
一.集合转数组 以ArrayList集合为例,使用该集合的一个成员方法toArray(),可以将一个集合对象转化为一个数组。如下所示: 1 void listToArray(){2 List<String> list=new ArrayList<>();//创建一个集合对象3 list.add("a");//向集合对象里...原创 2018-12-26 15:36:14 · 3052 阅读 · 0 评论 -
Java线程池详解
为什么要用线程池呢? 一是减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务; 二是可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。 线程池的基本思想是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行...原创 2018-12-29 08:50:06 · 972 阅读 · 0 评论