标签归档:Java

Java垃圾回收机制详解

对于Java垃圾回收机制这个问题,一直是Java招聘面试津津乐道的一个问题之一。就好像答不上此问题就证明你不够NX一样。在此将这个问题做一下整理,以备后人方便。

Java语言中一个显着的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制, Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 继续阅读

Java模拟Http访问

Java模拟Http访问将返回的JSON解析为Bean对象

应用场景:某系统访问另一个系统获取一些数据,其中这些返回数据类型必须是JSON格式,接受系统可以将结果转换为简单的Bean对象,也可以将返回的是集合数据转换成List。这就需要我们模拟一个Http访问,然后处理返回的JSON数据。

方案选型:看了看网上的很多Demo,都是比较老的。其中应用的apache的框架现在也已经找不到了。所以决定亲自去apache官网去看看。发现以前的httpclient包已经独立出来命名为Apache HttpComponents。当前最新包为4.3.3。我采用的是OSChinaMaven源,还不错,已经有资源了。而JSON解析才用了最为流行的Jackson

Demo示例:

Test.java 返回的JSON数据将要被解析成为的对象类 继续阅读

Annotation与SpEL实现系统记录操作日志

先说几句废话吧。最近工作比较混乱,一遍研究着Hadoop,一遍搞着另外一个系统的开发。这段时间,一心想写点技术文章却迟迟没能提笔。今天终于,打开音乐播放器,戴上耳机。享受着宁静的夜晚与指尖跃起的文字。甚至于还想着,什么时候才能有合适的机会回到山东,守在爸妈身边。好了,废话不多说了,开始记录正文。

需求:

系统中的一个模块属于关键区,它所有的操作主要针对修改与删除是要求记录下日志来的。而这个记录的日志并不是像我们把它们打印在log文件里,而是需要标准的记录到数据库中。以便于后来专门日志操作模块的查询。

思考: 继续阅读

了解一下JMS

1. JMS基本概念

(1)JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。(2)Java消息服务(Java Message ServiceJMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 

2. JMS基本功能

JMS是用于和面向消息的中间件相互通信的应用程序接口。它既支持点对点(point-to-point)的域,又支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。Java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。

Java消息服务支持同步和异步的消息处理,在某些场景下,异步消息是必要的;在其他场景下,异步消息比同步消息操作更加便利。

Java消息服务支持面向事件的方法接收消息,事件驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例,程序员们都相当熟悉。 继续阅读

Java实现按位截取字符串

好久没有写点什么了。原因很简单,忙!近三个月几乎天天加班,基本没有消停过。工作的强度很大,但是没有压力;可是生活的强度并不大,却充斥的满满的。不想开篇就是牢骚满腹,但毕业生被作为廉价劳动力的滋味并不是很好受。今年我终于不再是应届毕业生了,话说我可以作为一个社会招聘去跳槽了吧?
今天要说的一个例子也是我在网上没有找到,而费了很长时间自己解决的。
 例子:
一个字符串:”12345ABC陈陈陈陈12″
使用Java中substring(5,10) = “ABC陈陈” 。而substring(10,12) = “陈陈”,并且它是从第2个陈开始截取的。如果我用substring(5,16),应该会报错的。因为它是按照字符去截取的。但是,我不能按照字符去截取,我需要按照字节来。也就是说我期望的结果是:substring(5,10) = “ABC陈” substring(10,12) = “陈” 而它应该是从第一个陈开始截取的。substring(5,16) = “ABC陈陈陈陈”,似乎Java的方法中没有实现我这个需求的。
所以我只能自己想办法截取它。
 需求:
一个长长的字符串,我要根据定义文件中的每个字段的位数去从头开始截取他们,然后一个个的赋值到字段中去。
思路:
从头开始截取,截完一段后,改变原字符串(即去掉截掉的部分)。然后对待上述文件中的全角字符的时候循环截取,直到截取到定义的长度为止。

继续阅读

递归查询森林结构所有子节点

近期工作上遇到了这样一个需求,一张表用来存储树形结构的父节点和叶子节点,大体是这样定义的。

Table定义如下:

id groupid nodeid other
1 A001 A0001 ~~
2 B001 B0001 ~~
3 A0001 A00001 ~~
4 C001 C0001 ~~
5 C001 C0002 ~~

需求很简单:这张表表示的是一个数结构,其中groupid代表的是父节点,而nodeid代表的是相应的子节点,我们想要的是整个树结构的全部叶子节点。当然涉及到多棵树,就组成了森林结构,也就是查找指定森林结构的所有叶子节点。

思路也很Easy:遍历每一颗树,利用写好的递归查询函数去查询每棵树的最终叶子结点,然后把它们保存到静态list中。

详细代码如下: 继续阅读

The Java™ Programming Language SL-275 Student Workbook Answer

Object-Oriented Programming Test

这是一个关于银行(Banking)的Java练习题,很多时候用来作为Java入门的教材。我看了看确实不错,从最简单的Activity慢慢的演变,一直到最后都贯穿了整个Java的知识点。

但是在我寻求答案的时候并没有顺利的找到这个联系的答案,所以我特别上传了一下,以方便别人来索引。

答案下载:

SL275LABwithANSWER

如果下载有错误,请及时联系我:me[at]chenzhiguo.cn

Java模拟标准双色球

近期一直在复习Java基础知识,确实不仅补缺查漏,还能增强记忆。同事提了个需求想要模拟一下双色球的输出,顺便练习一下刚学的Collection类。反正闲的没事,就决定练习一下。

一开始我想用Set最为简便,因为其自身值的唯一性,可以很好地去除随机值重复的问题。所以,一会儿就用Set写了下面这个版本。

 

继续阅读

最新S2SH框架基于Annotation的整合开发(原作)

因为自己学习的时候,资料过旧,困难重重。所以再足以单独开发后,写出来让后来人学习能够轻松点。
S2SH(Struts2+Spring+Hibernate)框架是当今最流行的Java企业级开发框架搭配方案之一。S2SH是SSH的升级版本,2代指的是Struts2,而SSH中用的是Struts1。众所周知,Struts1已经在逐渐退出舞台。而Struts2也就是Webwork的衍化版本,正在如火如荼的盛行着。
其实网上这方面资料也不算少,但是都知道现在技术发展的太快,旧的资料已经很难解决我们的当前问题,要问我写的这些有多新?我学习S2SH框架是在2011年8月分暑假期间,这篇文章写于2011年8月15日星期一。
我所采用的是当前位置,各大官网发布的最新框架。Struts2.2.3,Spring2.5.6和Hibernate3.6.6Final。
首先我们需要准备什么?
MyEclipse for Spring 8.6或者更新
Struts2.2.3包或者更新
Spring2.5.6包或者更新
Hibernate3.6.6包或者更新
继续阅读

Java贪吃蛇(穿身穿墙宝物)源码

这几天学校内实训,搞什么贪吃蛇游戏。对于GUI编程我表示很无语,没办法,也得照做!
其实基本功能的源码并非我写出来的,只是在前人的基础上做了二次开发,增加了学校要求的实现吃宝物然后可以借助宝物实现“穿墙”,”穿身”的功能。
闲话少说,代码如下:

import javax.swing.JFrame;

public class SnakeGame {
public static void main(String[] args) {
SnakeFrame frame = new SnakeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle(“贪吃蛇游戏—实训项目”);
frame.setVisible(true);
}
}

//======第二个Java文件============
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
继续阅读