`
喻红叶
  • 浏览: 41055 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论
文章列表
创建XMLHttpReuqest 由于在IE7之前,IE不支持XMLHttpRequest,所以如果想要兼容IE7之前的版本,就需要做一些额外的工作来创建XMLHttpRequest对象。可以使用下面的代码来创建: function createXHR(){ //如果支持XMLHttpRequest,之间创建该对象 if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } //否则就要判 ...
泛型是一种表示类型约束的手段,比如某一泛型类Generic<T>,它表示的意思是:虽然我不知道T是什么类型,但是在Generic<T>中,所有的T必须是相同的类型。通配符就是使用问号来表示未知的类型,比如List<?>。通配符确实相当复杂,为了理解通配符必须抓住两点:Java的泛型是使用擦除来实现的,运行时不知道确切的类型;泛型的主要目的是增强类型的安全性,尤其是类型安全性对于理解通配符相当重要。 List<?>,List和List<Object>是不同的,List是异构的,你可以往里面添加任何东西;List<Object> ...
Java中的泛型不是语言内在的机制,而是后来添加的特性,这样就带来一个问题:非泛型代码和泛型代码的兼容性。泛型是JDK1.5才添加到Java中的,那么之前的代码全部都是非泛型的,它们如何运行在JDK1.5及以后的VM上?为了实现这种兼容性,Java泛型被局限在一个很狭窄的地方,同时也让它变得难以理解,甚至可以说是Java语言中最难理解的语法。 擦除 为了实现与非泛型代码的兼容,Java语言的泛型采用擦除(Erasure)来实现,也就是泛型基本上由编译器来实现,由编译器执行类型检查和类型推断,然后在生成字节码之前将其清除掉,虚拟机是不知道泛型存在的。这样的话,泛型和非泛型的代码就可以混合运行, ...
面向对象相对于面向过程而言,是软件领域的一个重大进步。面向对象的多态特性,使得系统具有了较好的扩展性,通常我们使用父类来代替具体的类型,在实际运行时,却可以使用子类的对象。Java又更进了一步,提倡面向接口 ...
ReentrantLock实现了标准的互斥重入锁,任一时刻只有一个线程能获得锁。考虑这样一个场景:大部分时间都是读操作,写操作很少发生;我们知道,读操作是不会修改共享数据的,如果实现互斥锁,那么即使都是读操作,也只有一个线程能获得锁,其他的读都得阻塞。这样显然不利于提供系统的并发量。在JDK1.5中,Doug Lea又给我们带来了读写锁ReentrantReadWriteLock,在读-写锁的实现加锁策略中,允许多个读操作同时进行,但每次只允许一个写操作。 ReentrantReadWriteLock的结构 ReentrantReadWriteLock(简称RRWL)的实现也是通过AQS来实 ...
在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。Java 5.0增加了一种新的机制:ReentrantLock。ReentrantLock没有使用任何内建机制,仅仅从语言层面上实现了与synchronized相同的语义,而且还提供了跟多的功能,这一切都要归功于Java并发大师Doug Lea。在Java 5.0中,Doug Lea写了一个同步框架,AbstractQueuedSynchronizer(可以参考Doug Lea的论文:http://ifeve.com/aqs)。在AbstractQueuedSynchronizer(简称A ...
Servlet规范定义了一个接口用于请求转发,即RequestDispatcher,该接口有Servlet引擎提供实现,它从客户端接受请求并把该请求转发到容器的任何资源上(包括Servlet,JSP,,HTML等)。虽然它可以包装任何资源,但是Servlet规范建议尽量只用来包装Servlet。RequestDispatcher接口规定了两个方法: void forward(ServletRequestrequest,ServletResponseresponse)
如何写一个Servlet类?围绕这个问题,可以看一下Servlet的类结构。首先Servlet类也是一个Java类,只不过这个类比较特殊,它不能单独运行,必须要依托Servlet容器才能运行,Servlet类是一个组件,供Servlet引擎调用。既然是这样,那么Servlet类和Servlet引擎必然要遵循一套规范,以约束彼此的行为,遵循规范编写的Servlet类可以运行在任何符合规范的Servlet引擎上。那我们就看看,如何编写一个符合规范的Servlet。首先看一下要编写一个Servlet基本类图的结构(图是从网上找的): 其中Servlet接口是所有Servlet的父接口,Servl ...
CAS CAS(Compare-And-Swap,比较并交换)操作是CPU中术语,它保证了操作的原子性。CAS指令需要三个操作数,分别是: V:内存位置(也就是本次操作变量的内存地址); A:旧的预期值; B: 操作完成后的新值。 CAS指令执行时,当且仅当V符合旧预期值A时,处理器用新值B更新V的值,否则它就不执行更新,无论是否更新,都会返回V的旧值,整个CAS操作是一个原子操作。在JDK1.5之后,Java程序中才可以使用CAS操作,该操作由sun.misc.Unsafe类里的compareAndSwapXXX()方法包装提供,虚拟机在内部对这些方法做了特殊处理。在JDK1.5中提 ...
JSON(JavaScript Object Nonation)是一种轻量级的数据交换格式。关于JSON,最重要的是理解它是一种数据格式,不是一种编程语言,JSON也不从属于JavaScript,很多编程语言都有针对JSON的解析器和序列化器。JSON有三种表示形式,分别是简单值,对象,数组。 简单值 最简单的JSON数据形式就是简单值,比如5,“Hello World”,布尔值和null也是有效的JSON形式。但是在实际应用中,JSON更多的用来表示更复杂的数据结构,简单值只是整个数据结构的一部分。 对象 对象是一个无序的“名值对”的集合,每个对象以“{”开始,“}”结束,每个“名”后 ...
AOP(Aspect-Oriented Programming,面向切面编程)是对OOP的一个极大补充,但是AOP中各种概念实体却是有些复杂,尤其是对于刚接触AOP的人来说。但是为了使用AOP,为了理解AOP,这些实体又是迈步过去的坎,编程虐我千百遍,我待编程 ...
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,就是枚举类型。枚举类型是Java 1.5新增的特性,这是一个非常有用的特性。 Enum 在这一小部分,我们将探讨枚举的最基本的用法。首先我们必须要明白一点:enum是一个常规类型,只不过它还有一些限制。定义枚举类型很简单,使用enum关键字把所有的值组织起来,就像下面一样: enum Season {SPRING,SUMMER,FULL,WINTER} Season拥有四个实例,在一般的命名规范中,通常用大写的字母表示枚举的实例。枚举类型的实例是有序的,每个实例都有一个对应的序号,从0开始,由于enum天然的有序性,可以在 ...
在一些情况下,如果对象能够在程序不运行的情况下仍能存在并保存其信息,这样在下次运行程序时,该对象将被重建,并且拥有的信息与程序在上次运行时它所拥有的信息相同,这将非常有用。“将一个对象编码成一个字节流”,称为对象序列化,相反的处理过程称为反序列化。一旦对象被序列化后,它的编码就可以从一台正在运行的虚拟机被传递到令一台虚拟机上,或者被存储到磁盘上,供以后反复使用。Java提供了内建的语言机制来实现序列化,在Java的序列化中涉及到两个接口和一个关键字,分别是Serializable接口和Externalizable接口,以及transient关键字。 Serializable接口 Serial ...
代理模式 代理模式:为另一个对象提供一个替身或者占位符以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某个对象的访问,被代理的对象可以是远程的对象或需要安全控制的对象。我觉得,在C语言中,指针就是一个代理对象,真正存储数据的是内存中的另外一块区域。Java提供了API可以生成动态代理,所以把标准的代理模式称为静态代理模式。在静态代理模式中有三类角色,理解了这三类角色也就理解了代理模式: a.抽象对象:定义了真实角色和抽象角色的公共接口(可以是类,也可以是接口)Subject; b.代理角色:代理角色内部包含有对真实角色的引用,通过这个引用去执行真实角色想要完 ...
在没有互联网的时代里,报纸是人们获取信息的一个非常重要的途径,很多人会定一份或者几份报纸。报社会保存订阅者的信息,每当出了新报纸时,立即送到订阅者手里。订阅者在这种关系中处于被动的状态,它依赖于报社的行为,只有新报纸出版了,它才有可能阅读其中的内容。在互联网时代,报社可以把它的新闻放到网上,订阅者通过RSS订阅,每当有新的新闻就推送给订阅者。问题是:报社如何把新闻推送给所有的订阅者?进一步抽象描述这个问题:当一个对象的状态发生改变时,如何让依赖于它的所有对象得到通知,并进行处理呢? 观察者模式是这个问题的合理解决方案。观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所 ...
Global site tag (gtag.js) - Google Analytics