文章分类 -  JAVA

1
摘要:Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存。C/C++开发人员需要通过malloc/free和new/delete等函数来显式的分配和释放内存。这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题。一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果。开发人员有可能忘记显式的调用释放内存的函数而造成内存泄露。而自动的内存管理则是把管理内存的任务交给编程语言的运行环境来完成。开发人员并不需 阅读全文
posted @ 2013-05-25 20:11 跳刀的兔子 阅读(707) 评论(1) 推荐(0) 编辑
摘要:4.1 Spring IoC容器和bean的介绍 IoC也被称为是依赖注入(DI)。先构造对象,设置属性等,然后容器在bean的时候注入那些依赖,控制反转(IoC)。 Bean本身控制实例化或直接地使用类的构造来定位它的依赖,或者是如服务定位器模式的机制。 org.springframework.beans和org.springframework.context包是Spring Framework的IoC容器的基础。BeanFactory接口提供高级的配置机制,可以管理任意类型的对象。ApplicationContext是BeanFactory的子接口。它添加了和Spring的AOP特性... 阅读全文
posted @ 2013-04-19 17:02 跳刀的兔子 阅读(636) 评论(0) 推荐(0) 编辑
摘要:加载文件顺序情形一:使用classpath加载且不含通配符这是最简单的情形,Spring默认会使用当前线程的ClassLoader的getResource方法获取资源的URL,如果无法获得当前线程的ClassLoader,Spring将使用加载类org.springframework.util.ClassUtils的ClassLoader。1.当工程目录结构如图所示: ApplicationContext context =new ClassPathXmlApplicationContext("conf/application-context.xml");加载[conf/a 阅读全文
posted @ 2013-04-19 03:51 跳刀的兔子 阅读(16133) 评论(0) 推荐(1) 编辑
摘要:使用场景: 根据配置路径自动加载符合路径规则的xml文件、类文件等等; 查找范围:当前工程,当前工程依赖的jar包;示例:public void testGetResources(){ ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); try { Resource[] metaInfResources = resourcePatternResolver .getResources("classpath*:**/*DA... 阅读全文
posted @ 2013-04-19 03:18 跳刀的兔子 阅读(16417) 评论(0) 推荐(2) 编辑
摘要:一、缓冲区操作 缓冲区,以及缓冲区如何工作,是所有 I/O 的基础。所谓“输入/输出”讲的无非就是把数据移进或移出缓冲区。 进程使用 read( )系统调用,要求其缓冲区被填满。内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。磁盘控制器把数据直接写入内核内存缓冲区,这一步通过 DMA 完成,无需主 CPU 协助。一旦磁盘控制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( )调用时指定的缓冲区。图 1-1. I/O 缓冲区操作简图 为什么不直接让磁盘控制器把数据送到用户空间的缓冲区呢?这样做有几个问题。首先,硬件通常不能直接访问用户空间。其次,像磁盘这样... 阅读全文
posted @ 2012-02-03 12:00 跳刀的兔子 阅读(452) 评论(0) 推荐(0) 编辑
摘要:Java 线程模型可以用图 2 所示的 Java 线程生命周期来描述。Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡 5 个状态。一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 。图 2. Java 线程模型 创建状态 (New Thread) 在 Java 语言中使用 new 操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。就绪状态 (Runnable) 使用 start() 方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,使该线程处于就绪状态 阅读全文
posted @ 2011-10-23 14:12 跳刀的兔子 阅读(3355) 评论(0) 推荐(0) 编辑
摘要:在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。 在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。 一、静态内部类的使用目的。 在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过由于种种的原因,如使用上的限制 等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工作中用的并不是很多。但是并不是说其没有价值。... 阅读全文
posted @ 2011-10-18 22:47 跳刀的兔子 阅读(601) 评论(0) 推荐(0) 编辑
摘要:jstatd启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。实例:jstatd -J-Djava.security.policy=my.policymy.policy文件需要自己建立,内如如下:grant codebase "file:$JAVA_HOME/lib/tools.jar" {permission java.security.AllPermission;};这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作jps列出所有的jvm实例实例:j 阅读全文
posted @ 2011-07-27 23:43 跳刀的兔子 阅读(1848) 评论(0) 推荐(0) 编辑
摘要:HashCode()和Equals(),Hash结构 关系详解首先看下hashCode()的官方解释public int hashCode()Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable. The general contract of hashCode is:o Whenever it is invoked on the same object more 阅读全文
posted @ 2011-07-27 23:32 跳刀的兔子 阅读(253) 评论(0) 推荐(0) 编辑
摘要:Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库, 但是这里的Session并非指HttpSession,可以理解为基于JDBC的Connnection,Session是 Hibernate运作的中心, 对象的生命周期、事务的管理、数据库的存取都与Session息息相关,首先,我们需要知道, SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个 Ses 阅读全文
posted @ 2011-07-09 23:56 跳刀的兔子 阅读(12380) 评论(0) 推荐(0) 编辑
摘要:摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍。 关键字:Servlet 线程安全 同步 Java内存模型 实例变量 Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发 阅读全文
posted @ 2011-07-09 23:32 跳刀的兔子 阅读(235) 评论(0) 推荐(1) 编辑
摘要:1.inputstrem和string转换时切记带上编码,如:IOUtils.toString(inputStream,"utf-8");2.string和byte[]转换时切记带上编码,如:DigestUtils.md5Hex(sb.toString().getBytes("utf-8")).toUpperCase();3.url编码解码时候要注意编码,如:URLEncoder.encode("中文","utf-8");4.使用httpclient post传中文时候,对各字段编码,如:StringParttem 阅读全文
posted @ 2011-06-23 10:56 跳刀的兔子 阅读(343) 评论(0) 推荐(0) 编辑
摘要:数组(Array)与ArrayList的主要区别:效率、动态扩增、对象类型和基本数据类型。1.自己的总结:1)精辟阐述:(《TIJ》第323页)初学者可以将ArrayList想象成一种“会自动扩增容量的array”。2)array([]):最高效;但是其容量固定且无法动态改变;ArrayList:容量可动态增长;但牺牲效率;3)建议:(《TIJ》第292页)基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList!不过当你试着解决更一般化的问题时,array的功能就可能过于受限。4)java中一切皆对象,array也是对象。不论你所使用得array型别为何,arr 阅读全文
posted @ 2011-06-23 02:07 跳刀的兔子 阅读(2125) 评论(0) 推荐(0) 编辑
摘要:1.JSONObject是无序的;JSONArray是有序的2.JSONObject里的get()和opt()方法通过name得到values;put()方法通过name添加value;value的类型可以为:Boolean,JSONArray,JSONObject,Number,String,JSONNull;element()方法将key-Value转化为JSONObject;静态方法fromObject(Object obj)构造一个JSONObject对象;toXXX()方法转换为什么类型。例子:String seasonRange = {1:[2011-5-1,2011-9-1],2 阅读全文
posted @ 2011-06-22 20:46 跳刀的兔子 阅读(438) 评论(0) 推荐(0) 编辑
摘要:一、概述Profiler是一个时间统计程序,他通过在程序中埋点,将埋点时间记录入线程变量中以实现革离,最后dump出结果,得出埋点时间树。二、Profiler常用方法(Profiler类的静态方法)1、Start当前线程埋点计时的开始,标识当前埋点的开始时间,每个埋点产生一个Entry,被压入线程变量中的栈中,当start方法被调用时,就是一个时间点栈的开始,如果start方法被重复调用,则覆盖前面被放入线程变量的栈,每个线程只允许一个栈的存在。该方法的参数标识该Entry信息。2、Enter向线程变量中的栈压入当前埋点信息Profiler.entry("..."),标 阅读全文
posted @ 2011-06-22 19:15 跳刀的兔子 阅读(6780) 评论(1) 推荐(0) 编辑
摘要:一、HashMap和HashTable区别:1.HashTable是Dictionary的子类,HashMap是Map接口的一个实现类;2.HashTable中的方法是同步的,而HashMap中方法是非同步的.也就是说,在多线程的情况下用HashMap需要额外的同步机制.Map Collections.synchronziedMap(Map m)这个方法返回一个同步的Map,封装了底层的HashMap方法,使得多线程安全.或者采用ConcurrentMap接口;3.HashMap中,键和值都可以为null(null键只能有一个),HashTable不允许为null。当get()方法时返回nul 阅读全文
posted @ 2011-06-22 18:48 跳刀的兔子 阅读(11362) 评论(0) 推荐(0) 编辑
摘要:Arrays.sort()方法采用的是模板方法模式,步骤为mergeSort --- comparaTo --- swap原理:所以如果自定义排序方法时,需要实现comparaTo()方法comparaTo()方法的实现为:public class Duck implements Comparable<Object> { String duckStr; public Duck(String str){ this.duckStr = str; } @Override public int compareTo(Object obj) { Duck str1 = (Duck)obj; i 阅读全文
posted @ 2011-06-22 01:20 跳刀的兔子 阅读(395) 评论(0) 推荐(0) 编辑
摘要:最近在将String转换为Date类型时发现Date.parse(String)已经废除,找了N多地方发现SimpleDateFormat类更有扩展性,示例如下:这样类型的转换就拥有了更高的灵活性,如果日期变为"2008/10/13 15:20:25"代码只需变动如下public static void main(String[] args) { String d = "2008/10/13 15:20:25"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd hh:mm:ss&q 阅读全文
posted @ 2011-06-20 13:54 跳刀的兔子 阅读(8709) 评论(0) 推荐(0) 编辑
摘要:Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为: 并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。一、创建线程池Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorServi 阅读全文
posted @ 2011-06-01 16:42 跳刀的兔子 阅读(10615) 评论(0) 推荐(0) 编辑
摘要:public static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); } return result; } privat 阅读全文
posted @ 2011-05-05 10:09 跳刀的兔子 阅读(1183) 评论(0) 推荐(0) 编辑

1