J2SE
官小飞
hello everybody,hello everyone。
展开
-
35 个 Java 代码性能优化总结
前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑 的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上 线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考原创 2018-01-04 09:35:46 · 646 阅读 · 1 评论 -
Java8初体验(二)Stream语法详解
1. Stream初体验我们先来看看Java里面是怎么定义Stream的:A sequence of elements supporting sequential and parallel aggregate operations.我们来解读一下上面的那句话:Stream是元素的集合,这点让Stream看起来用些类似Iterator;可以支持顺序和并行的对原原创 2017-03-24 09:39:32 · 418 阅读 · 0 评论 -
eclipse运行java.lang.OutOfMemoryError: PermGen space解决方法
一、在window下eclipse里面Server挂的是tomcat6,一开始还是以为,tomcat配置的问题,后面发现,配置了tomcat里面的catalina.bat文件,加入 set JAVA_OPTS=-Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=108m -XX:MaxPermSize=512m ,eclipse跑起来还是原创 2016-09-06 15:33:18 · 705 阅读 · 0 评论 -
java解析和读取JSON
1.JSON介绍 JSON比XML简单,主要体现在传输相同信息的情况下,文件的大小不同。 JSON只用于传输信息,XML还可以用于配置文件的使用。 JSON中的符号主要有: " , [ {:2.JSON中的数组和对象 2.1数组(JSONArray) 数组用一对[],表示存放的是一般的数组数据。 如:["11","22","33"原创 2015-12-25 16:53:08 · 2390 阅读 · 0 评论 -
Java中对文件的解压缩
需要用到的jar包: apache-ant-1.9.3.jar 下载地址:http://ant.apache.org/bindownload.cgi压缩方法[java] view plaincopyprint?/** * @desc 将源文件/文件夹生成指定格式的压缩文件,格式zip * @param re原创 2015-12-25 15:21:16 · 366 阅读 · 0 评论 -
java基础之枚举用法
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法。package com.ljq.test;/** * 枚举用法 *原创 2015-12-25 15:18:19 · 369 阅读 · 0 评论 -
java中读取文件的方法
1、按字节读取文件内容2、按字符读取文件内容3、按行读取文件内容4、随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。 */ public static void readFileByBytes(String fileN原创 2015-12-24 15:17:19 · 295 阅读 · 0 评论 -
Java基础创建文件及目录
创建文件和目录的关键技术点如下: 1、File类的createNewFile根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败 2、File类的mkdir方法根据抽象路径创建目录 3、File类的mkdirs方法根据抽象路径创建目录,包括创建必需但不存在的父目录 4、File类的createTempFile方法创建临时文件,可以制定临时文件原创 2015-12-24 15:10:25 · 359 阅读 · 0 评论 -
JVM虚拟机和类加载机制
类加载器深入剖析Java虚拟机与程序的生命周期1) 执行了System.exit()方法2) 程序正常执行结束3) 程序在执行过程中遇到了异常或错误而异常终止4) 由于操作系统出现错误而导致java虚拟机进程终止类的加载、连接与初始化加载:查找并加载类的二进制数据连接 1) 验证:确保被加载的类的正确性原创 2015-12-24 13:42:19 · 530 阅读 · 0 评论 -
java之反射技术应用(二)
在上篇中就对java反射机制做了一个详尽的介绍,相信你对反射也应该有一些了解,这时候你可能会问,那反射究竟在我们日常开发中都会用在什么地方呢,特别是一些初级人员更不禁要问,怎么我们平常好像不用反射也能够开发。在这里要纠正一点,其实只要你在用框架做开发,那么你时时刻刻都在反射打交道,如果没有反射,根本就不会有所谓的框架,至于具体细节,我们这里埋一个伏笔,后面将会做些介绍。原创 2015-12-24 11:39:13 · 611 阅读 · 0 评论 -
java之反射技术(一)
什么叫JAVA反射技术(Reflection)?谈到反射,我们首先了解下动态语言。“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。原创 2015-12-24 11:37:12 · 495 阅读 · 0 评论 -
Java8初体验(一)lambda表达式语法
本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘。因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化。本文是该系列的第一篇,主要介绍Java8对屌丝码农最有吸引力的一个特性—lambda表达式。java8的安装工欲善其器必先利其器,首先安装JDK8。过程省略,大家应该都可以自己搞定。但是有一点这里强调一下(Wi原创 2017-03-24 09:37:26 · 342 阅读 · 0 评论 -
Java 8的新特性
1.简介毫无疑问,Java 8是自Java 5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器、类库、开发工具和JVM(Java虚拟机)。在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景。本教程由下面几部分组成,它们分别涉及到Java平台某一特定方面的内容:语言编译器类库开发工具运行时(Java虚拟机原创 2017-03-24 09:47:27 · 417 阅读 · 0 评论 -
Java NIO系列教程(一) Java NIO 概述 Channel
Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。原创 2017-03-24 10:27:36 · 267 阅读 · 0 评论 -
Java8:Lambdas(二)学习怎样去使用lambda表达式
Java SE 8的发布很快就到了。伴随着它来的不仅仅是新的语言lambda表达式(同样被称为闭包或匿名方法)——伴随着一些语言特性支持——更重要的是API和library的增强将会使传统的Java核心libraries变的更易于使用。其中大多数的增强和补充是在Collections API中,因为Collections API在整个应用中随处可见,这篇文章大部分是在讨论它。然而 ,很有可原创 2017-03-27 10:48:26 · 489 阅读 · 0 评论 -
Java8:Lambdas(一) 学习lambda表达式
了解Java8 中的lambda表达式对开发人员来说没有什么比自己选择的语言或平台发布新版本更令人激动了。Java开发者也不例外。实际上,我们更期待新版本的发布,有一部分原因是因为在不久前我们还在考虑Java的前途,因为Java的创造者——Sun在衰落。一次与死亡的擦肩而过会使人更加珍惜生命。但在这种情况下,我们的热情来源不像以前发布版本时那样,这次是来源于事实。Java 8最终会获得一些原创 2017-03-27 10:45:27 · 1310 阅读 · 0 评论 -
Java NIO系列教程(八) Pipe
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。这里是Pipe原理的图示:创建管道通过Pipe.open()方法打开管道。例如:1Pipe pipe = Pipe.open();向管道原创 2017-03-27 09:56:45 · 346 阅读 · 0 评论 -
Java NIO系列教程(七) Java NIO DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。打开 DatagramChannel下面是 DatagramChannel 的打开方式:1DatagramChannel channel = DatagramChan原创 2017-03-27 09:51:40 · 445 阅读 · 0 评论 -
Java NIO系列教程(六) SocketChannel和 ServerSocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。打开 SocketChannel下面是SocketChannel的打开方式:原创 2017-03-27 09:44:50 · 482 阅读 · 0 评论 -
Java NIO系列教程(五) FileChannel
Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。打开FileChannel在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAcc原创 2017-03-27 09:39:01 · 415 阅读 · 0 评论 -
Java NIO系列教程(四) Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。为什么使用Selector?仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开原创 2017-03-27 09:36:00 · 291 阅读 · 0 评论 -
Java NIO系列教程(三) Scatter/Gather 通道之间的数据传输
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(ga原创 2017-03-27 09:32:09 · 729 阅读 · 0 评论 -
Java NIO系列教程(二) Buffer
Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。Buffer的基本用法使用Buffer读写数据一般遵循以下四个步骤:写入数据到Buffer调用f原创 2017-03-24 10:30:37 · 288 阅读 · 0 评论 -
jdbc中的反射
使用JDBC时,我们都会很自然得使用下列语句:[java] view plaincopyClass.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding原创 2015-12-24 11:09:15 · 810 阅读 · 0 评论 -
Java中如何区别抽象类和接口
抽象类:1.含有abstract修饰符的class 即为抽象类,2.abstract类不能创建实例对象,3.含有abstract的方法的类必须定义为abstract class ,4.abstract class 里的方法不必是抽象的,5.抽象来中定义抽象方法必须放在具体子类中实现,所以,不能有抽象的构造方法或抽象的静态方法,如果子类没有实现抽象父类中的所有原创 2015-12-24 10:49:30 · 356 阅读 · 0 评论 -
Java线程篇(十一):Fork/Join-Java并行计算框架
并行计算在处处都有大数据的今天已经不是一个新鲜的词汇了,现在已经有单机多核甚至多机集群并行计算,注意,这里说的是并行,而不是并发。严格的将,并行是指系统内有多个任务同时执行,而并发是指系统内有多个任务同时存在,不同的任务按时间分片的方式切换执行,由于切换的时间很短,给人的感觉好像是在同时执行。 Java在JDK7之后加入了并行计算的框架Fork/Join,可以解决我们系统中大数据计算的性能问题原创 2015-12-28 10:57:15 · 704 阅读 · 0 评论 -
Java线程篇(十):Compare And Swap
前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。[java] view plaincopyprint?public fin原创 2015-12-28 10:56:01 · 4159 阅读 · 0 评论 -
Java线程篇(九):Condition-线程通信更高效的方式
接近一周没更新《Java线程》专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。 那么引入本篇的主角,Condition,Con原创 2015-12-28 10:54:48 · 516 阅读 · 0 评论 -
Java线程篇(八):锁对象Lock-同步问题完美解决
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:[java] view plaincopyprint?原创 2015-12-28 10:35:34 · 715 阅读 · 0 评论 -
Java线程篇(七):Callable和Future
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行原创 2015-12-28 10:33:58 · 419 阅读 · 0 评论 -
Java线程篇(六):线程池
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。 我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那原创 2015-12-28 10:30:54 · 330 阅读 · 0 评论 -
Java线程篇(五):Timer和TimerTask
Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。 Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。原创 2015-12-28 10:28:55 · 373 阅读 · 0 评论 -
Java线程篇(四):线程的中断、让步、睡眠、合并
最近在Review线程专栏,修改了诸多之前描述不够严谨的地方,凡是带有Review标记的文章都是修改过了。本篇文章是插进来的,因为原来没有写,现在来看传统线程描述的不太完整,所以就补上了。理解了线程同步和线程通信之后,再来看本文的知识点就会简单的多了,本文是做为传统线程知识点的一个补充。有人会问:JDK5之后有了更完善的处理多线程问题的类(并发包),我们还需要去了解传统线程吗?答:需要。在实际开发原创 2015-12-28 10:21:29 · 450 阅读 · 0 评论 -
Java线程篇(三):线程协作:生产者与消费者问题
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加原创 2015-12-28 10:18:07 · 402 阅读 · 0 评论 -
Java线程篇(二):线程同步(synchronized和volatile)
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出。 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性。多个线程之间是原创 2015-12-28 10:15:35 · 379 阅读 · 0 评论 -
Java线程外篇:阻塞队列BlockingQueue
好久没有写文章了,这段时间事情比较杂,工作也比较杂乱,上周日刚搬完家,从自建房搬到了楼房,提升了一层生活品质,哈哈!不过昨天晚上在公交车上钱包被偷了,前段时间还丢个自行车,不得不感叹,京城扒手真多,还无人处理。言归正传,这一段时间我的工作主要是改进公司的调度器,调度器调度线程池执行任务,生产者生产任务,消费者消费任务,那么这时就需要一个任务队列,生产者向队列里插入任务,消费者从队列里提取任务执行,原创 2015-12-28 11:05:16 · 445 阅读 · 0 评论 -
Java线程外篇:线程本地变量ThreadLocal
首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如Hibernate中的OpenSessionInView,就是使用ThreadLocal保存Session对象,还有我们经常用ThreadLocal存放Connection,代码如:[java] view pla原创 2015-12-28 11:07:08 · 438 阅读 · 0 评论 -
java中对日期的处理
日期和时间模式[java] view plaincopyprint? // 格式:年-月-日 小时:分钟:秒 public static final String FORMAT_ONE = "yyyy-MM-dd HH:mm:ss"; // 格式:年-月-日 小时:分钟 public static fin原创 2015-12-24 10:44:21 · 403 阅读 · 0 评论 -
Java程序员必须掌握的8大排序算法
本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系:1, 直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2)实例(3)用java实现原创 2015-12-28 15:29:36 · 408 阅读 · 0 评论 -
Java基础之强引用、弱引用、软引用、虚引用
1、强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:[java] view plaincopyprint?Object o = new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿原创 2015-12-28 15:24:56 · 292 阅读 · 0 评论