Java学习之路
文章平均质量分 52
从民工到大神。
司青-已停止更新
本博客已停更;
展开
-
快速彻底理解字符集和字符集编码的区别
很多文章搞长篇大论大讲特讲人类为了让计算机能够准确表示各种字符的演化历史,这完全是没有必要的,几句话就能说明白。"字符集"和"字符集编码"是两回事字符集(Charset Set),仅仅是一套从【字符】到【数字】的映射字典,它只规定了应该用什么数字来标识字符,仅此而已,至于计算机在存储的时候应该用什么字节来标识,字符集是根本不管这事的。Unicode, GB2312, ASCII都属于字符集。字符集编码(Character Encoding),专门规定了字符集中的字符在计算机中应该如何存储,说白了就是怎原创 2021-11-07 18:35:10 · 529 阅读 · 0 评论 -
[Golang实现JVM第七篇]实现invokevirtual和虚方法表
本篇我们专注invokevirtual这一条指令,先通过简单粗暴的方式实现指令的功能,然后探究如何通过著名的虚方法表(Virtual Method Table)来进行一些优化。指令含义invokevirtual用于调用除静态方法、构造方法、私有方法、接口方法外的所有方法。其指令的格式为:invokevirtual = 182 (0xb6)Format:invokevirtual indexbyte1 indexbyte2Operand Stack:..., objectref, [arg1原创 2020-10-09 20:12:02 · 895 阅读 · 0 评论 -
业务系统如何正确实现防重名功能
常见但是错误的实现在业务系统中防重名是一个非常普遍的需求,例如用户注册时不允许用户名重复、已登录用户不可以在自己的账号范围内创建同名的某种实体等。很多人在实现的时候都是简单的先判断名字是否重复,如果没有则执行插入操作,如下: public void register(User user) { // 判断是否重复 (1) if (userMapper.sel...原创 2020-03-09 00:25:17 · 2261 阅读 · 1 评论 -
Java垃圾收集器(GC)简介与最佳组合探究
Java经过近20年的演变,已经发展出一套复杂、健壮和高性能的垃圾收集器。在不同的应用场合下使用不同的GC组合能让程序性能得到可观提高。我想这也是Java这么多年来一直处于不败之地的原因之一。以下讨论只限于Server模式下的HotSpot JVM。GC的类型Sun/Oracle的HotSpot JVM为我们提供了多种不同的GC,一种GC只专门负责新生代或老年代的内存回收工作,所以实际使用的时候需要原创 2015-04-18 02:47:26 · 3445 阅读 · 1 评论 -
Java: 使用信号量(Semaphore)保护多个共享资源的访问
信号量(semaphore)机制是一种常用的同步机制,在现代OS中被广泛采用。semaphore是一个非0值,当它的值大于0时表示系统目前还有足够的资源分配给请求线程,每分配出去一个资源,值递减。当值等于0时表示当前已无资源可分配。JDK提供了Semaphore类来实现信号量。假如我们一共有3台打印机可用,当前有N个线程都请求使用打印机,要实现对打印机这种资源的访问保护,有以下两种方式:每当一个线原创 2015-03-26 11:36:00 · 3013 阅读 · 0 评论 -
总结在使用JPA时需要注意的几点
在调用persist(entity)方法之前,一定要保证entity所有的非集合类成员都已经被正确地赋值。在@OneToMany关系中,如果要删除many端(主动端)的实体,必须先从one端(被动端)的集合类中移除该实体,然后再调用remove(entity)方法才能删除成功。在@OneToMany关系中,未设置级联删除的情况下,如果要删除one端(被动端)实体,则必须先删除one端集合类中所有原创 2015-03-09 15:13:07 · 2030 阅读 · 0 评论 -
Java如何扫描指定package下所有的类
在写一个MVC框架,需要从包中扫描出组件并注册到容器中,而JDK没有提供现成的从方法,只能自己实现。功能: 给定一个包名,编程得到该包(和其所有子包)下所有的类文件。如,输入包名com.myapp.util, 输出该包下类的全限定名com.myapp.util.StringUtils, com.app.util.ImageUtils等。思路: 有的web server在部署运行时会解压jar包,原创 2015-02-26 20:25:41 · 17200 阅读 · 1 评论 -
Java最大的优势真的在于跨平台吗?
以前是,但现在已经不是了。有跨平台需求的仅仅是客户端应用,而不是服务端。例如桌面应用,你的客户可能是Windows用户,也可能是Linux用户,这时候如果不想多投入成本对各个平台进行适配,那么Java所谓的”Write once, run everywhere”就显得异常光彩。然而今天,整个软件世界都在向B/S应用倾倒(嵌入式除外),即使要做客户端跨平台,QT等第三方框架远远比Swing更强大,Ja原创 2015-03-18 07:50:32 · 2365 阅读 · 0 评论 -
Java设计模式之观察者模式(Observer Pattern)
Observer Pattern 是一种常用的设计模式,它是一种事件监听模型,原创 2014-06-18 00:53:18 · 4332 阅读 · 0 评论 -
Java设计模式之适配器模式(Adapter Pattern)
Adapter Pattern的作用是在不改变功能的前提下转换接口。Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter。由于Class Adapter的实现需要用到多承继,而Java不支持多承继,所以这里只关注Object Adapter。在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enume原创 2014-06-17 03:39:40 · 3238 阅读 · 1 评论 -
equals()方法和hashCode()方法在HashMap中的应用
在Object类中定义了两个非常重要的方法:public boolean equals(Object obj)public int hashCode()如果我们要向HashMap中添加我们自己定义的类,那么对这两个方法的理解就显得至关重要了。有时候即便是经验丰富的Java开发者也会在这上面犯错误。下面我们就来讲解一下如何在HashMap中正确的使用这几个方法。来看下面一个例子原创 2014-03-25 12:50:34 · 3204 阅读 · 0 评论 -
10个有关Java异常的最常见问题
关于Java异常的10个最常见的疑问翻译 2014-03-24 15:09:20 · 1435 阅读 · 0 评论 -
在Java中用引号创建String对象和用构造函数的区别
创建一个String对象一般有以下两种方式:String str1 = "abcd";String str2 = new String("abcd");这两种方式有什么区别呢?我们可以通过下面两个小例子来说明.Example 1:String a = "abcd";String b = "abcd";System.out.println(a == b); /原创 2014-03-21 06:14:43 · 3702 阅读 · 3 评论 -
跳转(Forward)和页面重定向(Redirect)的区别
我们通过两个流程来看一下它们之间的区别。Redirect1. 用户浏览器向 http://localhost:8080/demo/start.xhtml 发送 GET 请求。2. JSF收到请求,返回 start.xhtml 页面。3. 用户点击页面中的按钮。4. JSF收到请求,向浏览器发送 Redirect 指令(3XX的HTTP状态值)。5. 浏览器收到指令,原创 2014-03-01 15:25:07 · 6632 阅读 · 0 评论 -
Seam的Conversation上下文
为了解决数据跨请求传递的问题,Seam为我们提供了 conversation 上下文。有了 conversation 以后,我们不需要再将需要跨越多个请求的数据都放到session里了,conversation是一个更好的解决方案。当然对话上下文也是从session中分配出来的,但是我们可以更好地控制组件的生命周期。在Seam中,任何一个请求到来时,都会启动一个对话,也就是说,对话上下文是seam原创 2014-03-01 15:10:55 · 1915 阅读 · 0 评论 -
JSF中Initial Request 和 Postback Request 的区别
首先来看JSF的生命周期图:一个完整的JSF Lifecycle 有以下流程:恢复视图(Restore View) --> 应用请求值(Apply Requests) --> 处理验证(Process Validations) --> 更新模型(Update Model Values) --> 调用应用程序(Invoke Apjplication) --> 渲染响应(Ren原创 2014-02-28 09:18:38 · 2522 阅读 · 0 评论 -
Arquillian测试框架快速上手教程(四)- 使用Arquillian + Drone + Selenium + Graphene 进行Web自动化测试
本系列教程共五篇,分别是:一、环境搭建、容器适配、单元测试二、JBoss Forge、ShrinkWarp快速指南三、使用 Arquillian 进行Java持久化测试四、使用 Arquillian + Drone + Selenium + Graphene 进行Web自动化测试五、使用 Arquillian 在云端进行测试本文所涉及到的内容有:1. Arqui原创 2014-02-24 07:14:48 · 4700 阅读 · 1 评论 -
Arquillian测试框架快速上手教程(三)- 使用 Arquillian 进行Java持久化测试
本系列教程共四篇,分别是:一、环境搭建、容器适配、单元测试二、JBoss Forge、ShinkWrap快速指南三、使用 Arquillian进行Java持久化测试四、使用Arquillian + Drone + Selenium 进行功能测试(UI测试或Web自动化测试)其中,Web容器以JBoss为例,工程以maven目录结构为准。添加JPA相关依赖这里我们原创 2014-02-24 04:12:13 · 4829 阅读 · 6 评论 -
Arquillian测试框架快速上手教程 (一) - 环境搭建、容器适配、单元测试
本系列教程共四篇,分别是:一、 环境搭建、容器适配、单元测试二、JBoss Forge、ShrinkWrap快速指南三、使用 Arquillian 进行Java持久化测试四、使用 Arquillian + Drone + Selenium 进行功能测试(UI测试或Web自动化测试)其中,Web容器以JBoss为例,工程以maven目录结构为准。Arquill原创 2014-02-23 13:40:41 · 16358 阅读 · 8 评论 -
JPA + Hibernate + PostgreSQL + Maven基本配置示例
JPA + Hibernate + PostgreSQL工程示例。注意 user 在 postgresql 中为保留关键字,所以如果你persist一个名为User的类的时候就会报语法错误。创建项目用JBoss Forge或maven archetype 或 eclipse创建一个maven项目,添加以下依赖: org.hibernate.javax.pe原创 2014-01-29 20:48:58 · 8663 阅读 · 1 评论 -
Java运行时的内存模型
参考下图:每个线程单独的数据区(线程间不共享)每个线程都有一片单独的内存区域,这里面包含:程序计数器(program counter register),JVM栈和本地方法栈(Native Method Stack)。当一个新的线程被创建的时候,这片内存就已经被分配出来了。程序计数器:为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各翻译 2013-12-28 05:18:11 · 2043 阅读 · 0 评论 -
Java中的null到底是啥?
我们从下面这个简单的语句说起:String x = null;这行代码做了什么?先回想一下什么叫做变量(variable),什么叫做值(value)。我们通常把一个变量比喻成一个盒子。我们可以用盒子来装东西,同样我们就可以用变量变保存值。定义变量时需要指定变量的类型。在Java中,有2种主要的数据类型:基本数据类型和引用类型。定义成基本数据类型的变量用来保存值,而定翻译 2013-12-28 04:48:30 · 2074 阅读 · 0 评论 -
JSF, MyFaces, RichFaces 和 Facelets的区别
初学JavaEE时很多东西都没理解,只是一股脑地往大脑里灌,现在是到明确一下的时候了。JSF(JavaServer Faces)JSF是一套用于构造基于组件的Web应用的界面的规范。需要着重强调的是,JSF是一套规范,即由人(JCP)规定好了这项技术应该包括哪些功能的一份说明,是抽象的概念。我们通常所讲的Web应用,指的是基于B/S架构的软件,通俗一点就是你打开浏览器看到的东西原创 2013-12-26 04:53:56 · 3258 阅读 · 1 评论 -
配置JBoss7数据源
JBoss7与JBoss5相比有了很大的变化,模块化加载的应用使得JBoss7的启动时间大大缩短,但同时也增加了数据源配置的复杂度(相比JBoss5来说).下面以PostgreSql为例说明一下Jboss7如果配置数据源.创建模块在Jboss下找到/modules/com目录,在这里你会发现有一个名为 "h2database" 的目录.这就是JBoss默认内置的数据源.我们照葫芦画原创 2013-12-06 11:58:54 · 2752 阅读 · 1 评论 -
如何重写hashCode()和equals()方法
hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法.如何重写equals()方法最安全如果你决定要重写equals()方法,那么你一定要明确这么做所带来的风险,并确保自己能写出一个健壮的equals()方法.一定要注意的一点是,在重写equals()后,一原创 2013-12-02 12:57:13 · 44412 阅读 · 29 评论 -
HashMap计数器的高效实现
原始的计数器在实际应用中,我们经常把HashMap作为一个计数器使用.例如统计一篇文章中单词 'the' 出现了多少次.于是我们很轻松地就能写出下面的程序:Map counter = new HashMap(); for(String s : strs) { if(counter.containsKey(s)) { Integer times = counter.get(原创 2013-11-30 17:02:48 · 4514 阅读 · 0 评论 -
Java对象的内存模型
众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个对象在内存中被创建的时候,它只不过是一串0和1而已.编译器会维护一张表,这张表用来存储对象中的每一个成员变量所在位置的偏移量(offset).这样,通过查这张表,JVM就能知道每一个成员变量相对于其起原创 2013-10-19 09:15:22 · 2171 阅读 · 0 评论 -
设计模式之Builder模式
情景需要:假设有这样一个Human类,要构造一个Human对象必须传递6个参数,其中前3个是必须的,后3个是可选的:[java] view plaincopyprint?class Human { // required parameters private final String name;原创 2013-10-03 15:04:47 · 1499 阅读 · 1 评论 -
使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序
Seam这个单词的本意是缝合、连接,因而,Seam的作用即是把Java EE 规范里的JSF 和 EJB技术完美融合在一起,免去了很多胶合代码,并增强了JSF 和 EJB的很多功能。Seam的设计目标之一是,写最少的代码,做最多的事,并且极力减少 “对XML的编程”。原创 2013-08-24 18:19:18 · 2492 阅读 · 0 评论 -
JBoss + EJB3 + MySql : 开发第一个EJB
JBoss开发Bean并不困难,而对于不知道的人来说,数据库配置才是比较棘手的问题。现在我们就来一步一步开发一个EJB3 + MySql的Bean。一、MySql数据库的配置1. 配置数据源在 %JBOSS_HOME%/docs/examples/jca 目录下找到一个名叫 "mysql-db.xml" 的文件,这个是官方为我们写好的针对mysql的数据源配置文件,我们改改它就原创 2013-07-15 00:29:47 · 3242 阅读 · 0 评论 -
Hibernate4 : 持久化你的第一个类
由于目前我在学校的一个实验室跟老师学习Java EE开发,老师用的是Seam框架接活做项目,所以这一系列的文章将会向Seam方向写。。路线大致应该是 : JSP --> Servlet --> Hibernate --> JSF --> EJB3 --> Seam在开始之前,去www.hibernate.org下载 hibernate4.final.zip ,并将所有依赖的jar文件放原创 2013-06-29 16:16:04 · 2630 阅读 · 1 评论 -
反射API
反射,是指一种能在运行时动态加载、分析类的能力。反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级的特性,使用反射技术应当具备相当的Java语言基础。我们可以通过反射机制让应用程序做一些几乎不可能做到的事情。一. Class类在java.lang包中有一个特殊的类,即Class类。JVM会为所有被加载的类创建一个对应的Class类的对象,这个对象保存了类的原创 2013-06-23 01:57:11 · 2322 阅读 · 0 评论 -
Ubuntu下 Tomcat + JSF + Ant + eclipse 开发环境搭建
JDK的安装就不用说了,这是必须的。。1. 去http://tomcat.apache.org/tomcat-7.0-doc/index.html下载Tomcat应用服务器,我用的版本是7.02. 从网上下载jsf-impl.jar 和 jsf-api.jar 这2个JSF实现jar包,放到tomcat_home/lib/ 目录下3. 去http://ant.apache.or原创 2013-06-03 01:34:51 · 1855 阅读 · 0 评论 -
基于AWT、Swing的GUI程序 - 改变观感
本程序通用调用UIManager.getInstalledLookAndFeels()方法来获取本机已安装的所有观感,然后分别创建相应数量的Button,用来动态改变观感。相关API :static voidsetLookAndFeel(LookAndFeel newLookAndFeel)设置观感static voidupdateComponentTreeUI(C原创 2013-05-10 00:05:35 · 1759 阅读 · 0 评论 -
Java网络编程(一)- 一个简单的服务端/客户端应用程序
在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能。Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程。下面所说的内容只适用于TCP协议。一、连接到服务器我们可以使用Socket类的构造函数来打开一个套接字,如Socket sk = new Socket("210.0.235.14",13);其中,原创 2013-05-04 23:22:33 · 3712 阅读 · 0 评论 -
Java的IO操作(五) - PrintStream类、字符流、Reader和Writer、带缓冲的字符流BufferedReader和BufferedWriter
1. PrintStream类我们都知道,int类型在Java中占4个字节,如1在内存中表示为 00000000 00000000 00000000 00000001。如果我们直接使用OutputStream对象输出到一个文件中的话,那么程序就会向文件中直接写入 00000001。不用说,用记事本打开的话肯定会是一个奇怪的字符。现在我们想要将内存中的数据转换成字符型再输出到文件中,就可以使用P原创 2013-04-18 00:44:31 · 3194 阅读 · 0 评论 -
Java对多线程的支持(二) - 线程死锁
我们知道,当线程A由于某种原因(如等待IO操作完成、调用了sleep函数等)放弃了执行权时,操作系统就会调度另一个处于就绪状态(Runnable) 的线程B来执行。只有当线程A所等待的事件发生(如IO操作完成,睡眠时间结束)后,线程A才会被设置成就绪状态,等待操作系统的调度。然而有时候可能会出现这样一种情况:线程A为了等待线程B而处于阻塞状态(blocked),此时线程B恰好又在等待线程A而处原创 2013-04-10 01:22:57 · 1953 阅读 · 2 评论 -
Java对多线程的支持(一) - Thread类、Runnable接口、Daemon线程、线程同步
Java是第一个在语言级提供了对多线程程序设计支持的语言。语言级支持是啥意思呢,就是抛开操作系统,只使用Java内置的语句就能实现多线程。一般来讲,多线程会依赖操作系统,我们要高用与系统相关的API才能创建多个线程,如在Windows中的CreateThread()函数。但JAVA就不用了。JAVA运行时系统实现了一个用于调用线程执行的线程调度器,用来决定在某一时刻哪个线程在CPU上运行。原创 2013-04-05 23:49:23 · 5147 阅读 · 3 评论 -
Java的IO操作(四) - SequenceInputStream类,实例:一个文件分割、合并工具
SequenceInputStream可以看做是多个InputStream对象的有序集合。当一个InputStream对象的数据读取完后,它会自动取出下一个InputStream对象进行读取,直到所有的InputStream对象都读取完为止。利用这个特点,我们来编写一个文件分割、合并工具。使用说明:SequenceDemo [Option] [filePath] [number原创 2013-04-02 21:00:44 · 3418 阅读 · 2 评论 -
Java的IO操作(三) - 对象的序列化、ObjectInputStream和ObjectOutputStream类
由于Java是一种完全面向对象的高级语言,所以在编写程序的时候数据大都存放在对象当中。我们有时会需要将内存中的整个对象都写入到文件中去,然后在适当的时候再从文件中将对象还原至内存。我们可以使用java.io.ObjectInputStream和java.io.ObjectOutputStream类来完成这个任务。1、对象的序列化(Serialize)序列化是指将对象的状态信息转换为原创 2013-04-01 10:18:00 · 2730 阅读 · 2 评论