java专题

知识博客专集

武汉北大青鸟:进行Java Web项目开发需要掌握的技术


  1、java语言

  java语言体系比较庞大,包括多个模块。从web项目应用角度讲有jsp、servlet、jdbc、javabean(application)四部分技术。

  (1)、java database connectivity (jdbc)技术

  在java web应用开发中,数据库管理系统(rdbms)的使用是不可缺少的。jdbc(java database connectivity) 是一种用于执行 sql 语句的 java api。它由一组用 java 编程语言编写的类和接口组成。jdbc 为工具/数据库开发人员提供了一个标准的api,使他们能够用纯java api 来编写数据库应用程序。

  简单地说,jdbc 可做三件事:

  l与数据库建立连接,

  l发送 sql 语句,

  l处理结果。

  (2)、servlet技术

  servlet是运行在服务器端的程序,可以被认为是服务器端的applet。servlet被web服务器(例如tomcat)加载和执行,就如同applet被浏览器加载和执行一样。servlet从客户端(通过web服务器)接收请求,执行某种操作,然后返回结果。

  servlet的主要优点包括

  lservlet是持久的。servlet只需web服务器加载一次,而且可以在不同请求之间保持服务(例如一次数据库连接)。

  lservlet是与平台无关的。如前所述,servlet是用java编写的,它自然也继承了java的平台无关性。

  lservlet是可扩展的。由于servlet是用java编写的,它就具备了java所能带来的所有优点。java是健壮的、面向对象的编程语言,它很容易扩展以适应你的需求。servlet自然也具备了这些特征。

  lservlet是安全的。从外界调用一个servlet的惟一方法就是通过web服务器。这提供了高水平的安全性保障,尤其是在你的web服务器有防火墙保护的时候。

  lservlet可以在多种多样的客户机上使用。由于servlet是用java编写的,所以你可以很方便地在html中使用它们。

  (3)、javaserver pages(jsp) 技术

  jsp是从servlet上分离出来的一小部分,简化了开发,加强了界面设计。jsp定位在交互网页的开发。运用java语法,但功能较servlet弱了很多,并且高级开发中只充当用户界面部分。jsp容器收到客户端发出的请求时,首先执行其中的程序片段,然后将执行结果以html格式响应给客户端。其中程序片段可以是:操作数据库、重新定向网页以及发送 e-mail 等等,这些都是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,与客户端的浏览器无关,因此,jsp 称为server-side language。

  javaserver pages的主要优点包括

  ●一次编写,各处执行(write o?nce, run anywhere)特性

  作为java 平台的一部分,javaserver pages 技术拥有java语言“一次编写,各处执行”的特点。随着越来越多的供货商将javaserver pages 技术添加到他们的产品中,您可以针对自己公司的需求,做出审慎评估后,选择符合公司成本及规模的服务器,假若未来的需求有所变更时,更换服务器平台并不影响之前所投下的成本、人力所开发的应用程序。

  ● 搭配可重复使用的组件

  javaserver pages技术可依赖于重复使用跨平台的组件(如:javabean或enterprise javabean组件)来执行更复杂的运算、数据处理。开发人员能够共享开发完成的组件,或者能够加强这些组件的功能,让更多用户或是客户团体使用。基于善加利用组件的方法,可以加快整体开发过程,也大大降低公司的开发成本和人力。

  ● 采用标签化页面开发

  web 网页开发人员不一定都是熟悉java 语言的程序员。因此,jsp 技术能够将许多功能封装起来,成为一个自定义的标签,这些功能是完全根据xml 的标准来制订的,即jsp 技术中的标签库(tag library)。因此,web 页面开发人员可以运用自定义好的标签来达成工作需求,而无须再写复杂的java 语法,让web 页面开发人员亦能快速开发出一动态内容网页。

  今后,第三方开发人员和其他人员可以为常用功能建立自己的标签库,让web 网页开发人员能够使用熟悉的开发工具,如同html 一样的标签语法来执行特定功能的工作。

  ● n-tier 企业应用架构的支持

  有鉴于网际网络的发展,为因应未来服务越来越繁杂的要求,且不再受地域的限制,因此,

  必须放弃以往client-server的two-tier 架构,进而转向更具威力、弹性的分散性对象系统。由于javaserver page 技术是java 2 platform enterprise edition (j2ee)集成中的一部分,它主要是负责前端显示经过复杂运算后之结果内容,而分散性的对象系统则是主要依赖ejb ( enterprise javabean )和jndi ( java naming and directory interface )构建而成。

  (4)、javabean(application)应用组件技术

  application是java应用程序,在web项目和一些开发中主要应用javabean。它就是application的一部分,逻辑运算能力很强,能极大的发挥java语言的优点。javabean 被称为是java 组件技术的核心。javabean 的结构必须满足一定的命名约定。javabean能提供常用功能并且可以重复使用,这使得开发人员可以把某些关键功能和核心算法提取出来封装成为一个组件对象,这样就增加了代码的重用率和系统的安全性。

  高级的web项目会应用到以上所有技术,它们之间联合使用和协作开发会提高开发的效率和系统的性能。

  2、面向对象分析设计思想

  java语言是完全面向对象的语言,所以在项目设计时会有很大的帮助,在设计时应尽量舍弃以往的面向过程的设计方式。

  在分析项目业务关系的时候,应用一些uml(unified modeling language)图,例如常用的用例图(use case diagram),类图(class diagram),时序图(sequence diagram)等等,会有很大的帮助,这样能尽快找出业务逻辑主要面对的对象,然后对每个对象进行行为划分,最后再实现对象之间的集成和通信。

  3、设计模式和框架结构

  java从语言角度来讲不是很难,但是从整体设计角度来讲我们还需要了解一些高级应用框架。如果要设计一个良好的框架结构,单单只掌握java语言远远不够。这就涉及到一个设计模式,还有和设计模式相关的一些知识。

  设计模式在java项目实施过程更是重中之重。主要在与两层的设计模式、三层的设计模式和n层的设计模式。它直接决定着项目的应用、部署和实际开发设计。

  在普通的web项目中很多采用两层的开发结构。jsp servlet或jsp javabean。当对开发要求高的项目中使用很多的还是mvc的三层开发结构,也就是jsp servlet javabean。它能分有效的分离逻辑开发,使开发人员能专注于各自的开发。同时也能时整个开发结构流程更清晰,但是需要比较高的开发配合度。

  在项目中,我们经常使用着名的model-view-controller(mvc)架构。mvc架构是随着smalltalk language语言的发展提出的,它是一个着名的用户界面设计架构。经典的mvc架构把一个组件(可认为是整个应用程序的一个模块)划分成三部分组 model管理这个模块中所用到的数据和业务逻辑。而view 管理模块如何显示给用户,controller 决定如何处理用户和该模块交互式时候产生的事件 如用户点击一个按钮等。

  4、xml语言

  在服务器和设计模式结构中会应用到自定义文件,而且在应用高级设计时也会定义自用的标签,现在流行的是用xml去定义配置,所以xml语言应该有一定掌握。

  当前,java 2平台企业版(j2ee)架构在厂商市场和开发者社区中倍受推崇。作为一种工具,可扩展标记语言(xml)简化了数据交换、进程间消息交换这一类的事情,因而对开发者逐渐变得有吸引力,并开始流行起来。自然,在j2ee架构中访问或集成xml解决方案的想法也很诱人。因为这将是强大系统架构同高度灵活的数据管理方案的结合。

  xml的应用似乎是无穷无尽的,但它们大致上可以分为三大类:

  1、简单数据的表示和交换(针对xml的简单api(sax)和文档对象模型(dom)语法解析,不同的文档类型定义(dtds)和概要(schemas))

  2、用户界面相关、表示相关的上下文(可扩展样式表语言(xsl),可扩展样式表语言转换(xslt))

  3、面向消息的计算(xml-rpc(远程过程调用),基于soap协议的web 服务(web services),电子化业务xml(ebxml))

  5、网页脚本语言

  为了提高web项目的整体性能,提高人机交互的友好界面,网页的脚本语言是很有用处的,有的时候可以解决很大的难题或提高程序的性能和应用性。

  网页脚本语言的执行都是在客户端执行的,速度很很快,并且大多的操作与服务器没有交互运算,所以在一些应用中非常理想。在设计web项目的应用中,网页的脚本语言起着不能忽视的作用,所以如果设计web项目的应用中,对javascrīpt应有一定的了解。

  javascrīpt是一种基于对象(object based)和事件驱动(event driven)并具有安全性能(secure)的脚本语言。使用它的目的是与html超文本标记语言、java 脚本语言(java小程序)一起实现在一个web页面中链接多个对象,与web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的html语言中实现的。它具有以下几个基本特点:

  1.它是一种脚本编写语言

  javascrīpt是一种脚本语言,它采用小程序段的方式实现编程。像其它脚本语言一样,javascrīpt同样已是一种解释性语言,它提供了一个易的开发过程。

  它的基本结构形式与c、c 、vb十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与html标识结合在一起,从而方便用户的使用操作。

  2. 基于对象的语言。

  javascrīpt是一种基于对象的语言,同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。

  3.简单性

  javascrīpt的简单性主要体现在:首先它是一种基于java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习java是一种非常好的过渡。其次它的变量类型是采用弱类型,并未使用严格的数据类型。

  4.安全性

  javascrīpt是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。

  5. 动态性

  javascrīpt是动态的,它可以直接对用户或客户输入做出响应,无须经过web服务程序。它对用户的响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页(home page)中执行了某种操作所产生的动作,就称为“事件”(event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。

  6、开发工具

  (1)、数据库

  在主要的应用中,数据库相关的环节应用很多,所以对数据库应该有一定了解。不能单单只了解一种数据库,因为在很多实际开发中会提出很多数据库解决方案,所以只有在了解多种数据库的情况下才能有一个比较方案。

  对于数据库应该了解他的性能和一些基本的操作常识,还有该数据库的特点。而针对与java语言web项目的数据库开发则主要是对jdbc的应用,还有数据库事务处理和连接池等高级概念的应用。

  (2)、web服务器

  同数据库一样,应该了解该服务器的性能,特点和一些常识。

  在应用方面,web服务器主要是针对于配置和部署,对目录的配置,调试;对配置文件属性的修改;对访问权限和并发性的控制;java类的部署等。

  (3)、集成开发环境(ide):

  “公欲善其事, 必先利其器”. 对于web应用开发人员来讲,好的集成开发环境(ide:integrated development enviroment)是非常重要的。目前在市场上占主导位置的一个集成开发工具就是eclipse.

java新手之基本概念讲解


java,是由sun microsystems公司于1995年5月推出的java程序设计语言和java平台的总称。下面介绍的是java中的基本概念的讲解。

1、 对象的初始化

(1) 非静态对象的初始化

在创建对象时,对象所在类的所有数据成员会首先进行初始化。

基本类型:int型,初始化为0。

如果为对象:这些对象会按顺序初始化。

※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。

构造方法的作用就是初始化。

(2) 静态对象的初始化

程序中主类的静态变量会在main方法执行前初始化。

不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。

2、 继承时,对象的初始化过程

(1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。

(2) 主类静态成员的初始化。

(3) 主类的超类由高到低进行默认构造方法的调用。注意,在调用每一个超类的默认构造方法前,先进行对此超类进行非静态对象的初始化。

(4) 主类非静态成员的初始化。

(5) 调用主类的构造方法。

3、 关于构造方法

(1) 类可以没有构造方法,但如果有多个构造方法,就应该要有默认的构造方法,否则在继承此类时,需要在子类中显式调用父类的某一个非默认的构造方法了。

(2) 在一个构造方法中,只能调用一次其他的构造方法,并且调用构造方法的语句必须是第一条语句。

4、 有关public、private和protected

(1) 无public修饰的类,可以被其他类访问的条件是:a.两个类在同一文件中,b.两个类在同一文件夹中,c.两个类在同一软件包中。

(2) protected:继承类和同一软件包的类可访问。

(3) 如果构造方法为private,那么在其他类中不能创建该类的对象。

5、 抽象类

(1) 抽象类不能创建对象。

(2) 如果一个类中一个方法为抽象方法,则这个类必须为abstract抽象类。

(3) 继承抽象类的类在类中必须实现抽象类中的抽象方法。

(4) 抽象类中可以有抽象方法,也可有非抽象方法。抽象方法不能为private。

(5) 间接继承抽象类的类可以不给出抽象方法的定义。

6、 final关键字

(1) 一个对象是常量,不代表不能转变对象的成员,仍可以其成员进行操作。

(2) 常量在使用前必须赋值,但除了在声明的同时初始化外,就只能在构造方法中初始化。

(3) final修饰的方法不能被重置(在子类中不能出现同名方法)。

(4) 如果声明一个类为final,则所有的方法均为final,无论其是否被final修饰,但数据成员可为final也可不是。

7、 接口interface (用implements来实现接口)

(1) 接口中的所有数据均为 static和final即静态常量。尽管可以不用这两个关键字修饰,但必须给常量赋初值。

(2) 接口中的方法均为public,在实现接口类中,实现方法必须可public关键字。

(3) 如果使用public来修饰接口,则接口必须与文件名相同。

8、 多重继承

(1) 一个类继承了一个类和接口,那么必须将类写在前面,接口写在后面,接口之间用逗号分隔。

(2) 接口之间可多重继承,注意使用关键字extends。

(3) 一个类虽只实现了一个接口,但不仅要实现这个接口的所有方法,还要实现这个接口继承的接口的方法,接口中的所有方法均须在类中实现。

9、 接口的嵌入

(1) 接口嵌入类中,可以使用private修饰。此时,接口只能在所在的类中实现,其他类不能访问。

(2) 嵌入接口中的接口一定要为public。

10、类的嵌入

(1) 类可以嵌入另一个类中,但不能嵌入接口中。

(2) 在静态方法或其他方法中,不能直接创建内部类对象,需通过手段来取得。

手段有两种:

(3) 一个类继承了另一个类的内部类,因为超类是内部类,而内部类的构造方法不能自动

被调用,这样就需要在子类的构造方法中明确的调用超类的构造方法。

接上例:

构造方法也可这样写:

11、异常类

java中除了runtimeexception 类,其他异常均须捕获或抛出。

希望本文介绍的是以上11个java中的基本概念,能够给大家带来帮助。

【编辑推荐】

Java集合:数组CollectionListSetMap的比较


  数组
  数组和其它容器的区别主要有三方面:效率,类型,和保存基本类型的能力.在java中,数组是一种效率很高的存储和随机访问对象引用序列的方式.数组是一 个简单的线性序列,因此访问速度很快,但也损失了其它一些特性.创建一个数组对象后,大小就固定了,如果空间不够,通常是再创建一个数组,然后把旧数组中 的所有引用移到新数组中.数组可可以保存基本类型,容器不行.
  容器类不以具体的类型来处理对象,而是将所有的对象都以object类型来处理,所以我们可以只创建一个容器,任意的java对象都可以放进去.容器类可 以使用包装类(integer,double等),以便把基本类型放入其中. list set map 都可以自动调整容量,数组不能.
  collection表示一组对象,这些对象也称为collection的元素。一些 collection允许有重复的元素,而另一些则不允许。一些collection是有序的,而另一些则是无序的。jdk中不提供此接口的任何直接实 现,它提供更具体的子接口(如 set 和 list)实现.
  map 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值.map 接口提供三种collection视图,允许以键集、值集合或键值映射关系集的形式查看某个映射的内容。某些映射实现可明确保证其顺序,如 treemap(有序) 类;某些映射实现则不保证顺序,如 hashmap(无序) 类。map可以像数组那样扩展成多维数组,只要把每个值也做成一个map就行了.
  collection和map是java容器中的两种基本类型. 区别在于容器中每个位置保存的元素个数.collection每个位置只能保存一个元素,包括list和set.其中list以进入的顺序保存一组元素; 而set中的元素不能重复.arraylist是一种list,hashset是一种set,将元素添加入任意collection都可以使用add() 方法.map保存的是健值对.使用put()为map添加元素,它需要一个健和一个值作参数.
  arraylist和linkedlist都实现了list接口,arraylist底层由数组支持linkedlist由双向链表支持,因此,如果经常在表中插入或删除元素linkedlist比较适合,如果经常查询arraylist比较适合.
  set的实现有treeset,hashset,linkedhashset,hashset查询速度最快,linkedhashset保持元素插入次序,treeset基于treemap,生成一个总是处于排序状态的set.
  collection<–list<–vector
  collection<–list<–arraylist
  collection<–list<–linkedlist
  collection<–set<–hashset
  collection<–set<–hashset<–linkedhashset
  collection<–set<–sortedset<–treeset
  vector : 基于array的list,其实就是封装了array所不具备的一些功能方便我们使用,它不可能走入array的限制。性能也就不可能超越array。所以,在可能的情况下,我们要多运用array。另外很重要的一点就是vector“sychronized”的,这个也是vector和arraylist的唯一的区别。
  arraylist:同vector一样是一个基于array上的链表,但是不同的是arraylist不是同步的。所以在性能上要比vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
  linkedlist:linkedlist不同于前面两种list,它不是基于array的,所以不受array性能的限制。它每一个节点(node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextnode)。所以当对linkedlist做添加,删除动作的时候就不用像基于array的list一样,必须进行大量的数据移动。只要更改nextnode的相关信息就可以实现了。这就是linkedlist的优势。
  list总结:
  1. 所有的list中只能容纳单个不同类型的对象组成的表,而不是key-value键值对。例如:[ tom,1,c ];
  2. 所有的list中可以有相同的元素,例如vector中可以有 [ tom,koo,too,koo ];
  3. 所有的list中可以有null元素,例如[ tom,null,1 ];
  4. 基于array的list(vector,arraylist)适合查询,而linkedlist(链表)适合添加,删除操作。
  hashset:虽然set同list都实现了collection接口,但是他们的实现方式却大不一样。list基本上都是以array为基础。但是set则是在hashmap的基础上来实现的,这个就是set和list的根本区别。hashset的存储方式是把hashmap中的key作为set的对应存储项。看看hashset的add(object   obj)方法的实现就可以一目了然了。
  public boolean add(object obj)
  {
  return map.put(obj, present) == null;
  }
  这个也是为什么在set中不能像在list中一样有重复的项的根本原因,因为hashmap的key是不能有重复的。
  linkedhashset:hashset的一个子类,一个链表。
  treeset:sortedset的子类,它不同于hashset的根本就是treeset是有序的。它是通过sortedmap来实现的。
  set总结:
  1. set实现的基础是map(hashmap);
  2.   set中的元素是不能重复的,如果使用add(object obj)方法添加已经存在的对象,则会覆盖前面的对象;

java能否继续保持在开发领域的领导地位


 oracle对sun的收购引发了人们对java未来的一丝担心,oracle能否继续保持java的开放性,面对ruby、python或php等一批轻量型语言的崛起,java能否继续保持其在开发领域的领导地位?14年前,sun公司的一位营销天才把一门试验性的跨平台语言由象征踏实的oak(橡树),改名为香气四溢的java(咖啡)时,可能他没有想到这 门语言能有后来的辉煌。事实上,如果现在sun想为这门语言改名,以准确体现其在计算机行业的地位,似乎oak更形象。

  今天,虽然java语言并非真正意义上的遍地开花,但它已经出现在众多场合和设备中,而且它享有运行稳定、设计精良的美名; java代码也许无法主导所有计算机或所有平台,但它离成为通用语言已近在咫尺。

  java之父詹姆斯戈斯林(james gosling)在oracle主办的openworld大会上登台发言时阐述了这一点。他调出javafx幻灯片,上面是一连串统计数字:超过8.5亿 个具有java功能的桌面机和大约100亿个具有java功能的设备。实际上,java虚拟机在电子设备中司空见惯:电子书阅读器kindle、蓝光磁盘 播放机和智能电话(包括不太智能的手机)等。iphone(手机上网)应用程序可以在成千上万部iphone上运行,但java嵌入在26亿部手机上,从 不太智能、20美元就能买到的手机,到最新一代的黑莓和android手机无一不包。

  请戈斯林到openworld大会上演讲,只是oracle掌门人拉里埃利森(larry ellison)希望向工程师们一再保证这门语言前途光明的手段之一。oracle想要并购sun,但它仍得等待欧洲监管部门批准这一决策。美国政府已开 了绿灯,但欧洲政府官员由于担心mysql的发展还没有同意这一起交易。戈斯林和sun董事长麦克尼利(mcnealy)都表示,一旦并购工作完 成,java会从oracle得到比以往更多的关注和资源。

  从近期来看,埃利森传达的信号也许不是很重要,因为如今java已成气候,要改变发展方向也并不容易。当然,也有一些人认为,oracle的商业模式太不一样了,所以它必然会对java生态系统的每个部分进行重大变化。总体来说,每拿出一个java可能变化的理由,就有同样充足的理由表明 oracle可能还是希望保持现状。

  企业级应用是主战场

  java最先在服务器端找到了自己的位置,未来这个领域仍是有望看到java虚拟机的主要地方。对oracle的所有产品来说,大型服务器也是主要 的安身之处,所以出现这对组合自在情理当中。虽然php编程员青睐mysql,但对数据密集型的企业应用来说,许多最要紧的项目还是使用基于oracle 的架构封装而成的java,这种情况应该不会很快发生变化。

  sun称,glassfish应用服务器每个月的下载量超过100万人次,tomcat等比较旧的平台仍然很常见。由于java这项技术备受推崇、运行速度快、真正跨平台,大型企业(如银行和保险公司)对java开发人员求之若渴。

  不过,java不再被认为是最新最酷的语法。一些编程员对静态类型语言的结构满腹牢骚,纷纷改用更新颖或更简单的语言,比如ruby、python 或php。现在许多较简单的web应用程序就是用这些语言开发而成的,因为它们编写的代码容易修改,能快速建立原型。然而,这些使用便捷的新语言常常离不 开java: ruby开发人员常常使用jruby(基于java实现的ruby语言),因为java虚拟机能够更出色地处理繁重任务、释放多个线程。jython(基 于java实现的python语言)也相似。

  java现在正在加入一些最新的编程技术,以此遏制这些新语言大举入侵。grails明显模仿了ruby on rails的许多简单的说明性模式;grails这种框架利用名为hibernate的数据库中间件,把groovy等脚本插件结合起来。groovy本 身添加了众多的动态选项便于代码解释,同时可以直接链接至java应用编程接口(api)的任何部分。甚至不需要考虑python或ruby,因为 groovy凭借一种精巧、现代的语法,让java编程员可以使用似乎变化无穷的庞大库和底层稳若磐石的虚拟机。

  走上移动之路

  java手机的数量(估计约26亿部)委实惊人,因为市面上许多最简单的手机里面都运行java平台微型版(java me)。这让wattpad.com等公司得以构建在整个第三世界都能顺畅运行的文档阅读平台。

  不过,运行java的智能电话数量相对少一点。iphone的巨大成功激励许多人重新学习objective c,这门语言让编程员对于内存使用等一些系统问题提高了控制能力。java为编程员隐藏了大部分底层问题,这是个优点,但前提是不需要管理内存等资源,因 为要是垃圾收集出现一个小失误,有些游戏就运行不了。可遗憾的是,因为电池续航时间是极其重要的一个因素,智能电话需要比几乎其他任何平台更严格的资源管 理。

  不过,java编程员仍然很吃香,因为黑莓手机在其新平台上继续采用java me:它为手机的情景模式(profile)添加了支持触摸屏和方向感应器的功能。而android存在不可预知的因素。由于谷歌开放了android的 使用,许多手机厂商搭上android这辆彩车。

  谷歌的android建立在开源apache harmony及其类上,而不是建立在sun开发的java开发工具包(jdk)和java me上。对使用eclipse编写代码的人来说,它们看上去几乎一模一样。在其他许多情况下也无关紧要,因为android开发使用了很多xml表单,但 如果这两套开发框架离对方渐行渐远,这种分裂可能会变成大问题。

     

 收复桌面阵地

  大多数人仍然认为java在桌面端从来没有取得成功,这是过去。如今,java正在缓慢而稳步地渗入到现代操作系统的各个角落。虽然用swing编 写的标准应用程序因试图定位在每个平台的最基本部分而继续遭殃,但是有了像javafx和web start这些比较新的开发平台和框架,就有可能通过web有效地部署软件。本地平台可处理java归档(jar)的所有缓存工作。只要点击链接,有时偶 尔随后点击几下授予权限的对话框,软件就可以安装及更新,还可以随时运行。

  javafx仍然是一个名副其实的未知因素。图形功能现在可与adobe的flash相竞争;计算引擎可支持大部分的java api,但这门语言是一门奇怪的混合语言,融合了正宗java、javascript及其他的一些标记语言。其代码比正规的java简单,所以java编 程员又要学习新的东西。不过,对极具互动性的桌面工具而言,新的动画类也许值得花时间学习。web start正在继续慢慢改进通过浏览器直接把软件部署到桌面的功能。

  抢占嵌入式领域

  java还在人们最预料不到的地方茁壮成长。虽然c编程人员可能从来不会承认java虚拟机巧妙处理存储区、快速运行的功能,但java在非智能手 机、机顶盒、嵌入式芯片、kindle及其他低功耗设备取得的成功表明:java虚拟机完全有能力在嵌入式应用方面一展身手。java的普及性还帮助编程 人员从大平台迁移到小平台。虽然为大型机开发企业级应用软件改成开发小型嵌入式代码并不简单,但java标准大大简化了这种转变,这让其他许多工具自叹弗 如。

  java程序包也在变得越来越小巧。戈斯林用尘埃来形容一台硬币大小、能够识别java的计算机。javacard是面向这类小型程序包的一种虚拟 机和api,它即将迎来3.0版,这个里程碑式版本将增添网络连接功能。尽管这些小不点还没有小得足以放入到人的眼睛中,但直接与互联网通话的功能却让它 们显得极具诱惑力。

  合作伙伴会分道扬镳?

  所有开发人员的最大担心是:要是oracle收购sun的交易尘埃落定,会出现什么样的利益冲突变化?oracle是靠收取大笔的软件许可费成长壮 大,其软件可运行在客户想要购买的任何硬件上。而另一方面,sun通常是免费赠送软件,然后通过销售服务器赚到一些钱。这些经销策略也许不会立即发生变 化,因为惯性实在太太了,但谁也不知道将来oracle会做出怎样的决策。

  一些人认为,oracle过去在收取大笔许可费方面屡试不爽,只会鼓励埃利森对sun采取类似的手法。也许oracle的销售团队眼下就在垂涎这个 机会:针对java以前免费的地方开始逐步提高许可费。为了避免重新编写java平台企业版(java ee)应用软件,许多企业很可能宁可支付每个cpu 100美元、200美元甚至100万美元的费用。

  批评人士指出,oracle很容易开发出新版java虚拟机,针对不同的市场推出不同的性能级别。桌面虚拟机可能保持免费,oracle甚至可能会 掏钱请电脑厂商来推销java和javafx,而处理极限多线程方面的性能改进可能会收取非常高的费用。从用户身上捞钱有好多法子,许可费相比之下往往便 宜得多:要是让拒不服从的编程员先学习一门新语言,然后重新编写代码库,那成本高多了。

  但也有人认为,oracle也许不会采用这一招。一名接近sleepycat(这家开源数据库公司在2006年被oracle收购)的消息人士表 示,oracle已把技术队伍的规模扩大了约一倍,而所有双许可模式原封不动。软件仍然采用开源或商业许可证这两种形式。如果oracle像 sleepycat那样对待java,社区许可及其他方案仍然会跟以前一样免费、随处可得,同时有更多的工程师来改进代码。

  与其他各大java合作伙伴的长期关系方面仍存在更深层的问题。谷歌继续支持apache harmony,这个代码超过125万行的项目似乎一心要破坏sun作为世界中心的地位。ibm输掉了争夺sun的竞标战,现在发现竞争对手oracle 的实力更强劲了。ibm设计了eclipse开发工具,可能也会开始把java平台带往另一个方向。

  其他合作伙伴的态度比较激烈。sap公司首席技术官vishal sikka一再要求sun发布java社区进程(jcp),着重提到了oracle在2007年提出的方案:将控制权交由一家开放、独立、与厂商中立的标 准组织,标准组织的所有成员在机会均等的前提下参与。虽然oracle对相关细节基本保持缄默,但可以认为,这家公司会因为从sun承袭过来的一些观点而 重新赢得尊重。

  但是,尽管其他合作伙伴可能会参与恫吓的举动,但他们可能会考虑度的问题,因为大家其实是相互牵制的,任何过激的行为都极可能会被阻止,因为大家都 认识到一次编写、到处运行理念具有的优势。如果为android手机编写的代码无法很容易地迁移至索尼蓝光播放机或glassfish服务器,另一门语言 就有机会应运而生。实际上已经有多家公司在编写工具包,让用户可以在iphone上轻松运行ruby on rails或python软件。

  另外,许多这些比较新的语言可能会成为不可小觑的竞争对手,而暗斗过多只会帮助它们攻城掠地。现在有几十种非常好、知名度小一点的开源程序包,只要 忠实的爱好者稍加转换,通常就能把它们移植到每个平台上。比如,python已经是一些科学领域的主要语言,谷歌选择python、而不是java作为其 应用引擎(app engine)支持的第一种语言。虽然ibm、oracle和谷歌在争夺主导权的竞争中可能会相互排挤,但它们必须认识到:所有人都受益于标准化,而不是 垄断。要是谁敢过于排挤别人、企图一手控制java,其他厂商可能会奔向其竞争对手。

  java也开应用程序商店?

  java代码库仍相当有凝聚力、相对标准化,这个事实惹得众人猜测:sun(如果合并案完成,还有oracle)到底会怎样利用java的普及性来 大发其财,又不提高许可费、挤压每个人?如果有人开发出一种面向整个java生态系统的应用程序商店(app store),从而像销售面向iphone的应用程序那样销售用java编写的小组件(widget)它们可以在桌面、手机、蓝光播放机或可以使用 java的其他任何平台上运行,将会怎么样?

  最近已经有了面向android手机的一批数量可观的应用程序,sun也在谋划一家java商店,好让人们只需把应用程序拖到桌面上,或者只要再编 一点代码,就可以把各应用程序结合起来,从而让它们可以在java世界的几乎每个角落里运行。不过,处理截然不同的屏幕和用户界面还是个挑战。

  设想一下这种场景有多吸引人:开发人员编写的某个应用程序在android手机上运行着,他在办公桌面上处理任务,回到家后在客厅的蓝光播放机上顺畅运行。

  把java应用程序带到坐沙发的人面前甚至有点出人意料,因为java这门语言在被叫做oak的早期阶段,本意就是运行在机顶盒上。这种远景将依赖于java平台的最大优点:普及性和跨平台的稳定性,也许这些优点会帮助java给其发明者带来滚滚收入。

Java Web应用开发中的一些概念解读


概念一直是学习计算机软件开发中经常遇到的问题,也是软件行业最喜欢创造的东西。很多时候,学习计算机软件开发遇到困难都是因为对某些概念的不理 解,而不是因为技术本身有多么复杂。java web作为java ee技术体系的一部分,应该是目前所有web开发技术中最复杂的一种,很多初学者,或者是从asp、php转移过来的开发者都会遇到概念方面的困难。

其实很多概念都是非常简单的,只是因为厂家为了宣传需要,将概念复杂化、学术化,导致学习者觉得这些概念非常深奥,难以理解。在这里,我们首先去澄清 java web开发中几个常用的基本概念。当然理解这些概念的前提是需要你具备一定的计算机系统、面向对象等方面基础知识。

1、web容器

所有的程序运行都需要有一个必要的运行环境。这个环境可以是软件,也可以是硬件,或者是软件和硬件的结合。比如说windows操作系统需要运行在硬件基础上;office软件需要运行在操作系统上。 并且程序与运行环境之间会有一定的数据交换,比如操作系统会将运行指令传递给硬件,硬件也会将指令运行结果传递给操作系统。java web程序也需要一个运行环境才能够执行。这种运行java web程序的环境被称为web容器,java web程序与web容器之间存在数据交互。目前主要存在两种类型的java web容器:一种是独立的java web容器,在这种容器里面只能运行web程序,这种容器一般也叫做web服务器,如tomcat等;另一种是与其他java ee容器混合在一起的web容器,web容器负责运行web程序,其他容器负责运行ejb等程序,如weblogic等。

当用户通过浏览器等web客户端软件向服务器发 出一个请求之后,首先接收到这个请求的是web容器,web容器会将请求信息封装到一个httpservletrequest类型的java对象中,并将 对象传递给java web程序。对于每个请求,web容器还会创建一个httpservletresponse类型对象,该对象的作用是用来保存需要返回到浏览器等客户端的 内容。java web程序可以从httpservletrequest提取用户发出的请求信息,进行适当的处理之后,将处理结果放置到 httpservletresponse中,然或由web容器解析httpservletresponse对象内容,并将解析结果以浏览器能够识别的 html等格式返回给浏览器等客户端。在这个过程中,httpservletrequest和httpservletresponse就如同两条渡船,负 责在web容器和java web程序之间传递信息。需要注意的是,这两个对象仅存在于web容器和java web程序当中,与浏览器没有关系。

2、web应用

web应用,可以认为是web程序的另一个名称。缺的的定义就是运行在web容器当中的,能够完成完整功能的应用程序。java web应用由一系列编译之后的java类、静态图片、静态html文件、配置文件等构成。通过java web应用可以就收用户的输入和请求,并对请求信息进行加工处理、访问数据库、对用户的请求给出回应。开发java web应用程序处理需要遵守web应用的一些特殊规范要求以外,与开发其他类型的应用程序并没有本质区别。目前web应用主要有两种类型:一种是以展示为 目的的web应用,这种应用会以html等标记文本或者浏览器所能识别的媒体格式最为请求返回内容,用户可以通过浏览器等客户端操作这类应用。另一类是以 服务为目的的web应用,这类应用不提供图形操作界面,只提供方法调用结构,比如web服务,该类应用一般只能被其他应用程序调用和访问。

3、web元件

web元件是构成web应用,能够对来自浏览器等客户端请求做出回应的基本单元。在java web应用中,所提供的web元件有servlet、javaserver pages(jsp)、javaserver faces(jsf)等。另外还可以使用其他类型web应用同样使用的内容,比如html文件、静态图片等。事实上java web只提供了一种web元件元件,就是servlet,jsp、jsf等都是基于servlet的衍生技术。servlet实质就是一个有特殊继承关系 要求的java类,理解servlet就基本上完全理解java web技术了。

4、web模块

在java ee技术体系中,除了java web以外,还包括ejb等其他技术。每个技术体系会运行在各自的容器当中,不同的部分组合在一起构成完整的java ee应用,每个部分根据自己的特点被称为java web模块或者ejb模块。之所以把他们称为模块,是因为希望java ee应用不同部分能像积木一样组合出更大、更复杂的应用出来,并且每个部分保证其独立性。不同的模块都有自己特定的目录结构要求。java web模块的目录结构要求如下:

◆应用文档根目录。改目录是java web模块的最上层目录,组成web模块的所有web元件以及配置文件等都包含在该目录或者子目录下。在改目录下可以直接存放html文件,图片文件等。

◆web-inf目录。改目录位于应用文档根目录下,用来保存那些不希望被浏览器等客户端访问的文件,比如发布描述文件、编译之后的类文件。因为这些文件是由由web容器进行解释或者执行的。浏览器不可以直接看到这些文件,只能看到这些文件的执行结果。

◆web.xml文件。该文件位于web-inf目录下,是web应用的部署描述文件,用来与定义web应用运行相关的信息,比如执行逻辑,servlet等web元件的访问路径等。改文件的格式必须符合所使用的servlet版本的规格要求。

◆classes目录。该目录位于web-inf目录下,用来保存编译之后的java类文件,比如servlet、辅助类、其他业务处理类等。

◆tags目录。该目录位于web-inf目录下,用来保存那些标签库的标签描述文件。

◆lib目录。该目录位于web-inf目录下,用来保存web应用运行所依赖的,经过打包之后的java类文件。打包格式一般是.jar格式。

对于java web模块目录中web-inf、web.xml、classes、tags、lib这些内容以外,用户可以根据自己的需要在web应用文档根目录下创建 其他目录,比如可以为图片、不同用途的html或者jsp单独创建目录;还可以为不用的java类在classes下创建包目录。如果在你的web应用中 没有使用到servlet、过滤器、监听器等java web元件,可以没有web.xml文件;如果没有使用到标签,则可以没有tags目录。

web模块的发布工作,可以直接以目录的形式发布,也可以打包成jar格式文件进行发布。因为用途和内容的特殊性,打包文件的扩展名会采用.war而不是.jar。另外如果不是发布到独立的web服务器上,而是发布到与其他java ee一起使用的企业应用服务器上,还需要编写一个与企业应用服务器相关的配置文件,这个文件对于不同的企业应用服务器也不同,比如发布到glassfish服务器上,需要编写的文件时sun-web.xml。

浅谈Java最终胜出的8大技术优势


1.免费!

sun(虽然现在已被甲骨文收购但我还是喜欢说sun)免费提供用来开发java应用程序的一切,你不必付任何的版税。或许你会将信将疑:资本家搞共产了?实际上,sun在java上的收益确实不大,远远比不过垄断java应用服务器技术的ibm和bea公司,似乎有替别人做嫁衣之嫌。对此,sun董事长、总裁兼首席执行官scott mcnealy是这样解释的:“sun并没有用java赚钱,这就像使用英语不用上税一样,sun并不通过java本身来盈利,而是把java应用到了业务中。”原来是放长线钓大鱼!

与java本身相比,java api更是可贵的免费财富。想使用socket操作网络?api中有;想连接到sql数据库?api中有;想给应用程序一个漂亮的用户界面?api中有;想要处理数字图形、播放音乐、解析字符串或者创建数字签名?api中全都有。

最后,java发展了那么多年,优秀的java教程、技术网站数不胜数。bruce eckel大师的名作java编程思想(thinking in java)更是不可不读的佳作,许多狂热爱好者甚至把它当做圣经一样一页一页仔细揣摩。你可到作者的主页http://www.bruceeckel.com免费下载此书的电子版。机械工业出版社也有引进台湾技术作家候捷的中译本,可惜不是免费。

或许你会问,有了那么多优秀的教程,还要你这个java咖啡馆干什么呢?嗯哼,虽然那些教程和技术文章是如此优秀,但并不适合初学者。java咖啡馆目的就在于帮助你打好java技术的基础,掌握java技术的主要脉络,帮助你迈出进入java世界的第一步!

2.跨平台

“一次编写,随处运行”,java系统可以运行在不同的操作系统和硬件上。随着linux的持续增长以及mac osx完全支持java技术,跨平台的特性变得越来越有分量。

由于java跨平台,java api自然也是平台统一的。对程序员而言,没有比统一的api函数能够让他们更欣慰的了——已经有了圆形的轮子,何必再从头发明轮子呢?我们拿java api与c 的类库相比便可以知道它的可贵之处。有windows编程经验的c 程序员肯定经历过被mfc(microsoft foundation classes,微软基类库)折磨的日子,学习曲线陡峭,没有若干个月根本无法开始生产,一段时间不接触遗忘率又高。据说,即使在微软公司内部,除了 mfc开发小组,谁都不乐意用它。即便你熟悉了mfc,能够顺利开发windows应用程序,如果你要编写一个linux应用程序,mfc又派不上用场了,你必须学习linux下c 开发的一套库函数。还有unix、freebsd、mac os……你学得过来吗?反观java api,操作系统,你爱谁是谁,只要编写一次便可随处运行!

3.在学术界获得了强有力的支持

由于免费、跨平台、java语言本身技术先进,在高校中,java 已经成为许多学科研究、课程和计算的首选语言,用java做上机作业,一般都是鼓励的。据我所知,北大、清华许多院系的研究生入学考试都可以用java语言答题。实际上,用java来完成这些工作,大多数情况下要比用c或其他语言简洁得多,你可以把注意力集中在算法等核心部分,从而获得更高分数。

掌握java技术的学生一般有更多的工作机会课余兼职,拿到更高报酬,不但减轻家里的负担,更可以让自己早日进入社会锻炼。所以,如果你还在求学,学习java,一定没错的。

4.简单

与c 等语言相比较,语法上java是简单的。

谢天谢地,java提供了垃圾回收机制。以往c 的开发中,最容易出错误的地方便是内存管理,申请的内存用完以后必须释放,否则可使用的内存资源越来越少,直至耗尽系统资源而造成死机。而java系统中,你可以任意申请内存,java系统会在适当的时候自动释放无用的内存资源。这个神奇的机制叫做“垃圾回收”,节约了许多调试错误的时间。

在java中,要写出低劣的代码也不是一件容易的事情。一方面,垃圾回收机制堵住了内存泄漏的可能性,另一方面就是异常捕捉机制,它强迫你做最坏的打算。编写程序时,难免会遇到一些意外,比如文件无法打开、网络读取失败等特殊情况。在c 等语言中是依靠返回值来判断的,如果一句句地检查返回值,那实在是太麻烦了。从而,程序员习惯性地忽略返回值的检查,并安慰自己一切都会好起来的。这便埋下了隐患。在java中,java的方法可以抛异常,而你必须应答异常,即使你不想进行任何操作。比如编写打开文件的代码,你不得不响应异常以防意外发生,否则程序根本不能够通过编译。未雨绸缪,使得 java系统更稳健。

5.企业应用的成熟平台

这是java技术目前最活跃的两大领域之一。我们在前面java技术介绍中已经提到了不少,这里仅关注跟我们切身相关的优势。

java技术的企业应用旨在提升企业竞争力,所以java技术受到了企业的欣赏,市场份额是同类技术中最大的。同时,java开放标准,所以供应商众多。市面上有许多的应用服务器、工具与构件可以选择,从高端的bea weblogic、ibm websphere等商业软件,到tomcat、jboss等开源的免费工具,一应俱全。作为java技术的初学者,不需要任何花费就能够进行java企业应用的自我培训,以后若参与java的商业项目开发,便可以无缝地把软件移植到高端的商业平台上去。反观.net,想免费自学,不盗版是不可能的啦。

最后谈谈java和web服务。web服务是软件互操作历史上的里程碑,是技术发展的重要方向,是你绝不能不了解的技术。sun公司是java 语言的发明者,而作为一个开放的跨平台的技术体系,java在web服务的开发方面起着非常重要的作用。sun被接纳为促进web服务交互组织ws-i的董事成员后,作为活跃的参与者和业界的领导者,对web服务互操作性的促进,有着相当重要的意义,也为java技术的含金量加上了关键的砝码。

6.无线应用

这是java技术目前最活跃的另一个领域,旨在提供更多、更方便的个性化服务的java手机应用。未来几年内,势必将出现移动通讯运营商和移动设备应用软件的巨大商机和激烈竞争,并且该趋势很可能与电子政务、电子商务等其他发展相互影响。java在手机市场的专有性和java本身的开放性和标准性,使得越来越多的企业加入了java阵营。

中国也不例外。2003年james gosling博士首次来到中国,其中重要的一项工作便是与中国联通结盟。

黄糖故事

java之父——james gosling博士

james gosling博士以“java技术之父”闻名于世。他是java技术的创始人,作为sun研究院院士,亲手设计了java语言,完成了java技术的原始编译器和虚拟机。在他的带领下,java现已成为互联网的标准编程模式以及分布式企业级应用的事实标准,其跨平台的技术优势为网络计算带来了划时代的变革。目前,gosling博士积极致力于软件开发工具的研究,以使软件开发工具的功能更强大,更容易为开发人员所使用,确保应用、服务开发的迅速完成。

实际上,手机游戏开发也是一项不错的职业与机遇,成功的例子已经不在少数哦。

7.开放的java社团——java community process,jcp

jcp是一个让java出名的功臣。jcp创造了一个开放型论坛,让同好在此交换意见,探索、定义新的平台,群策群力。java欢迎竞争,因为只有这样才能最大限度地提高领域内的技术,这点与对手微软.net技术大相径庭。在java的舞台上有很多演员,任何人都可以参与到jcp的过程中去,帮助sun决定java的发展和未来,同时也挑战自己的影响力。从而,你可以发现java世界中新的名词层出不穷,远远走在规范之前。而在微软.net技术的舞台上,你只能看到一个演员,那就是微软自己。 还有现在的java技术交流论坛,j道等等。。。都是很不错错的开放社区。

8.开源组织或者非盈利机构的支持

开源组织是无政府主义的梦想——没有政体,没有所属权,言论与行动自由,仅仅依靠渴望共享与交流的信仰及无私奉献来维系。java世界中,开源组织与非盈利机构发挥到了极致,许多出色的工具都出自它们之手。比如junit、cactus、tomcat、struts、jboss、 eclipse、ant、xerces、hibernate、axis、aspectj等等,许多工具还会出现在我们的咖啡馆中,扮演重要的角色。

java世界中,便宜无好货绝对不成立,这些工具拥有足以和商业软件媲美的质量,很多商业ide还集成了这些工具。对java程序员而言,生活不单单会变得轻松,更重要的,你能够看到希望,有为大家贡献自己力量的机会!

计算机等级考试二级Java知识点:Vector类


感谢大家对本系列文章的关注,本章我们将继续为正在备考计算机等级考试的同学提供《计算机等级考试二级java知识点》系列内容,本章为大家提供的是vector类相关知识点讲解:

  vector类与enumeration接口

  vector类用于保存一组对象,由于java不支持动态数组,vector可以用于实现跟动态数组差不多的功能。如果要将一组对象存放在某种数据结构中,但是不能确定对象的个数时,vector是一个不错的选择。

  例:将键盘上输入的一个数字序列的每位数字存储在vector对象中,然后在屏幕上打印出各位数字相加的结果。

  import java.util.*; //vector类和enumeration接口都在这个包中

  public class testvector

  {

  public static void main(string[] args)

  {

  vector v=new vector();

  int b=0;

  int num=0;

  system.out.println(\”please enter number:\”);

  while(true)

  {

  try

  {

  b=system.in.read(); //从键盘读入一个字节内容

  }

  catch(exception e)

  {

  e.printstacktrace();

  }

  if(b==\’\\r\’||b==\’\\n\’) //如果是回车或换行的话,则退出while循环,即一串数据输入完成

  {

  break;

  }

  else

  {

java 中的中文排序问题及解决方案


我们在应用程序中可能会经常遇到对中文排序的问题,例如姓名列表,词汇表等等。对中文排序,我们使用比较多的是根据汉语拼音发音来确定顺序。

我们可能会经常使用
java.util.set
 接口,
java.util.arrays.sort((t[] a, comparator<? super t> c))
 等类或方法对含有中文字符的对象进行排序,但是这些在默认情况下都是调用
string.compareto(string)
方法,这个方法是比较2个字符的 codepoint value,如果第一个字符的值小于第二个,则在排序结果中第一个会在前面,反之亦然。

java.text.collator
接口及其实现类

其实 java 中提供了和语言相关的类,即 collator 接口及其实现类。
java.text.rulebasedcollator
 是一个具体类,它实现了 comparator 接口中的 compare(object, object) 方法。rulebasedcollator 根据根据特定语言的默认规则比较字符,也可以按照指定的规则来比较,请参阅 java api 获取此类的详细信息。
如果我们需要对一个有中文的数组进行排序,则可以使用这个类。请看如下示例代码:

import java.util.*;
import java.text.*;
public class test
{
        string [] test = new string[] {
                \”作业\”,
                \”测试\”,
                \”test\”,
                \”我们\”,
                \”。空\”,
                \”镂空\”,
                \”[\",
                \"浏\",
                \"皙\"
        };
      java.util.arrays.sort(test, 
              (rulebasedcollator)collator.getinstance(locale.china));
      system.out.println(\"============\");
      for(string key : test)
          system.out.println(key);
}

以上代码的输出结果为:

============
[
test
。空
测试
我们
作业

镂空

大家可能会发现只有一部分汉字是按照汉语拼音排序了,还有几个没有。

问题分析:

gb2312:
在简体中文中我们使用比较多的字符集是 gb2312-80,简称为 gb2312,这个字符集包含了目前最常用的汉字共计 6736 个。其中的汉字分为两大类:

常用汉字

次常用汉字

常用汉字按照汉语拼音来排序,而次常用汉字按照笔画部首进行排序。

简体汉字在 unicode 中一般是按照 gb2312 的码点值的顺序来放置的,所以如果是常用汉字 java 就能够很准确的进行排序,但如果是次常用汉字,则就会出现问题。在以上示例中,\"镂\",\"皙\" 属于次常用字。

解决方案:

rulebasedcollator 类 getrules() 方法可以返回对应语言的规则设置。简体中文对应的规则是 gb2312 所对应的字符。

我们可以把其中的全部汉字提取出来

对这些汉字重新排序

利用rulebasedcollator(string rules) 构造器新建一个定制的 rulebasedcollator

参考代码

在以下的代码中,我把排过序的汉字直接作为 string 对象放在类里面了,如果要让代码变得简洁一些,则可以把完整的规则(特殊字符+排序汉字)存为文件。

package sorting;

import java.util.*;
import java.text.*;
/**
 * @author gaojianmin
 *
 */
public class chinesegb2312collator {
    /**
     * @return a customized rulebasedcollator with chinese characters (gb2312) sorted correctly
     * 
     */
    public static final rulebasedcollator getfixedgb2312collator()
    {
        rulebasedcollator fixedgb2312collator =null;
        try
        {
            fixedgb2312collator = new java.text.rulebasedcollator(
                    chinesegb2312collator.getgb2312specialchars()
                    gb2312chars
                    );
        }catch(parseexception e)
        {
            e.printstacktrace();
        }
        return fixedgb2312collator;
    }

    /**
     * @return the special characters in gb2312 charset.
     * 
     */
    public static final string getgb2312specialchars()
    {
        rulebasedcollator zh_cncollator = (rulebasedcollator)collator.getinstance(locale.china);
        //index 2125 is the last symbol \"╋\"
        return zh_cncollator.getrules().substring(0,2125);
    }
    
    /**
     * 6763 chinese characters in gb2312 charset
     */
    public static final string gb2312chars =
        \"<吖<阿<啊<锕<嗄<哎<哀<唉<埃<挨<锿<捱<皑<癌<嗳<矮<蔼<霭<艾<爱<砹<隘<嗌<嫒<碍<暧<瑷<安<桉<氨<庵<谙<鹌<鞍<俺<埯<铵<揞<犴<岸<按<案<胺<暗<黯<肮<昂<盎<凹<坳<敖<嗷<廒<獒<遨<熬<翱<聱<螯<鳌<鏖<拗<袄<媪<岙<傲<奥<骜<澳<懊<鏊\"
        \"<八<巴<叭<扒<吧<岜<芭<疤<捌<笆<粑<拔<茇<菝<跋<魃<把<钯<靶<坝<爸<罢<鲅<霸<灞<掰<白<百<佰<柏<捭<摆<呗<败<拜<稗<扳<班<般<颁<斑<搬<瘢<癍<阪<坂<板<版<钣<舨<办<半<伴<扮<拌<绊<瓣<邦<帮<梆<浜<绑<榜<膀<蚌<傍<棒<谤<蒡<磅<镑<勹<包<孢<苞<胞<煲<龅<褒<雹<宝<饱<保<鸨<堡<葆<褓<报<抱<豹<趵<鲍<暴<爆<陂<卑<杯<悲<碑<鹎<北<贝<狈<邶<备<背<钡<倍<悖<被<惫<焙<辈<碚<蓓<褙<鞴<鐾<奔<贲<锛<本<苯<畚<坌<笨<崩<绷<嘣<甭<泵<迸<甏<蹦<逼<荸<鼻<匕<比<吡<妣<彼<秕<俾<笔<舭<鄙<币<必<毕<闭<庇<畀<哔<毖<荜<陛<毙<狴<铋<婢<庳<敝<萆<弼<愎<筚<滗<痹<蓖<裨<跸<辟<弊<碧<箅<蔽<壁<嬖<篦<薜<避<濞<臂<髀<璧<襞<边<砭<笾<编<煸<蝙<鳊<鞭<贬<扁<窆<匾<碥<褊<卞<弁<忭<汴<苄<拚<便<变<缏<遍<辨<辩<辫<灬<杓<彪<标<飑<髟<骠<膘<瘭<镖<飙<飚<镳<表<婊<裱<鳔<憋<鳖<别<蹩<瘪<宾<彬<傧<斌<滨<缤<槟<镔<濒<豳<摈<殡<膑<髌<鬓<冫<冰<兵<丙<邴<秉<柄<炳<饼<禀<并<病<摒<拨<波<玻<剥<钵<饽<啵<脖<菠<播<伯<孛<驳<帛<泊<勃<亳<钹<铂<舶<博<渤<鹁<搏<箔<膊<踣<薄<礴<跛<簸<擘<檗<逋<钸<晡<醭<卜<卟<补<哺<捕<不<布<步<怖<钚<部<埠<瓿<簿\"
        \"<嚓<擦<礤<猜<才<材<财<裁<采<彩<睬<踩<菜<蔡<参<骖<餐<残<蚕<惭<惨<黪<灿<粲<璨<仓<伧<沧<苍<舱<藏<操<糙<曹<嘈<漕<槽<艚<螬<艹<草<册<侧<厕<恻<测<策<岑<涔<噌<层<蹭<叉<杈<插<馇<锸<查<茬<茶<搽<猹<槎<察<碴<檫<衩<镲<汊<岔<诧<姹<差<拆<钗<侪<柴<豺<虿<瘥<觇<掺<搀<婵<谗<孱<禅<馋<缠<蝉<廛<潺<镡<蟾<躔<产<谄<铲<阐<蒇<冁<忏<颤<羼<伥<昌<娼<猖<菖<阊<鲳<长<肠<苌<尝<偿<常<徜<嫦<厂<场<昶<惝<敞<氅<怅<畅<倡<鬯<唱<抄<怊<钞<焯<超<晁<巢<朝<嘲<潮<吵<炒<耖<车<砗<扯<屮<彻<坼<掣<撤<澈<抻<郴<琛<嗔<尘<臣<忱<沉<辰<陈<宸<晨<谌<碜<闯<衬<称<龀<趁<榇<谶<柽<蛏<铛<撑<瞠<丞<成<呈<承<枨<诚<城<乘<埕<铖<惩<程<裎<塍<酲<澄<橙<逞<骋<秤<吃<哧<蚩<鸱<眵<笞<嗤<媸<痴<螭<魑<弛<池<驰<迟<茌<持<匙<墀<踟<篪<尺<侈<齿<耻<豉<褫<彳<叱<斥<赤<饬<炽<翅<敕<啻<傺<瘛<充<冲<忡<茺<舂<憧<艟<虫<崇<宠<铳<抽<瘳<仇<俦<帱<惆<绸<畴<愁<稠<筹<酬<踌<雠<丑<瞅<臭<出<初<樗<刍<除<厨<滁<锄<蜍<雏<橱<躇<蹰<杵<础<储<楮<楚<褚<亍<处<怵<绌<搐<触<憷<黜<矗<搋<揣<啜<嘬<踹<巛<川<氚<穿<传<舡<船<遄<椽<舛<喘<串<钏<囱<疮<窗<床<创<怆<吹<炊<垂<陲<捶<棰<槌<锤<春<椿<蝽<纯<唇<莼<淳<鹑<醇<蠢<踔<戳<辶<绰<辍<龊<呲<疵<词<祠<茈<茨<瓷<慈<辞<磁<雌<鹚<糍<此<次<刺<赐<从<匆<苁<枞<葱<骢<璁<聪<丛<淙<琮<凑<楱<腠<辏<粗<徂<殂<促<猝<酢<蔟<醋<簇<蹙<蹴<汆<撺<镩<蹿<窜<篡<爨<崔<催<摧<榱<璀<脆<啐<悴<淬<萃<毳<瘁<粹<翠<村<皴<存<忖<寸<搓<磋<撮<蹉<嵯<痤<矬<鹾<脞<厝<挫<措<锉<错\"
        \"<哒<耷<搭<嗒<褡<达<妲<怛<沓<笪<答<瘩<靼<鞑<打<大<呆<呔<歹<傣<代<岱<甙<绐<迨<带<待<怠<殆<玳<贷<埭<袋<逮<戴<黛<丹<单<担<眈<耽<郸<聃<殚<瘅<箪<儋<胆<疸<掸<旦<但<诞<啖<弹<惮<淡<萏<蛋<氮<澹<当<裆<挡<党<谠<凼<宕<砀<荡<档<菪<刀<刂<叨<忉<氘<导<岛<倒<捣<祷<蹈<到<悼<焘<盗<道<稻<纛<得<锝<德<的<灯<登<噔<簦<蹬<等<戥<邓<凳<嶝<瞪<磴<镫<低<羝<堤<嘀<滴<镝<狄<籴<迪<敌<涤<荻<笛<觌<嫡<氐<诋<邸<坻<底<抵<柢<砥<骶<地<弟<帝<娣<递<第<谛<棣<睇<缔<蒂<碲<嗲<掂<滇<颠<巅<癫<典<点<碘<踮<电<佃<甸<阽<坫<店<垫<玷<钿<惦<淀<奠<殿<靛<癜<簟<刁<叼<凋<貂<碉<雕<鲷<吊<钓<调<掉<铞<爹<跌<迭<垤<瓞<谍<喋<堞<揲<耋<叠<牒<碟<蝶<蹀<鲽<丁<仃<叮<玎<疔<盯<钉<耵<酊<顶<鼎<订<定<啶<腚<碇<锭<丢<铥<东<冬<咚<岽<氡<鸫<董<懂<动<冻<侗<垌<峒<恫<栋<洞<胨<胴<硐<都<兜<蔸<篼<斗<抖<钭<陡<蚪<豆<逗<痘<窦<嘟<督<毒<读<渎<椟<牍<犊<黩<髑<独<笃<堵<赌<睹<芏<妒<杜<肚<度<渡<镀<蠹<端<短<段<断<缎<椴<煅<锻<簖<堆<队<对<兑<怼<碓<憝<镦<吨<敦<墩<礅<蹲<盹<趸<囤<沌<炖<盾<砘<钝<顿<遁<多<咄<哆<裰<夺<铎<掇<踱<朵<哚<垛<缍<躲<剁<沲<堕<舵<惰<跺\"
        \"<屙<讹<俄<娥<峨<莪<锇<鹅<蛾<额<婀<厄<呃<扼<苊<轭<垩<恶<饿<谔<鄂<阏<愕<萼<遏<腭<锷<鹗<颚<噩<鳄<恩<蒽<摁<儿<而<鸸<鲕<尔<耳<迩<洱<饵<珥<铒<二<佴<贰\"
        \"<发<乏<伐<垡<罚<阀<筏<法<砝<珐<帆<番<幡<翻<藩<凡<矾<钒<烦<樊<蕃<燔<繁<蹯<蘩<反<返<犯<泛<饭<范<贩<畈<梵<匚<方<邡<坊<芳<枋<钫<防<妨<房<肪<鲂<仿<访<彷<纺<舫<放<飞<妃<非<啡<绯<菲<扉<蜚<霏<鲱<肥<淝<腓<匪<诽<悱<斐<榧<翡<篚<吠<废<沸<狒<肺<费<痱<镄<分<吩<纷<芬<氛<玢<酚<坟<汾<棼<焚<鼢<粉<份<奋<忿<偾<愤<粪<鲼<瀵<丰<风<沣<枫<封<疯<砜<峰<烽<葑<锋<蜂<酆<冯<逢<缝<讽<唪<凤<奉<俸<佛<缶<否<夫<呋<肤<趺<麸<稃<跗<孵<敷<弗<伏<凫<孚<扶<芙<芾<怫<拂<服<绂<绋<苻<俘<氟<祓<罘<茯<郛<浮<砩<莩<蚨<匐<桴<涪<符<艴<菔<袱<幅<福<蜉<辐<幞<蝠<黻<呒<抚<甫<府<拊<斧<俯<釜<脯<辅<腑<滏<腐<黼<阝<父<讣<付<妇<负<附<咐<阜<驸<复<赴<副<傅<富<赋<缚<腹<鲋<赙<蝮<鳆<覆<馥\"
        \"<旮<伽<钆<尜<嘎<噶<尕<尬<该<陔<垓<赅<改<丐<钙<盖<溉<戤<概<干<甘<杆<肝<坩<泔<苷<柑<竿<疳<酐<尴<秆<赶<敢<感<澉<橄<擀<旰<矸<绀<淦<赣<冈<刚<岗<纲<肛<缸<钢<罡<港<杠<筻<戆<皋<羔<高<槔<睾<膏<篙<糕<杲<搞<缟<槁<稿<镐<藁<告<诰<郜<锆<戈<圪<纥<疙<哥<胳<袼<鸽<割<搁<歌<阁<革<格<鬲<葛<蛤<隔<嗝<塥<搿<膈<镉<骼<哿<舸<个<各<虼<硌<铬<给<根<跟<哏<亘<艮<茛<更<庚<耕<赓<羹<哽<埂<绠<耿<梗<鲠<工<弓<公<功<攻<供<肱<宫<恭<蚣<躬<龚<觥<廾<巩<汞<拱<珙<共<贡<勾<佝<沟<钩<缑<篝<鞲<岣<狗<苟<枸<笱<构<诟<购<垢<够<媾<彀<遘<觏<估<咕<姑<孤<沽<轱<鸪<菇<菰<蛄<觚<辜<酤<毂<箍<鹘<古<汩<诂<谷<股<牯<骨<罟<钴<蛊<鹄<鼓<嘏<臌<瞽<固<故<顾<崮<梏<牿<雇<痼<锢<鲴<瓜<刮<胍<鸹<呱<剐<寡<卦<诖<挂<褂<乖<拐<怪<关<观<官<冠<倌<棺<鳏<馆<管<贯<惯<掼<涫<盥<灌<鹳<罐<光<咣<桄<胱<广<犷<逛<归<圭<妫<龟<规<皈<闺<硅<瑰<鲑<宄<轨<庋<匦<诡<癸<鬼<晷<簋<刽<刿<柜<炅<贵<桂<跪<鳜<丨<衮<绲<辊<滚<磙<鲧<棍<呙<埚<郭<崞<聒<锅<蝈<国<帼<掴<虢<馘<果<猓<椁<蜾<裹<过\"
        \"<铪<哈<嗨<孩<骸<海<胲<醢<亥<骇<害<氦<顸<蚶<酣<憨<鼾<邗<含<邯<函<晗<涵<焓<寒<韩<罕<喊<汉<汗<旱<悍<捍<焊<菡<颔<撖<憾<撼<翰<瀚<夯<杭<绗<航<颃<沆<蒿<嚆<薅<蚝<毫<嗥<豪<嚎<壕<濠<好<郝<号<昊<浩<耗<皓<颢<灏<诃<呵<喝<嗬<禾<合<何<劾<和<河<曷<阂<核<盍<荷<涸<盒<菏<蚵<颌<貉<阖<翮<贺<褐<赫<鹤<壑<黑<嘿<痕<很<狠<恨<亨<哼<恒<桁<珩<横<衡<蘅<轰<哄<訇<烘<薨<弘<红<宏<闳<泓<洪<荭<虹<鸿<蕻<黉<讧<侯<喉<猴<瘊<篌<糇<骺<吼<后<厚<後<逅<候<堠<鲎<乎<虍<呼<忽<烀<轷<唿<惚<滹<囫<弧<狐<胡<壶<斛<湖<猢<葫<煳<瑚<鹕<槲<糊<蝴<醐<觳<虎<浒<唬<琥<互<户<冱<护<沪<岵<怙<戽<祜<笏<扈<瓠<鹱<花<华<哗<骅<铧<滑<猾<化<划<画<话<桦<怀<徊<淮<槐<踝<坏<欢<獾<还<环<郇<洹<桓<萑<锾<寰<缳<鬟<缓<幻<奂<宦<唤<换<浣<涣<患<焕<逭<痪<豢<漶<鲩<擐<肓<荒<慌<皇<凰<隍<黄<徨<惶<湟<遑<煌<潢<璜<篁<蝗<癀<磺<簧<蟥<鳇<恍<晃<谎<幌<灰<诙<咴<恢<挥<虺<晖<珲<辉<麾<徽<隳<回<洄<茴<蛔<悔<卉<汇<会<讳<哕<浍<绘<荟<诲<恚<桧<烩<贿<彗<晦<秽<喙<惠<缋<毁<慧<蕙<蟪<昏<荤<婚<阍<浑<馄<魂<诨<混<溷<耠<锪<劐<豁<攉<活<火<伙<钬<夥<或<货<获<祸<惑<霍<镬<嚯<藿<蠖\"
        \"<丌<讥<击<叽<饥<乩<圾<机<玑<肌<芨<矶<鸡<咭<迹<剞<唧<姬<屐<积<笄<基<绩<嵇<犄<缉<赍<畸<跻<箕<畿<稽<齑<墼<激<羁<及<吉<岌<汲<级<即<极<亟<佶<急<笈<疾<戢<棘<殛<集<嫉<楫<蒺<辑<瘠<蕺<籍<几<己<虮<挤<脊<掎<戟<嵴<麂<彐<计<记<伎<纪<妓<忌<技<芰<际<剂<季<哜<既<洎<济<继<觊<偈<寂<寄<悸<祭<蓟<暨<跽<霁<鲚<稷<鲫<冀<髻<骥<加<夹<佳<迦<枷<浃<珈<家<痂<笳<袈<袷<葭<跏<嘉<镓<岬<郏<荚<恝<戛<铗<蛱<颊<甲<胛<贾<钾<瘕<价<驾<架<假<嫁<稼<戋<奸<尖<坚<歼<间<肩<艰<兼<监<笺<菅<湔<犍<缄<搛<煎<缣<蒹<鲣<鹣<鞯<囝<拣<枧<俭<柬<茧<捡<笕<减<剪<检<趼<睑<硷<裥<锏<简<谫<戬<碱<翦<謇<蹇<见<件<建<饯<剑<牮<荐<贱<健<涧<舰<渐<谏<楗<毽<溅<腱<践<鉴<键<僭<槛<箭<踺<江<姜<将<茳<浆<豇<僵<缰<礓<疆<讲<奖<桨<蒋<耩<匠<降<洚<绛<酱<犟<糨<艽<交<郊<姣<娇<浇<茭<骄<胶<椒<焦<蛟<跤<僬<鲛<蕉<礁<鹪<角<佼<侥<挢<狡<绞<饺<皎<矫<脚<铰<搅<湫<剿<敫<徼<缴<叫<峤<轿<较<教<窖<酵<噍<醮<阶<疖<皆<接<秸<喈<嗟<揭<街<卩<孑<节<讦<劫<杰<诘<拮<洁<结<桀<婕<捷<颉<睫<截<碣<竭<鲒<羯<她<姐<解<介<戒<芥<届<界<疥<诫<借<蚧<骱<藉<巾<今<斤<钅<金<津<矜<衿<筋<襟<仅<卺<紧<堇<谨<锦<廑<馑<槿<瑾<尽<劲<妗<近<进<荩<晋<浸<烬<赆<缙<禁<靳<觐<噤<京<泾<经<茎<荆<惊<旌<菁<晶<腈<睛<粳<兢<精<鲸<井<阱<刭<肼<颈<景<儆<憬<警<净<弪<径<迳<胫<痉<竞<婧<竟<敬<靓<靖<境<獍<静<镜<冂<扃<迥<炯<窘<纠<究<鸠<赳<阄<啾<揪<鬏<九<久<灸<玖<韭<酒<旧<臼<咎<疚<柩<桕<厩<救<就<舅<僦<鹫<居<拘<狙<苴<驹<疽<掬<椐<琚<趄<锔<裾<雎<鞠<鞫<局<桔<菊<橘<咀<沮<举<矩<莒<榉<榘<龃<踽<句<巨<讵<拒<苣<具<炬<钜<俱<倨<剧<惧<据<距<犋<飓<锯<窭<聚<屦<踞<遽<瞿<醵<娟<捐<涓<鹃<镌<蠲<卷<锩<倦<桊<狷<绢<隽<眷<鄄<噘<撅<孓<决<诀<抉<珏<绝<觉<倔<崛<掘<桷<觖<厥<劂<谲<獗<蕨<噱<橛<爵<镢<蹶<嚼<矍<爝<攫<军<君<均<钧<皲<菌<筠<麇<俊<郡<峻<捃<浚<骏<竣\"
        \"<咔<咖<喀<卡<佧<胩<开<揩<锎<凯<剀<垲<恺<铠<慨<蒈<楷<锴<忾<刊<勘<龛<堪<戡<坎<侃<砍<莰<看<阚<瞰<康<慷<糠<扛<亢<伉<抗<闶<炕<钪<尻<考<拷<栲<烤<铐<犒<靠<坷<苛<柯<珂<科<轲<疴<钶<棵<颏<稞<窠<颗<瞌<磕<蝌<髁<壳<咳<可<岢<渴<克<刻<客<恪<课<氪<骒<缂<嗑<溘<锞<肯<垦<恳<啃<裉<吭<坑<铿<空<倥<崆<箜<孔<恐<控<抠<芤<眍<口<叩<扣<寇<筘<蔻<刳<枯<哭<堀<窟<骷<苦<库<绔<喾<裤<酷<夸<侉<垮<挎<胯<跨<蒯<块<快<侩<郐<哙<狯<脍<筷<宽<髋<款<匡<诓<哐<筐<狂<诳<夼<邝<圹<纩<况<旷<矿<贶<框<眶<亏<岿<悝<盔<窥<奎<逵<馗<喹<揆<葵<暌<魁<睽<蝰<夔<傀<跬<匮<喟<愦<愧<溃<蒉<馈<篑<聩<坤<昆<琨<锟<髡<醌<鲲<悃<捆<阃<困<扩<括<栝<蛞<阔<廓\"
        \"<垃<拉<啦<邋<旯<砬<喇<剌<腊<瘌<蜡<辣<来<崃<徕<涞<莱<铼<赉<睐<赖<濑<癞<籁<兰<岚<拦<栏<婪<阑<蓝<谰<澜<褴<斓<篮<镧<览<揽<缆<榄<漤<罱<懒<烂<滥<啷<郎<狼<莨<廊<琅<榔<稂<锒<螂<朗<阆<浪<蒗<捞<劳<牢<唠<崂<痨<铹<醪<老<佬<姥<栳<铑<潦<涝<烙<耢<酪<仂<乐<叻<泐<勒<鳓<雷<嫘<缧<檑<镭<羸<耒<诔<垒<磊<蕾<儡<肋<泪<类<累<酹<擂<嘞<塄<棱<楞<冷<愣<厘<梨<狸<离<莉<骊<犁<喱<鹂<漓<缡<蓠<蜊<嫠<璃<鲡<黎<篱<罹<藜<黧<蠡<礼<李<里<俚<哩<娌<逦<理<锂<鲤<澧<醴<鳢<力<历<厉<立<吏<丽<利<励<呖<坜<沥<苈<例<戾<枥<疠<隶<俐<俪<栎<疬<荔<轹<郦<栗<猁<砺<砾<莅<唳<笠<粒<粝<蛎<傈<痢<詈<跞<雳<溧<篥<俩<奁<连<帘<怜<涟<莲<联<裢<廉<鲢<濂<臁<镰<蠊<敛<琏<脸<裣<蔹<练<娈<炼<恋<殓<链<楝<潋<良<凉<梁<椋<粮<粱<墚<踉<两<魉<亮<谅<辆<晾<量<辽<疗<聊<僚<寥<廖<嘹<寮<撩<獠<缭<燎<镣<鹩<钌<蓼<了<尥<料<撂<咧<列<劣<冽<洌<埒<烈<捩<猎<裂<趔<躐<鬣<邻<林<临<啉<淋<琳<粼<嶙<遴<辚<霖<瞵<磷<鳞<麟<凛<廪<懔<檩<吝<赁<蔺<膦<躏<拎<伶<灵<囹<岭<泠<苓<柃<玲<瓴<凌<铃<陵<棂<绫<羚<翎<聆<菱<蛉<零<龄<鲮<酃<领<令<另<呤<溜<熘<刘<浏<流<留<琉<硫<旒<遛<馏<骝<榴<瘤<镏<鎏<柳<绺<锍<六<鹨<咯<龙<咙<泷<茏<栊<珑<胧<砻<笼<聋<隆<癃<窿<陇<垄<垅<拢<娄<偻<喽<蒌<楼<耧<蝼<髅<嵝<搂<篓<陋<漏<瘘<镂<露<噜<撸<卢<庐<芦<垆<泸<炉<栌<胪<轳<鸬<舻<颅<鲈<卤<虏<掳<鲁<橹<镥<陆<录<赂<辂<渌<逯<鹿<禄<滤<碌<路<漉<戮<辘<潞<璐<簏<鹭<麓<氇<驴<闾<榈<吕<侣<旅<稆<铝<屡<缕<膂<褛<履<律<虑<率<绿<氯<孪<峦<挛<栾<鸾<脔<滦<銮<卵<乱<掠<略<锊<抡<仑<伦<囵<沦<纶<轮<论<捋<罗<猡<脶<萝<逻<椤<锣<箩<骡<镙<螺<倮<裸<瘰<蠃<泺<洛<络<荦<骆<珞<落<摞<漯<雒\"
        \"<妈<嬷<麻<蟆<马<犸<玛<码<蚂<杩<骂<唛<吗<嘛<埋<霾<买<荬<劢<迈<麦<卖<脉<颟<蛮<馒<瞒<鞔<鳗<满<螨<曼<谩<墁<幔<慢<漫<缦<蔓<熳<镘<邙<忙<芒<盲<茫<硭<莽<漭<蟒<猫<毛<矛<牦<茅<旄<蛑<锚<髦<蝥<蟊<卯<峁<泖<茆<昴<铆<茂<冒<贸<耄<袤<帽<瑁<瞀<貌<懋<么<没<枚<玫<眉<莓<梅<媒<嵋<湄<猸<楣<煤<酶<镅<鹛<霉<每<美<浼<镁<妹<昧<袂<媚<寐<魅<门<扪<钔<闷<焖<懑<们<氓<虻<萌<盟<甍<瞢<朦<檬<礞<艨<勐<猛<蒙<锰<艋<蜢<懵<蠓<孟<梦<咪<弥<祢<迷<猕<谜<醚<糜<縻<麋<靡<蘼<米<芈<弭<敉<脒<眯<冖<糸<汨<宓<泌<觅<秘<密<幂<谧<嘧<蜜<宀<眠<绵<棉<免<沔<黾<勉<眄<娩<冕<湎<缅<腼<面<喵<苗<描<瞄<鹋<杪<眇<秒<淼<渺<缈<藐<邈<妙<庙<乜<咩<灭<蔑<篾<蠛<民<岷<玟<苠<珉<缗<皿<闵<抿<泯<闽<悯<敏<愍<鳘<名<明<鸣<茗<冥<铭<溟<暝<瞑<螟<酩<命<谬<缪<摸<谟<嫫<馍<摹<模<膜<麽<摩<磨<蘑<魔<抹<末<殁<沫<茉<陌<秣<莫<寞<漠<蓦<貊<墨<瘼<镆<默<貘<耱<哞<牟<侔<眸<谋<鍪<某<母<毪<亩<牡<姆<拇<木<仫<目<沐<坶<牧<苜<钼<募<墓<幕<睦<慕<暮<穆\"
        \"<拿<镎<哪<内<那<纳<肭<娜<衲<钠<捺<乃<奶<艿<氖<奈<柰<耐<萘<鼐<囡<男<南<难<喃<楠<赧<腩<蝻<囔<囊<馕<曩<攮<孬<呶<挠<硇<铙<猱<蛲<垴<恼<脑<瑙<闹<淖<疒<讷<呐<呢<馁<嫩<能<嗯<妮<尼<坭<怩<泥<倪<铌<猊<霓<鲵<伲<你<拟<旎<昵<逆<匿<溺<睨<腻<拈<年<鲇<鲶<黏<捻<辇<撵<碾<廿<念<埝<娘<酿<鸟<茑<袅<嬲<尿<脲<捏<肀<陧<涅<聂<臬<啮<嗫<镊<镍<颞<蹑<孽<蘖<您<宁<咛<拧<狞<柠<聍<凝<佞<泞<甯<妞<牛<忸<扭<狃<纽<钮<农<侬<哝<浓<脓<弄<耨<奴<孥<驽<努<弩<胬<怒<女<钕<恧<衄<疟<虐<暖<挪<傩<诺<喏<搦<锘<懦<糯\"
        \"<噢<哦<讴<欧<殴<瓯<鸥<呕<偶<耦<藕<怄<沤\"
        \"<趴<啪<葩<杷<爬<耙<琶<筢<帕<怕<拍<俳<徘<排<牌<哌<派<湃<蒎<潘<攀<爿<盘<磐<蹒<蟠<判<泮<叛<盼<畔<袢<襻<乓<滂<庞<逄<旁<螃<耪<胖<抛<脬<刨<咆<庖<狍<炮<袍<匏<跑<泡<疱<呸<胚<醅<陪<培<赔<锫<裴<沛<佩<帔<旆<配<辔<霈<喷<盆<湓<怦<抨<砰<烹<嘭<朋<堋<彭<棚<硼<蓬<鹏<澎<篷<膨<蟛<捧<碰<丕<批<纰<邳<坯<披<砒<铍<劈<噼<霹<皮<芘<枇<毗<疲<蚍<郫<陴<啤<埤<琵<脾<罴<蜱<貔<鼙<匹<庀<仳<圮<痞<擗<癖<屁<淠<媲<睥<僻<甓<譬<片<偏<犏<篇<翩<骈<胼<蹁<谝<骗<剽<漂<缥<飘<螵<瓢<殍<瞟<票<嘌<嫖<氕<撇<瞥<丿<苤<姘<拼<贫<嫔<频<颦<品<榀<牝<娉<聘<乒<俜<平<评<凭<坪<苹<屏<枰<瓶<萍<鲆<钋<坡<泼<颇<婆<鄱<皤<叵<钷<笸<迫<珀<破<粕<魄<剖<掊<裒<仆<攴<攵<扑<铺<噗<匍<莆<菩<葡<蒲<璞<濮<镤<朴<圃<埔<浦<普<溥<谱<氆<镨<蹼<瀑<曝\"
        \"<七<沏<妻<柒<凄<栖<桤<戚<萋<期<欺<嘁<槭<漆<蹊<亓<祁<齐<圻<岐<芪<其<奇<歧<祈<耆<脐<颀<崎<淇<畦<萁<骐<骑<棋<琦<琪<祺<蛴<旗<綦<蜞<蕲<鳍<麒<乞<企<屺<岂<芑<启<杞<起<绮<綮<气<讫<汔<迄<弃<汽<泣<契<砌<荠<葺<碛<器<憩<掐<葜<恰<洽<髂<千<仟<阡<扦<芊<迁<佥<岍<钎<牵<悭<铅<谦<愆<签<骞<搴<褰<前<荨<钤<虔<钱<钳<乾<掮<箝<潜<黔<凵<浅<肷<慊<遣<谴<缱<欠<芡<茜<倩<堑<嵌<椠<歉<呛<羌<戕<戗<枪<跄<腔<蜣<锖<锵<镪<强<墙<嫱<蔷<樯<抢<羟<襁<炝<悄<硗<跷<劁<敲<锹<橇<缲<乔<侨<荞<桥<谯<憔<鞒<樵<瞧<巧<愀<俏<诮<峭<窍<翘<撬<鞘<切<茄<且<妾<怯<窃<挈<惬<箧<锲<亲<侵<钦<衾<芩<芹<秦<琴<禽<勤<嗪<溱<噙<擒<檎<螓<锓<寝<吣<沁<揿<青<氢<轻<倾<卿<圊<清<蜻<鲭<情<晴<氰<擎<檠<黥<苘<顷<请<謦<庆<箐<磬<罄<跫<銎<邛<穷<穹<茕<筇<琼<蛩<丘<邱<秋<蚯<楸<鳅<囚<犰<求<虬<泅<俅<酋<逑<球<赇<巯<遒<裘<蝤<鼽<糗<区<曲<岖<诎<驱<屈<祛<蛆<躯<蛐<趋<麴<黢<劬<朐<鸲<渠<蕖<磲<璩<蘧<氍<癯<衢<蠼<取<娶<龋<去<阒<觑<趣<悛<圈<全<权<诠<泉<荃<拳<辁<痊<铨<筌<蜷<醛<鬈<颧<犭<犬<畎<绻<劝<券<炔<缺<瘸<却<悫<雀<确<阕<阙<鹊<榷<逡<裙<群\"
        \"<蚺<然<髯<燃<冉<苒<染<禳<瓤<穰<嚷<壤<攘<让<荛<饶<桡<扰<娆<绕<惹<热<人<亻<仁<壬<忍<荏<稔<刃<认<仞<任<纫<妊<轫<韧<饪<衽<恁<葚<扔<仍<日<戎<肜<狨<绒<茸<荣<容<嵘<溶<蓉<榕<熔<蝾<融<冗<柔<揉<糅<蹂<鞣<肉<如<茹<铷<儒<嚅<孺<濡<薷<襦<蠕<颥<汝<乳<辱<入<洳<溽<缛<蓐<褥<阮<朊<软<蕤<蕊<芮<枘<蚋<锐<瑞<睿<闰<润<若<偌<弱<箬\"
        \"<仨<撒<洒<卅<飒<脎<萨<塞<腮<噻<鳃<赛<三<叁<毵<伞<散<糁<馓<桑<嗓<搡<磉<颡<丧<搔<骚<缫<臊<鳋<扫<嫂<埽<瘙<色<涩<啬<铯<瑟<穑<森<僧<杀<沙<纱<刹<砂<莎<铩<痧<裟<鲨<傻<唼<啥<歃<煞<霎<筛<晒<山<彡<删<杉<芟<姗<衫<钐<埏<珊<舢<跚<煽<潸<膻<闪<陕<讪<汕<疝<苫<剡<扇<善<骟<鄯<缮<嬗<擅<膳<赡<蟮<鳝<伤<殇<商<觞<墒<熵<裳<垧<晌<赏<上<尚<绱<捎<梢<烧<稍<筲<艄<蛸<勺<芍<苕<韶<少<劭<邵<绍<哨<潲<奢<猞<赊<畲<舌<佘<蛇<舍<厍<设<社<射<涉<赦<慑<摄<滠<麝<申<伸<身<呻<绅<诜<娠<砷<深<神<沈<审<哂<矧<谂<婶<渖<肾<甚<胂<渗<慎<椹<蜃<升<生<声<牲<胜<笙<甥<渑<绳<省<眚<圣<晟<盛<剩<嵊<尸<失<师<虱<诗<施<狮<湿<蓍<酾<鲺<十<饣<什<石<时<识<实<拾<炻<蚀<食<埘<莳<鲥<史<矢<豕<使<始<驶<屎<士<氏<礻<世<仕<市<示<式<事<侍<势<视<试<饰<室<恃<拭<是<柿<贳<适<舐<轼<逝<铈<弑<谥<释<嗜<筮<誓<噬<螫<收<手<扌<守<首<艏<寿<受<狩<兽<售<授<绶<瘦<书<殳<抒<纾<叔<枢<姝<倏<殊<梳<淑<菽<疏<舒<摅<毹<输<蔬<秫<孰<赎<塾<熟<暑<黍<署<鼠<蜀<薯<曙<术<戍<束<沭<述<树<竖<恕<庶<数<腧<墅<漱<澍<刷<唰<耍<衰<摔<甩<帅<蟀<闩<拴<栓<涮<双<霜<孀<爽<谁<氵<水<税<睡<吮<顺<舜<瞬<说<妁<烁<朔<铄<硕<嗍<搠<蒴<嗽<槊<厶<纟<丝<司<私<咝<思<鸶<斯<缌<蛳<厮<锶<嘶<撕<澌<死<巳<四<寺<汜<伺<似<兕<姒<祀<泗<饲<驷<俟<笥<耜<嗣<肆<忪<松<凇<崧<淞<菘<嵩<怂<悚<耸<竦<讼<宋<诵<送<颂<嗖<搜<溲<馊<飕<锼<艘<螋<叟<嗾<瞍<擞<薮<苏<酥<稣<俗<夙<诉<肃<涑<素<速<宿<粟<谡<嗉<塑<愫<溯<僳<蔌<觫<簌<狻<酸<蒜<算<虽<荽<眭<睢<濉<绥<隋<随<髓<岁<祟<谇<遂<碎<隧<燧<穗<邃<孙<狲<荪<飧<损<笋<隼<榫<唆<娑<挲<桫<梭<睃<嗦<羧<蓑<缩<所<唢<索<琐<锁\"
        \"<他<它<趿<铊<塌<溻<塔<獭<鳎<挞<闼<遢<榻<踏<蹋<骀<胎<台<邰<抬<苔<炱<跆<鲐<薹<太<汰<态<肽<钛<泰<酞<坍<贪<摊<滩<瘫<坛<昙<谈<郯<覃<痰<锬<谭<潭<檀<忐<坦<袒<钽<毯<叹<炭<探<赕<碳<汤<铴<羰<镗<饧<唐<堂<棠<塘<搪<溏<瑭<樘<膛<糖<螗<螳<醣<帑<倘<淌<傥<耥<躺<烫<趟<涛<绦<掏<滔<韬<饕<洮<逃<桃<陶<啕<淘<萄<鼗<讨<套<忑<忒<特<铽<慝<疼<腾<誊<滕<藤<剔<梯<锑<踢<绨<啼<提<缇<鹈<题<蹄<醍<体<屉<剃<倜<悌<涕<逖<惕<替<裼<嚏<天<添<田<恬<畋<甜<填<阗<忝<殄<腆<舔<掭<佻<挑<祧<条<迢<笤<龆<蜩<髫<鲦<窕<眺<粜<铫<跳<贴<萜<铁<帖<餮<厅<汀<听<町<烃<廷<亭<庭<莛<停<婷<葶<蜓<霆<挺<梃<铤<艇<通<嗵<仝<同<佟<彤<茼<桐<砼<铜<童<酮<僮<潼<瞳<统<捅<桶<筒<恸<痛<偷<亠<头<投<骰<透<凸<秃<突<图<徒<涂<荼<途<屠<酴<土<吐<钍<兔<堍<菟<湍<团<抟<疃<彖<推<颓<腿<退<煺<蜕<褪<吞<暾<屯<饨<豚<臀<氽<乇<托<拖<脱<驮<佗<陀<坨<沱<驼<柁<砣<鸵<跎<酡<橐<鼍<妥<庹<椭<拓<柝<唾<箨\"
        \"<哇<娃<挖<洼<娲<蛙<瓦<佤<袜<腽<歪<崴<外<弯<剜<湾<蜿<豌<丸<纨<芄<完<玩<顽<烷<宛<挽<晚<莞<婉<惋<绾<脘<菀<琬<皖<畹<碗<万<腕<汪<亡<王<网<往<枉<罔<惘<辋<魍<妄<忘<旺<望<危<威<偎<逶<隈<葳<微<煨<薇<巍<囗<为<韦<圩<围<帏<沩<违<闱<桅<涠<唯<帷<惟<维<嵬<潍<伟<伪<尾<纬<苇<委<炜<玮<洧<娓<诿<萎<隗<猥<痿<艉<韪<鲔<卫<未<位<味<畏<胃<軎<尉<谓<喂<渭<猬<蔚<慰<魏<温<瘟<文<纹<闻<蚊<阌<雯<刎<吻<紊<稳<问<汶<璺<翁<嗡<蓊<瓮<蕹<挝<倭<涡<莴<喔<窝<蜗<我<沃<肟<卧<幄<握<渥<硪<斡<龌<乌<圬<污<邬<呜<巫<屋<诬<钨<无<毋<吴<吾<芜<唔<梧<浯<蜈<鼯<五<午<仵<伍<坞<妩<庑<忤<怃<迕<武<侮<捂<牾<鹉<舞<兀<勿<务<戊<阢<杌<芴<物<误<悟<晤<焐<婺<痦<骛<雾<寤<鹜<鋈\"
        \"<夕<兮<汐<西<吸<希<昔<析<矽<穸<诶<郗<唏<奚<息<浠<牺<悉<惜<欷<淅<烯<硒<菥<晰<犀<稀<粞<翕<舾<溪<皙<锡<僖<熄<熙<蜥<嘻<嬉<膝<樨<歙<熹<羲<螅<蟋<醯<曦<鼷<习<席<袭<觋<媳<隰<檄<洗<玺<徙<铣<喜<葸<屣<蓰<禧<戏<系<饩<细<郄<阋<舄<隙<禊<呷<虾<瞎<匣<侠<狎<峡<柙<狭<硖<遐<暇<瑕<辖<霞<黠<下<吓<夏<厦<罅<仙<先<纤<氙<祆<籼<莶<掀<跹<酰<锨<鲜<暹<闲<弦<贤<咸<涎<娴<舷<衔<痫<鹇<嫌<冼<显<险<猃<蚬<筅<跣<藓<燹<县<岘<苋<现<线<限<宪<陷<馅<羡<献<腺<霰<乡<芗<相<香<厢<湘<缃<葙<箱<襄<骧<镶<详<庠<祥<翔<享<响<饷<飨<想<鲞<向<巷<项<象<像<橡<蟓<枭<削<哓<枵<骁<宵<消<绡<逍<萧<硝<销<潇<箫<霄<魈<嚣<崤<淆<小<晓<筱<孝<肖<哮<效<校<笑<啸<些<楔<歇<蝎<协<邪<胁<挟<偕<斜<谐<携<勰<撷<缬<鞋<写<泄<泻<绁<卸<屑<械<亵<渫<谢<榍<榭<廨<懈<獬<薤<邂<燮<瀣<蟹<躞<忄<心<忻<芯<辛<昕<欣<莘<锌<新<歆<薪<馨<鑫<囟<信<衅<兴<星<惺<猩<腥<刑<行<邢<形<陉<型<硎<醒<擤<杏<姓<幸<性<荇<悻<凶<兄<匈<芎<汹<胸<雄<熊<休<修<咻<庥<羞<鸺<貅<馐<髹<朽<秀<岫<绣<袖<锈<溴<戌<盱<砉<胥<须<顼<虚<嘘<需<墟<徐<许<诩<栩<糈<醑<旭<序<叙<恤<洫<畜<勖<绪<续<酗<婿<溆<絮<嗅<煦<蓄<蓿<轩<宣<谖<喧<揎<萱<暄<煊<儇<玄<痃<悬<旋<漩<璇<选<癣<泫<炫<绚<眩<铉<渲<楦<碹<镟<靴<薛<穴<学<泶<踅<雪<鳕<血<谑<勋<埙<熏<窨<獯<薰<曛<醺<寻<巡<旬<驯<询<峋<恂<洵<浔<荀<循<鲟<训<讯<汛<迅<徇<逊<殉<巽<蕈\"
        \"<丫<压<呀<押<鸦<桠<鸭<牙<伢<岈<芽<琊<蚜<崖<涯<睚<衙<疋<哑<痖<雅<亚<讶<迓<垭<娅<砑<氩<揠<咽<恹<烟<胭<崦<淹<焉<菸<阉<湮<腌<鄢<嫣<蔫<讠<延<闫<严<妍<芫<言<岩<沿<炎<研<盐<阎<筵<蜒<颜<檐<兖<奄<俨<衍<偃<厣<掩<眼<郾<琰<罨<演<魇<鼹<厌<彦<砚<唁<宴<晏<艳<验<谚<堰<焰<焱<雁<滟<酽<谳<餍<燕<赝<央<泱<殃<秧<鸯<鞅<扬<羊<阳<杨<炀<佯<疡<徉<洋<烊<蛘<仰<养<氧<痒<怏<恙<样<漾<幺<夭<吆<妖<腰<邀<爻<尧<肴<姚<轺<珧<窑<谣<徭<摇<遥<瑶<繇<鳐<杳<咬<窈<舀<崾<药<要<鹞<曜<耀<椰<噎<爷<耶<揶<铘<也<冶<野<业<叶<曳<页<邺<夜<晔<烨<掖<液<谒<腋<靥<一<衤<伊<衣<医<依<咿<猗<铱<壹<揖<欹<漪<噫<黟<仪<圯<夷<沂<诒<宜<怡<迤<饴<咦<姨<荑<贻<眙<胰<酏<痍<移<遗<颐<疑<嶷<彝<乙<已<以<钇<矣<苡<舣<蚁<倚<椅<旖<义<亿<弋<刈<忆<艺<仡<议<亦<屹<异<佚<呓<役<抑<译<邑<佾<峄<怿<易<绎<诣<驿<奕<弈<疫<羿<轶<悒<挹<益<谊<埸<翊<翌<逸<意<溢<缢<肄<裔<瘗<蜴<毅<熠<镒<劓<殪<薏<翳<翼<臆<癔<镱<懿<因<阴<姻<洇<茵<荫<音<殷<氤<铟<喑<堙<吟<垠<狺<寅<淫<银<鄞<夤<龈<霪<廴<尹<引<吲<饮<蚓<隐<瘾<印<茚<胤<应<英<莺<婴<瑛<嘤<撄<缨<罂<樱<璎<鹦<膺<鹰<迎<茔<盈<荥<荧<莹<萤<营<萦<楹<滢<蓥<潆<蝇<嬴<赢<瀛<郢<颍<颖<影<瘿<映<硬<媵<哟<唷<佣<拥<痈<邕<庸<雍<墉<慵<壅<镛<臃<鳙<饔<喁<永<甬<咏<泳<俑<勇<涌<恿<蛹<踊<用<优<忧<攸<呦<幽<悠<尢<尤<由<犹<邮<油<柚<疣<莜<莸<铀<蚰<游<鱿<猷<蝣<友<有<卣<酉<莠<铕<牖<黝<又<右<幼<佑<侑<囿<宥<诱<蚴<釉<鼬<纡<迂<淤<渝<瘀<于<予<余<妤<欤<於<盂<臾<鱼<俞<禺<竽<舁<娱<狳<谀<馀<渔<萸<隅<雩<嵛<愉<揄<腴<逾<愚<榆<瑜<虞<觎<窬<舆<蝓<与<伛<宇<屿<羽<雨<俣<禹<语<圄<圉<庾<瘐<窳<龉<玉<驭<吁<聿<芋<妪<饫<育<郁<昱<狱<峪<浴<钰<预<域<欲<谕<阈<喻<寓<御<裕<遇<鹆<愈<煜<蓣<誉<毓<蜮<豫<燠<鹬<鬻<鸢<冤<眢<鸳<渊<箢<元<员<园<沅<垣<爰<原<圆<袁<援<缘<鼋<塬<源<猿<辕<圜<橼<螈<远<苑<怨<院<垸<媛<掾<瑗<愿<曰<约<月<刖<岳<钥<悦<钺<阅<跃<粤<越<樾<龠<瀹<云<匀<纭<芸<昀<郧<耘<氲<允<狁<陨<殒<孕<运<郓<恽<晕<酝<愠<韫<韵<熨<蕴\"
        \"<匝<咂<拶<杂<砸<灾<甾<哉<栽<宰<载<崽<再<在<糌<簪<咱<昝<攒<趱<暂<赞<錾<瓒<赃<臧<驵<奘<脏<葬<遭<糟<凿<早<枣<蚤<澡<藻<灶<皂<唣<造<噪<燥<躁<则<择<泽<责<迮<啧<帻<笮<舴<箦<赜<仄<昃<贼<怎<谮<曾<增<憎<缯<罾<锃<甑<赠<吒<咋<哳<喳<揸<渣<楂<齄<扎<札<轧<闸<铡<眨<砟<乍<诈<咤<栅<炸<痄<蚱<榨<膪<斋<摘<宅<翟<窄<债<砦<寨<瘵<沾<毡<旃<粘<詹<谵<澶<瞻<斩<展<盏<崭<搌<辗<占<战<栈<站<绽<湛<骣<蘸<张<章<鄣<嫜<彰<漳<獐<樟<璋<蟑<仉<涨<掌<丈<仗<帐<杖<胀<账<障<嶂<幛<瘴<钊<招<昭<啁<找<沼<召<兆<诏<赵<笊<棹<照<罩<肇<蜇<遮<折<哲<辄<蛰<谪<摺<磔<辙<者<锗<赭<褶<这<柘<浙<蔗<鹧<贞<针<侦<浈<珍<桢<真<砧<祯<斟<甄<蓁<榛<箴<臻<诊<枕<胗<轸<畛<疹<缜<稹<圳<阵<鸩<振<朕<赈<镇<震<争<征<怔<峥<挣<狰<钲<睁<铮<筝<蒸<徵<拯<整<正<证<诤<郑<帧<政<症<之<支<卮<汁<芝<吱<枝<知<织<肢<栀<祗<胝<脂<蜘<执<侄<直<值<埴<职<植<殖<絷<跖<摭<踯<夂<止<只<旨<址<纸<芷<祉<咫<指<枳<轵<趾<黹<酯<至<志<忮<豸<制<帙<帜<治<炙<质<郅<峙<栉<陟<挚<桎<秩<致<贽<轾<掷<痔<窒<鸷<彘<智<滞<痣<蛭<骘<稚<置<雉<膣<觯<踬<中<忠<终<盅<钟<舯<衷<锺<螽<肿<种<冢<踵<仲<众<重<州<舟<诌<周<洲<粥<妯<轴<碡<肘<帚<纣<咒<宙<绉<昼<胄<荮<皱<酎<骤<籀<朱<侏<诛<邾<洙<茱<株<珠<诸<猪<铢<蛛<槠<潴<橥<竹<竺<烛<逐<舳<瘃<躅<丶<主<拄<渚<属<煮<嘱<麈<瞩<伫<住<助<苎<杼<注<贮<驻<柱<炷<祝<疰<著<蛀<筑<铸<箸<翥<抓<爪<拽<专<砖<颛<转<啭<赚<撰<篆<馔<妆<庄<桩<装<丬<壮<状<幢<撞<隹<追<骓<椎<锥<坠<缀<惴<缒<赘<肫<窀<谆<准<卓<拙<倬<捉<桌<涿<灼<茁<斫<浊<浞<诼<酌<啄<着<琢<禚<擢<濯<镯<仔<孜<兹<咨<姿<赀<资<淄<缁<谘<孳<嵫<滋<粢<辎<觜<趑<锱<龇<髭<鲻<籽<子<姊<秭<耔<笫<梓<紫<滓<訾<字<自<恣<渍<眦<宗<综<棕<腙<踪<鬃<总<偬<纵<粽<邹<驺<诹<陬<鄹<鲰<走<奏<揍<租<菹<足<卒<族<镞<诅<阻<组<俎<祖<躜<缵<纂<钻<攥<嘴<最<罪<蕞<醉<尊<遵<樽<鳟<撙<昨<左<佐<作<坐<阼<怍<柞<祚<胙<唑<座<做\";

}

 

package sorting;

import java.util.*;
import java.text.*;

/**
 * @author gaojianmin
 *
 */
public class chinesegb2312comparator implements comparator<string>, comparable<string> {

    private rulebasedcollator gb2312collator =  chinesegb2312collator.getfixedgb2312collator();
    private string str1;
    /**
     * @param str1
     */
    public chinesegb2312comparator(string str1) {
        this.str1 = str1;
    }
    /**
     * 
     */
    public chinesegb2312comparator() {
        this.str1=\"\";
    }
    /**
     * @param str1
     * @param str2
     * @return an integer indicatint the comparison result
     * @see java.util.comparator#compare(object, object)
     */
    public int compare(string str1, string str2) {
        return gb2312collator.compare(str1, str2);
    }
    /**
     * @param str2
     * @return an integer indicatint the comparison result
     *  @see java.lang.comparable#compareto(object)
     */
    public int compareto(string str2) {
        return gb2312collator.compare(str1, str2);
    }
}

测试代码及结果
代码:
import java.util.*;
import java.text.*;
public class test
{
        string [] test = new string[] {
                \”作业\”,
                \”测试\”,
                \”test\”,
                \”我们\”,
                \”。空\”,
                \”镂空\”,
                \”[\”,
                \”浏\”,
                \”皙\”
        };
      java.util.arrays.sort(test, new chinesegb2312comparator());
      system.out.println(\”============\”);
      for(string key : test)
          system.out.println(key);
}

chinesegb2312comparator 类同时实现了 comparator, comparable 接口,这样以后能够使用 compare, compareto 方法的时候都可以使用这个类。

输出结果:
[
test
。空
测试

镂空
我们

作业

更易于向Windows Azure部署Java应用的新方式


  微软最近发布了一种工具,它简化了向windows azure部署java应用程序的过程。

  迄今为止,想要在windows azure上运行java应用程序,我们都需要在安装包中包含工作者(worker)角色的配置信息,那需要更新服务定义文件,在服务配置文件中设置一些属性,并创建.net类来处理角色的生命周期。msdn上的一篇文章对于如何在azure上部署java应用程序给出了详细的说明。这个过程并非是仅仅通过“指指点点”(point-and-click)就可以完成的,它需要在visual studio中创建一个c#类,需要处理zip文件的.net类库,并且还需要编辑azure服务的配置信息。

  微软已经发布了windows azure starter kit for java,这是一个包含有模板项目和ant扩展的zip文件,它使得部署java应用程序的工作变得更简单。我们可以在命令行中把它作为单独的工具来使用,其中主要的元素是ant构建文件,它们会创建所有需要的文件(示例);或者我们可以在eclipse中使用它,当构建项目的时候,它就会调用ant文件。(示例)

  开发者可以编辑配置文件,从而选择把应用程序在本地配置应用程序以进行测试,或者部署到云中。当选择后者并把应用程序部署到windows azure上的时候,这个工具会生成所需要的.cspkg和.cscfg文件。

  初学者工具包是ctp版本的,微软想要“从java开发者得到反馈,并且要为java开发者明确正确的体验,特别是要确保配置、打包和部署到windows azure的操作和一般的操作能够良好地整合在一起。” 这个工具包是基于apache 2.0许可发布的。

  查看英文原文:easier deployment of java apps to windows azure

JAVA之wait与notify应用


要理解notify()和wait(),因为这两个方法不属于thread 类,而是属于最底层的object基础类的,也就是说不光是thread,每个对象都有notify和wait的功能
为什么?因为他们是用来操纵锁的, 而每个对象都有锁,锁是每个对象的基础,既然锁是基础的,那么操纵锁的方法当然也是最基础了.
?
每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。

我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。
wait和notify方法只能在同步方法和同步块中调用,必须是同一个对象
当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
当调用对象的notifyall方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
按照think in java中的解释:"wait()允许我们将线程置入"睡眠"状态,同时又"积极"地等待条件发生改变.
而且只有在一个notify()或notifyall()发生变化的时候,线程才会被唤醒,并检查条件是否有变."
我们来解释一下这句话.
"wait()允许我们将线程置入"睡眠"状态",也就是说,wait也是让当前线程阻塞的,这一点和sleep或者suspend是相同的.那和sleep,suspend有什么区别呢?

区别在于"(wait)同时又"积极"地等待条件发生改变",这一点很关键,sleep和suspend无法做到.
因为我们有时候需要通过同步 (synchronized)的帮助来防止线程之间的冲突,而一旦使用同步,就要锁定对象,也就是获取对象锁,其它要使用该对象锁的线程都只能排队等着, 等到同步方法或者同步块里的程序全部运行完才有机会.
在同步方法和同步块中,无论sleep()还是suspend()都不可能自己被调用的时候解除锁定,他们都霸占着正在使用的对象锁不放.
而wait却可以,它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人(这里应该是程序块,或线程)用,这意味着可在执行wait()期间调用线程对象中的其他同步方法!
在其它情况下(sleep啊,suspend啊),这是不可能的.
但是注意我前面说的,只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程还是要把这个对象锁收回来的呀.wait什么?就是wait别人用完了还给我啊!
好,那怎么把对象锁收回来呢?
第一种方法,限定借出去的时间.在wait()中设置参数,比如wait(1000),以毫秒为单位,就表明我只借出去1秒中,一秒钟之后,我自动收回.(前提是其他线程释放了该锁,否则时间超时了也收不回来的)。
第二种方法,让借出去的人通知我,他用完了,要还给我了.这时,我马上就收回来.哎,假如我设了1小时之后收回,别人只用了半小时就完了,那怎么办呢?*!当然用完了就收回了,还管我设的是多长时间啊.
那么别人怎么通知我呢?相信大家都可以想到了,notify(),这就是最后一句话"而且只有在一个notify()或notifyall()发生变化的时候,线程才会被唤醒"的意思了.
因此,我们可将一个wait()和notify()置入任何同步方法或同步块内部,无论在那个类里是否准备进行涉及线程的处理。而且实际上,我们也只能在同步方法或者同步块里面调用wait()和notify().
synchronized (obj){…};的意思是定义一个同步块,使用obj作为资源锁。obj.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行,
在这里假设要用同一把锁的就是thread1线程.thread1线程在执行到一定地方后用obj.notify()通知wait的线程,obj锁已经用完,待notify()所在的同步块运行完之后,wait所在的线程就可以继续执行.



Powered By wordpress Copyright java专题 © 2009-2012 版权所有