??xml version="1.0" encoding="utf-8" standalone="yes"?>国产夜色精品一区二区av,欧美一级二区,久久夜色撩人精品http://www.aygfsteel.com/qqqckm/zh-cnThu, 19 Jun 2025 15:20:36 GMTThu, 19 Jun 2025 15:20:36 GMT60用ServletJSP动态生成图像验证码Q{载) http://www.aygfsteel.com/qqqckm/archive/2006/12/16/88096.htmlqqqckmqqqckmSat, 16 Dec 2006 01:11:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/12/16/88096.htmlhttp://www.aygfsteel.com/qqqckm/comments/88096.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/12/16/88096.html#Feedback0http://www.aygfsteel.com/qqqckm/comments/commentRss/88096.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/88096.html
首先实现一个servlet用来生成囄Q当然也可以用jsp实现Q:

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import com.sun.image.codec.jpeg.*;

import java.awt.*;

import com.sun.image.codec.jpeg.*;

import java.awt.image.BufferedImage;

import java.awt.image.DataBuffer;

import java.awt.geom.GeneralPath;

import javax.swing.*;

import java.math.*;

public class Servlet1

extends HttpServlet {

//Process the HTTP Get request

public void doGet(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

response.setContentType(CONTENT_TYPE);

response.setContentType("image/jpeg"); //必须讄ContentType为image/jpeg

int length = 4; //讄默认生成4个数?br />
Date d = new Date();

long lseed = d.getTime();

java.util.Random r = new Random(lseed); //讄随机U子

if (request.getParameter("length") != null) {

try {

length = Integer.parseInt(request.getParameter("length"));

}

catch (NumberFormatException e) {

}

}

StringBuffer str = new StringBuffer();

for (int i = 0; i <length; i++) {

str.append(r.nextInt(9)); //生成随机数字

}

//可以在此加入保存验证码的代码

//创徏内存囑փ

BufferedImage bi = new BufferedImage(40, 16, BufferedImage.TYPE_INT_RGB);

Graphics2D g = bi.createGraphics();

g.clearRect(0, 0, 16, 40);

g.setColor(Color.green.CYAN);

g.drawString(str.toString(), 4, 12);

try {

//使用JPEG~码Q输出到response的输出流

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.

getOutputStream());

JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);

param.setQuality(1.0f, false);

encoder.setJPEGEncodeParam(param);

encoder.encode(bi);

}

catch (Exception ex) {



}

}

}



然后在需求显C验证码的加入以下代码就可以?br />

<img alt="" src="/WebModule1/servlet1" width="40" height="16"/>



?WebModule1/servlet1替换成你用来生成验证码的servlet的全路径?br />



qqqckm 2006-12-16 09:11 发表评论
]]>
JAVAE序员面?2?附答?Q{载) http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87808.htmlqqqckmqqqckmThu, 14 Dec 2006 12:35:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87808.htmlhttp://www.aygfsteel.com/qqqckm/comments/87808.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87808.html#Feedback0http://www.aygfsteel.com/qqqckm/comments/commentRss/87808.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/87808.htmlW一Q谈谈final, finally, finalize的区别?
  
  W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?
  
  W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?br />  
  W四Q?amp;?amp;&的区别?br />  
  W五QHashMap和Hashtable的区别?br />  
  W六QCollection ?Collections的区别?br />  
  W七Q什么时候用assert?br />  
  W八QGC是什? Z么要有GC?
  
  W九QString s = new String("xyz");创徏了几个String Object?
  
  W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?
  
  W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  
  W十二,sleep() ?wait() 有什么区?
  
  W十三,Java有没有goto?
  
  W十四,数组有没有length()q个Ҏ? String有没有length()q个Ҏ?
  
  W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
  
  W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?
  
  W十七,l我一个你最常见到的runtime exception?br />  
  W十八,error和exception有什么区?
  
  W十九,List, Set, Map是否l承自Collection接口?
  
  W二十,abstract class和interface有什么区?
  
  W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?
  
  W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?
  
  W二十三Q启动一个线E是用run()q是start()?
  
  W二十四Q构造器Constructor是否可被override?
  
  W二十五Q是否可以承Stringc?
  
  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?
  
  W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?
  
  W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?
  
  W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
  
  W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?
  
  W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
  
  W三十二Q编E题: 写一个Singleton出来?/p>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/p>

以下是答案:

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/p>

W一Q谈谈final, finally, finalize的区别?br />  final—修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重?br />  finally—再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?br />  finalize—方法名。Java 技术允怋?finalize() Ҏ在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalize() Ҏ以整理系l资源或者执行其他清理工作。finalize() Ҏ是在垃圾攉器删除对象之前对q个对象调用的?br />  
  W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?
  匿名的内部类是没有名字的内部cR不能extends(l承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?br />  
  W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?br />  Nested Class Q一般是C++的说法)QInner Class (一般是JAVA的说?。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
  注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象
  Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?

  HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允?

  q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap
必Mؓ之提供外同步?br />  W四Q?amp;?amp;&的区别?br />  &是位q算W?amp;&是布逻辑q算W?br />  
  W五QHashMap和Hashtable的区别?br />  都属于Map接口的类Q实C惟一键映到特定的g?br />  HashMap cL有分cL者排序。它允许一?null 键和多个 null 倹{?
  Hashtable cM?HashMapQ但是不允许 null 键和 null 倹{它也比 HashMap 慢,因ؓ它是同步的?br />  Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?

  q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap
必Mؓ之提供外同步?

  W六QCollection ?Collections的区别?br />  Collections是个java.util下的c,它包含有各种有关集合操作的静态方法?br />  Collection是个java.util下的接口Q它是各U集合结构的父接?
  W七Q什么时候用assert?br />  断言是一个包含布表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?AssertionError。它用于调试目的Q?
  assert(a > 0); // throws an AssertionError if a <= 0
  断言可以有两UŞ式:
  assert Expression1 ;
  assert Expression1 : Expression2 ;
  Expression1 应该L产生一个布倹{?
  Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?br />  断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?
  javac -source 1.4 Test.java
  要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?
  要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?
  要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?
  可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ的参数。不q,断言不应该用于验证传递给公有Ҏ的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?
  
  
  W八QGC是什? Z么要有GC? (基础)?br />  GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ之一Q?
  System.gc()
  Runtime.getRuntime().gc()
  
  W九QString s = new String("xyz");创徏了几个String Object?
  两个对象Q一个是“xyx?一个是指向“xyx”的引用对象s?br />  
  W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?
  Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11;
  
  W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确?br />  
  W十二,sleep() ?wait() 有什么区? 搞线E的最?br />  sleep()Ҏ是ɾU程停止一D|间的Ҏ。在sleep 旉间隔期满后,U程不一定立x复执行。这是因为在那个时刻Q其它线E可能正在运行而且没有被调度ؓ攑ּ执行Q除?a)“醒来”的U程h更高的优先
  (b)正在q行的线E因为其它原因而阻塞?br />  wait()是线E交互时Q如果线E对一个同步对象x 发出一个wait()调用Q该U程会暂停执行,被调对象q入{待状态,直到被唤醒或{待旉到?br />  W十三,Java有没有goto?
  Goto—java中的保留字,现在没有在java中用?br />  
  W十四,数组有没有length()q个Ҏ? String有没有length()q个ҎQ?br />  数组没有length()q个ҎQ有length的属性?br />  String有有length()q个Ҏ?br />  
  W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
  Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?br />  
  W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?
  Set里的元素是不能重复的Q那么用iterator()Ҏ来区分重复与否。equals()是判M个Set是否相等?br />  equals()?=Ҏ军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?br />  
  W十七,l我一个你最常见到的runtime exception?br />  ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
  ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
  
  W十八,error和exception有什么区?
  error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?br />  exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?br />  W十九,List, Set, Map是否l承自Collection接口?
  ListQSet?br />  
  Map不是
  
  W二十,abstract class和interface有什么区?
  声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?br />  接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?br />  
  W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?
  都不?br />  
  W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?
  接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?br />  
  W二十三Q启动一个线E是用run()q是start()?
  启动一个线E是调用start()ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ可以产生必须退出的标志来停止一个线E?br />  W二十四Q构造器Constructor是否可被override?
  构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?br />  
  W二十五Q是否可以承Stringc?
  StringcLfinalcL不可以ѝ?br />  
  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?
  不能Q一个对象的一个synchronizedҎ只能׃个线E访问?br />  
  W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?
  会执行,在return前执行?br />  
  
  W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?
  有C背景的程序员特别喜欢问这U问题?br />  
  2 << 3
  
  W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
  不对Q有相同的hash code?br />  
  W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?
  是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?br />  
  
  W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
  switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte。long,string 都不能作用于swtich?br />  W三十二Q编E题: 写一个Singleton出来?br />  Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?br />  一般Singleton模式通常有几U种形式:
  W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引?l而调用其中的Ҏ?br />  public class Singleton {
  private Singleton(){}
  //在自己内部定义自׃个实例,是不是很奇怪?
  //注意q是private 只供内部调用
  private static Singleton instance = new Singleton();
  //q里提供了一个供外部讉K本class的静态方法,可以直接讉K
  public static Singleton getInstance() {
  return instance;
  }
  }
  W二UŞ?
  public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一?
  //使用时生成实例,提高了效率!
  if (instance==null)
  instanceQnew Singleton();
  return instance; }
  }
  其他形式:
  定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?br />  一般认为第一UŞ式要更加安全
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=

以下是PCOnline的网友评论:http://cmt.pconline.com.cn/topic.jsp?id=115964&reverse=1

16 ?/font> 匿名 发表于:2005-01-06 11:47:56 回复此脓 0 0
  以下{案有问? 
"W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?
不能Q一个对象的一个synchronizedҎ只能׃个线E访问?
如果另一个方法没有实现synchronized则可以被其他U程讉K.


20 ?/font> ? 发表于:2005-01-10 21:06:23 回复此脓 1 0
  计算 2 * 8 最快的Ҏ昄是 return 16;
21 ?/font> 撒旦?/font> 发表于:2005-01-13 10:46:01 回复此脓 0 0
      有没有好好研I过Java虚拟范呀Q?
    我不用试q道?<<3的速度要比2×8速度慢。测试结果也是这L。Java1.4 已经把乘除法优化了?/td>
26 ?/font> wht 发表于:2005-02-17 11:46:04 回复此脓 0 0
  回复 21 ?撒旦?Q再怎么优化,+-q算都要变成UM和与?q是p片决定得.
28 ?/font> PracticalJava 发表于:2005-03-05 14:32:50 回复此脓 0 0
  对,22g说得对,W二十六题的有问题Q答案是错的。应该是能执行该对象的其他方法。因为synchornized只要获得的是不同对象作ؓ的机锁,可以运行一个被synchornized的方法?/td>
30 ?/font> zhuzhou 发表于:2005-03-10 15:35:44 回复此脓 1 0
  试代码如下:
        long t1 =0;
        long t2 =0;
        int k = 2;
        int m = 3;
        int n = 0;
        int max = 100000000;

        t1 = new Date().getTime();
        for(int i=0;i<max;i++) 
            n = k^m;
        t2 = new Date().getTime();
        System.out.println("采用乘方׃ "+(t2-t1)+" U?);
        
//        t1 = new Date().getTime();
//        for(int i=0;i<max;i++) 
//            n = k*k*k;
//        t2 = new Date().getTime();
//        System.out.println("采用q乘׃ "+(t2-t1)+" U?);
        
//        t1 = new Date().getTime();
//        for(int i=0;i<max;i++) 
//            n = k<<m;
//        t2 = new Date().getTime();
//        System.out.println("采用UM׃ "+(t2-t1)+" U?);

试的时候只开攑օ中一D代?
l果如下:
乘方 UM q乘
1亿次
机器?219 375 422
机器?235 375 422
机器?219 375 422
机器?219 391 438
机器?234 375 422
1亿次
机器?281 297 297
机器?281 297 277
机器?282 312 296
机器?297 297 297
机器?281 312 297
机器?282 296 312
10亿次
机器?2796 3015 2985
机器?2813 3079 2985
机器?2812 3109 3062
机器?2812 3016 3000
机器?2812 3031 2985

好像UM不够快哦


#  Buy Lortab 发表?006-11-22 21:30:00  IP: 81.95.146.*
TrackBack来自《Lortab?/font>Q?br />
add bookmarks...

#  fz 发表?006-01-07 00:59:00  IP: 172.16.13.*
26题如果改成synchronise 整个object lock 不是一个方法的话答案就对了

#  fxbird 发表?006-01-07 10:08:00  IP: 221.201.179.*
出现了n回了Q不要现发了

#  noname 发表?006-01-07 11:42:00  IP: 202.114.2.*
30楼楼主:
不要惛_然好不好Q你q样试完全没有意义的。你的@环主体花的时间远q没有@环变量跟新和条g判断用的旉多?/div>

#  anonymous 发表?006-01-07 16:24:00  IP: 10.130.13.*
只有文章题目U得上变?/div>

#  elwin_lee@hotmail.com 发表?006-01-08 12:05:00  IP: 221.217.10.*
fz 概念错误

public void synchronized hello(){

}
{h?
public void hello(){
synchronized (this) {

}
}
同步Ҏ与同步对象ƈ没有区别

#  W?题好像也不对 发表?006-01-07 19:06:00  IP: 221.219.175.*
public class A {

public A() {
super();
A a=new A(){
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
};
}
}
q里的匿名内部类a l承了A的方法,qoverride?toString()

#  zhengyun_ustc 发表?006-01-08 18:59:00  IP: 61.49.113.*
比较正常和初U的面试问题而已

#  fengw 发表?006-01-08 19:58:00  IP: 219.238.119.*
晕,q篇文章没什么,但答案比较害人啊Q看得时间要注意了,有些{案是错误的…?/div>

#  kiki 发表?006-01-08 16:30:00  IP: 202.120.224.*
q些问题一点也不变?/div>

#  寒风 发表?006-01-09 11:46:00  IP: 210.22.158.*
W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
  不对Q有相同的hash code?

可以有不同的hash code? 看类的hashCode()的实现方法拉. ~省的是用ObjectcȝhashCodeҎ, q回该对象的内存地址.

#  p一起 发表于2006-01-09 15:09:00  IP: 210.21.228.*
q些都是蛮重要的东西?怎么是变态呢!!!!!!!!!!!!

#  wf 发表?006-01-09 10:17:00  IP: 202.101.47.*
q些好像都是基础问题啊。。。?/div>

#  误h?/font> 发表?006-01-09 13:32:00  IP: 61.152.132.*
好多{案是错误的

#  赵小刀 发表?006-01-09 13:53:00  IP: 218.25.24.*
CSDNq吗L出Nq前的东西呢Q?/div>

#  flyjimi 发表?006-01-11 12:49:00  IP: 221.237.182.*
语法l节跟常用的包,题目是网上的







qqqckm 2006-12-14 20:35 发表评论
]]>
java中四U操作xml方式的比?转蝲) http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87806.htmlqqqckmqqqckmThu, 14 Dec 2006 12:28:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87806.htmlhttp://www.aygfsteel.com/qqqckm/comments/87806.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87806.html#Feedback0http://www.aygfsteel.com/qqqckm/comments/commentRss/87806.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/87806.html1. 介绍

1QDOM(JAXP Crimson解析?
        DOM是用与^台和语言无关的方式表C?a target="_blank">XML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z树或Z对象的。DOM以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?/p>

2QSAX

        SAX处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_SAXq比它的替代者DOM快许多?
   选择DOMq是选择SAXQ?对于需要自q写代码来处理XML文档的开发h员来_  选择DOMq是SAX解析模型是一个非帔R要的设计决策?DOM采用建立树Şl构的方式访问XML文档Q而SAX采用的事件模型?

  DOM解析器把XML文档转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用DOM解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?

  SAX解析器采用了Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?

3QJDOM           http://www.jdom.org

          JDOM的目的是成ؓJava特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和促进。正在考虑通过“Java规范hJSR-102”将它最l用作“Java标准扩展”。从2000q初已l开始了JDOM开发?

  JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了APIQ但是也限制了灵zL。第二,API大量使用了Collectionsc,化了那些已经熟悉q些cȝJava开发者的使用?

  JDOM文档声明其目的是“?0%(或更?的精力解?0%(或更?Java/XML问题?Ҏ学习曲线假定?0%)。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ理解得多。JDOMq包括对E序行ؓ的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错?。这也许是比学习DOM或JDOM接口都更有意义的工作?

  JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(管它还可以以前构造的DOM表示作ؓ输入)。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开?a target="_blank">源码?/p>

4QDOM4J http://dom4j.sourceforge.net 
            
        虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?

  为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ。DOM4J大量使用了API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出了更复杂的API的代P但是它提供了比JDOM大得多的灉|性?

  在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一LQ针对Java开发者的易用性和直观操作。它q致力于成ؓ比JDOM更完整的解决ҎQ实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ?

  DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J?

2.. 比较

1QDOM4J性能最好,qSun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J.

2QJDOM和DOM在性能试时表C佻I在测?0M文档时内存溢出。在文档情况下q值得考虑使用DOM和JDOM。虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐(与基于非标准的Java模型相对)Q所以在某些cd的项目中可能也需要它(如在JavaScript中用DOM)?/p>

3QSAX表现较好Q这要依赖于它特定的解析方式Q事?a target="_blank">驱动。一个SAX即到来的XML,但ƈ没有载入到内?当然当XML被dӞ会有部分文档暂时隐藏在内存中)?/p>

3. 四种xml操作方式的基本用方?/p>

xml文gQ?/p>

Q?xml version="1.0" encoding="GB2312"?Q?br />QRESULTQ?br />    QVALUEQ?
        QNOQA1234Q?NOQ?
       QADDRQ四川省XX县XX镇XX路XDXXP/ADDRQ?br />    Q?VALUEQ?br />    QVALUEQ?
        QNOQB1234Q?NOQ?
       QADDRQ四川省XX市XX乡XX村XXl</ADDRQ?br />    Q?VALUEQ?br />Q?RESULTQ?

1QDOM

import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class MyXMLReader{
 public static void main(String arge[]){

  long lasting =System.currentTimeMillis();
  try{ 
   File f=new File("data_10k.xml");
   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   DocumentBuilder builder=factory.newDocumentBuilder();
   Document doc = builder.parse(f);
   NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;iQnl.getLength();i++){
    System.out.print("车牌L:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
   }
  }catch(Exception e){
   e.printStackTrace();
}

2QSAX

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MyXMLReader extends DefaultHandler {

 java.util.Stack tags = new java.util.Stack();
 public MyXMLReader() {
  super();
   }

 public static void main(String args[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXParserFactory sf = SAXParserFactory.newInstance();
   SAXParser sp = sf.newSAXParser();
   MyXMLReader reader = new MyXMLReader();
   sp.parse(new InputSource("data_10k.xml"), reader);
  } catch (Exception e) {
   e.printStackTrace();
  }

  System.out.println("q行旉Q? + (System.currentTimeMillis() - lasting) + "毫秒");}
  public void characters(char ch[], int start, int length) throws SAXException {
  String tag = (String) tags.peek();
  if (tag.equals("NO")) { 
   System.out.print("车牌LQ? + new String(ch, start, length));
    }
    if (tag.equals("ADDR")) {
  System.out.println("地址:" + new String(ch, start, length));
    }
   }

  public void startElement(String uri,String localName,String qName,Attributes attrs) {
  tags.push(qName);}

3Q?JDOM

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class MyXMLReader {

 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXBuilder builder = new SAXBuilder(); 
   Document doc = builder.build(new File("data_10k.xml")); 
   Element foo = doc.getRootElement(); 
   List allChildren = foo.getChildren(); 
   for(int i=0;iQallChildren.size();i++) { 
    System.out.print("车牌L:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   }
  } catch (Exception e) {
   e.printStackTrace();
}

}

4QDOM4J

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class MyXMLReader {

 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   File f = new File("data_10k.xml");
   SAXReader reader = new SAXReader();
   Document doc = reader.read(f);
   Element root = doc.getRootElement();
   Element foo;
   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
    foo = (Element) i.next();
    System.out.print("车牌L:" + foo.elementText("NO"));
    System.out.println("车主地址:" + foo.elementText("ADDR"));
   }
  } catch (Exception e) {
   e.printStackTrace();
    }
}



qqqckm 2006-12-14 20:28 发表评论
]]>
《JAVA~程思想2》笔?/title><link>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87804.html</link><dc:creator>qqqckm</dc:creator><author>qqqckm</author><pubDate>Thu, 14 Dec 2006 12:26:00 GMT</pubDate><guid>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87804.html</guid><wfw:comment>http://www.aygfsteel.com/qqqckm/comments/87804.html</wfw:comment><comments>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/qqqckm/comments/commentRss/87804.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/qqqckm/services/trackbacks/87804.html</trackback:ping><description><![CDATA[     摘要: W? 1 ? 对象入门 Smalltalk 的五大基本特? ...  <a href='http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87804.html'>阅读全文</a><img src ="http://www.aygfsteel.com/qqqckm/aggbug/87804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/qqqckm/" target="_blank">qqqckm</a> 2006-12-14 20:26 <a href="http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初始化及cȝ加蝲!!!http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87798.htmlqqqckmqqqckmThu, 14 Dec 2006 12:09:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87798.htmlhttp://www.aygfsteel.com/qqqckm/comments/87798.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/12/14/87798.html#Feedback1http://www.aygfsteel.com/qqqckm/comments/commentRss/87798.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/87798.html      2.加蝲zc,初始化派生类中的静态成员变量?/p>

      3.q行zcȝmainҎ?/p>

      4.初始化基cM的其他成员变量(staticcd的除外)?/p>

      5.调用基类构造函数?/p>

      6.初始化派生类中的其他成员变量Qstaticcd的除外)?/p>

      7.调用zcL造函数?/p>

for example:

Beetle.java

class Insect {
    private int i = 9;
    private int l = print("Insect.l initialized");
    protected int j ;
    public Insect(){
        System.out.println("i="+i+" j="+j);
        j = 39;
    }
    private static int x1 = print("static Insect.x1 initialized");
    static int print(String s){
        System.out.println(s);
        return 47;
    }
}
public class Beetle extends Insect{

    private int k = print("Beetle.k initialized");
    //private int j=100;

    public Beetle(){
        System.out.println("k = "+k);
        System.out.println("j = "+j);
    }
    private static int y = print("Beetle.y initialized");
    public static void main(String[] args) {
        System.out.println("Beetle constructor");
        Beetle b = new Beetle();
        //Insect i = new Insect();
    }

}

q行输出Q?/p>

static Insect.x1 initialized
Beetle.y initialized
Beetle constructor
Insect.l initialized
i=9 j=0
Beetle.k initialized
k = 47
j = 39



qqqckm 2006-12-14 20:09 发表评论
]]>
Java~程思想W三版摘?/title><link>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87796.html</link><dc:creator>qqqckm</dc:creator><author>qqqckm</author><pubDate>Thu, 14 Dec 2006 11:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87796.html</guid><wfw:comment>http://www.aygfsteel.com/qqqckm/comments/87796.html</wfw:comment><comments>http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/qqqckm/comments/commentRss/87796.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/qqqckm/services/trackbacks/87796.html</trackback:ping><description><![CDATA[     摘要: Q=Q=Q=Q=Q=Q?   Chap1 对象? ...  <a href='http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87796.html'>阅读全文</a><img src ="http://www.aygfsteel.com/qqqckm/aggbug/87796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/qqqckm/" target="_blank">qqqckm</a> 2006-12-14 19:42 <a href="http://www.aygfsteel.com/qqqckm/archive/2006/12/14/87796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java是传D是传引用???http://www.aygfsteel.com/qqqckm/archive/2006/12/07/86085.htmlqqqckmqqqckmThu, 07 Dec 2006 06:20:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/12/07/86085.htmlhttp://www.aygfsteel.com/qqqckm/comments/86085.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/12/07/86085.html#Feedback0http://www.aygfsteel.com/qqqckm/comments/commentRss/86085.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/86085.html

1. 单类型是按g递的

  Java Ҏ的参数是单类型的时候,是按g递的 (pass by value)。这一Ҏ们可以通过一个简单的例子来说明:

/* ?1 */
/**
* @(#) Test.java

* @author fancy

*/
public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = " + test); } public static void main(String[] args) { boolean test = true; System.out.println("Before test(boolean) : test = " + test); test(test); System.out.println("After test(boolean) : test = " + test); } }

  q行l果Q?/p>

Before test(boolean) : test = true
In test(boolean) : test = false
After test(boolean) : test = true

  不难看出Q虽然在 test(boolean) Ҏ中改变了传进来的参数的|但对q个参数源变量本wƈ没有影响Q即?main(String[]) Ҏ里的 test 变量没有影响。那说明Q参数类型是单类型的时候,是按g递的。以参数形式传递简单类型的变量Ӟ实际上是参数的g了一个拷贝传q方法函数的Q那么在Ҏ函数里再怎么改变其|其结果都是只改变了拷贝的|而不是源倹{?/p>

  2. 什么是引用

  Java 是传D是传引用Q问题主要出在对象的传递上Q因?Java 中简单类型没有引用。既然争Z提到了引用这个东西,Z搞清楚这个问题,我们必须要知道引用是什么?/p>

  单的_引用其实像是一个对象的名字或者别?(alias)Q一个对象在内存中会h一块空间来保存数据Q根据对象的大小Q它可能需要占用的I间大小也不{。访问对象的时候,我们不会直接是访问对象在内存中的数据Q而是通过引用去访问。引用也是一U数据类型,我们可以把它惌为类?C 语言中指针的东西Q它指示了对象在内存中的地址——只不过我们不能够观察到q个地址I竟是什么?/p>

  如果我们定义了不止一个引用指向同一个对象,那么q些引用是不相同的,因ؓ引用也是一U数据类型,需要一定的内存I间来保存。但是它们的值是相同的,都指C同一个对象在内存的中位置。比?/p>

String a = "Hello";
String b = a;

  q里Qa ?b 是不同的两个引用Q我们用了两个定义语句来定义它们。但它们的值是一LQ都指向同一个对?"Hello"。也怽q觉得不够直观,因ؓ String 对象的值本w是不可更改?(?b = "World"; b = a; q种情况不是改变?"World" q一对象的|而是改变了它的引?b 的g之指向了另一?String 对象 a)。那么我们用 StringBuffer 来D一个例子:

/* ?2 */
/**

* @(#) Test.java



* @author fancy

*/

public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("Hello"); StringBuffer b = a; b.append(", World"); System.out.println("a is " + a); } }

  q行l果Q?/p>

a is Hello, World

  q个例子?a ?b 都是引用Q当改变?b 指示的对象的值的时候,从输出结果来看,a 所指示的对象的g改变了。所以,a ?b 都指向同一个对象即包含 "Hello" 的一?StringBuffer 对象?/p>  q里我描qC两个要点Q?

  1. 引用是一U数据类型,保存了对象在内存中的地址Q这U类型即不是我们qx所说的单数据类型也不是cd?对象)Q?
  2. 不同的引用可能指向同一个对象,换句话说Q一个对象可以有多个引用Q即该类cd的变量?

  3. 对象是如何传递的?/strong>

  关于对象的传递,有两U说法,即“它是按g递的”和“它是按引用传递的”。这两种说法各有各的道理Q但是它们都没有从本质上d析,卌于生了争论?/p>

  既然现在我们已经知道了引用是什么东西,那么现在不妨来分析一下对象作是参数是如何传递的。还是先以一个程序ؓ例:

/* ?3 */
/**
* @(#) Test.java

* @author fancy

*/

public
class Test { public static void test(StringBuffer str) { str.append(", World!"); } public static void main(String[] args) { StringBuffer string = new StringBuffer("Hello"); test(string); System.out.println(string); } }

  q行l果Q?/p>  Hello, World!

  test(string) 调用?test(StringBuffer) ҎQƈ?string 作ؓ参数传递了q去。这?string 是一个引用,q一Ҏ勿庸|疑的。前面提刎ͼ引用是一U数据类型,而且不是对象Q所以它不可能按引用传递,所以它是按g递的Q它么它的值究竟是什么呢Q是对象的地址?/p>

  由此可见Q对象作为参数的时候是按g递的Q对吗?错!Z么错Q让我们看另一个例子:

/* ?4 */
/**
* @(#) Test.java

* @author fancy

*/
public class Test { public static void test(String str) { str = "World"; } public static void main(String[] args) { String string = "Hello"; test(string); System.out.println(string); } }

  q行l果Q?/p>

Hello

  Z么会q样呢?因ؓ参数 str 是一个引用,而且它与 string 是不同的引用Q虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的|使之指向了另一个对象,然?str 指向的对象改变了Q但它ƈ没有?"Hello" 造成M影响Q而且׃ string ?str 是不同的引用Qstr 的改变也没有?string 造成M影响Q结果就如例中所C?/p>

  其结果是推翻了参数按g递的说法。那么,对象作ؓ参数的时候是按引用传递的了?也错Q因Z一个例子的能够说明它是按g递的?/p>

  l果Q就像光到底是Lq是_子的问题一PJava Ҏ的参数是按什么传递的问题Q其{案只能是Q即是按g递也是按引用传递,只是参照物不同,l果也就不同?/p>

  4. 正确看待传D是传引用的问?/strong>

  要正的看待q个问题必须要搞清楚Z么会有这样一个问题?/p>

  实际上,问题来源?CQ而不?Java?/p>

  C 语言中有一U数据类型叫做指针,于是一个数据作为参C递给某个函数的时候,有两种方式Q传|或是传指针,它们的区别,可以用一个简单的例子说明Q?/p>

/* ?5 */
/**
* @(#) test.c

* @author fancy

*/
void SwapValue(int a, int b) { int t = a; a = b; b = t; } void SwapPointer(int * a, int * b) { int t = * a; * a = * b; * b = t; } void main() { int a = 0, b = 1; printf("1 : a = %d, b = %d\n", a, b); SwapValue(a, b); printf("2 : a = %d, b = %d\n", a, b); SwapPointer(&a, &b); printf("3 : a = %d, b = %d\n", a, b); }

  q行l果Q?/p>

1 : a = 0, b = 1
2 : a = 0, b = 1
3 : a = 1, b = 0

  大家可以明显的看刎ͼ按指针传递参数可以方便的修改通过参数传递进来的|而按g递就不行?/p>

  ?Java 成长h的时候,许多?C E序员开始{向学?JavaQ他们发玎ͼ使用cM SwapValue 的方法仍然不能改变通过参数传递进来的单数据类型的|但是如果是一个对象,则可能将其成员随意更攏V于是他们觉得这很像?C 语言中传?传指针的问题。但?Java 中没有指针,那么q个问题演变成了传?传引用的问题。可惜将q个问题攑֜ Java 中进行讨论ƈ不恰当?/p>

  讨论q样一个问题的最l目的只是ؓ了搞清楚何种情况才能在方法函C方便的更改参数的值ƈ使之长期有效?/p>

  Java 中,改变参数的值有两种情况Q第一U,使用赋值号?”直接进行赋g其改变,如例 1 和例 4Q第二种Q对于某些对象的引用Q通过一定途径对其成员数据q行改变Q如?3。对于第一U情况,其改变不会媄响到Ҏ该方法以外的数据Q或者直接说源数据。而第二种ҎQ则相反Q会影响到源数据——因为引用指C的对象没有变,对其成员数据q行改变则实质上是改变的该对象?/p>

  5. 如何实现cM swap 的方?/strong>

  传D是传引用的问题,到此已经是解决了,但是我们仍然不能解决q样一个问题:如果我有两个 int 型的变量 a ?bQ我惛_一个方法来交换它们的|应该怎么办?

  l论很让人失望——没有办法!因此Q我们只能具体情况具体讨论,以经怋用交换方法的排序ZQ?/p>

/** ?6 */
/**
* @(#) Test.java

* @author fancy

*/
public class Test { public static void swap(int[] data, int a, int b) { int t = data[a]; data[a] = data[b]; data[b] = t; } public static void main(String[] args) { int[] data = newint[10]; for (int i = 0; i < 10; i++) { data[i] = (int) (Math.random() * 100); System.out.print(" " + data[i]); } System.out.println(); for (int i = 0; i < 9; i++) { for (int j = i; j < 10; j++) { if (data[i] > data[j]) { swap(data, i, j); } } } for (int i = 0; i < 10; i++) { System.out.print(" " + data[i]); } System.out.println(); } }

  q行l果(情况之一)Q?/p>

78 69 94 38 95 31 50 97 84 1
1 31 38 50 69 78 84 94 95 97

  swap(int[] data, int a, int b) Ҏ在内部实际上是改变了 data 所指示的对象的成员数据Q即上述讨论的第二种改变参数值的Ҏ。希望大家能够D一反三Q用类似的Ҏ来解决相关问题?br />---------------------------------------------------------------------------------------

上面的文字是|上扄,我觉得对象传递还是属于引用传?对于上面的两D代?都可以按引用传递的方式说明:

/* ?3 */
/**
* @(#) Test.java

* @author fancy

*/

public
class Test { public static void test(StringBuffer str) { str.append(", World!"); } public static void main(String[] args) { StringBuffer string = new StringBuffer("Hello"); test(string); System.out.println(string); } }

  q行l果Q?/p>

  Hello, World!

1.string 引用传递给test Ҏ---->2.str 和string 引用指向同一个对?Hello" ----->3.str引用改变了它和string引用指向的同一对象"Hello"----->4.所以System.out.println(string);后的对象也变?br />
对于:

/* ?4 */
/**
* @(#) Test.java

* @author fancy

*/
public class Test { public static void test(String str) { str = "World"; } public static void main(String[] args) { String string = "Hello"; test(string); System.out.println(string); } }

  q行l果Q?/p>

Hello


1.string 引用传递给test Ҏ---->2.str 和string 引用指向同一个对?Hello" ----->3.str引象指向了别的对?World",而没有媄响string引用对象的对?Hello" ---->4.所以System.out.println(string);后的对象q是Hello

对于:

public class Test {
String name;
public void setName(String s) {
name = s;
}
public String getName(){
return name;
}
public void call(Test t) {
Test t2 = new Test();
t2.setName("cba");
t.setName("abc");
t = t2 ;
}
public static void main(String[] arg) {
Test obj = new Test();
obj.call (obj) ;
System.out.println("obj's name: "+obj.getName());
}
}

也可以类似的理解,l果?obj's name: abc



qqqckm 2006-12-07 14:20 发表评论
]]>
Z么要始终使用PreparedStatement代替Statement?http://www.aygfsteel.com/qqqckm/archive/2006/11/23/83054.htmlqqqckmqqqckmThu, 23 Nov 2006 07:36:00 GMThttp://www.aygfsteel.com/qqqckm/archive/2006/11/23/83054.htmlhttp://www.aygfsteel.com/qqqckm/comments/83054.htmlhttp://www.aygfsteel.com/qqqckm/archive/2006/11/23/83054.html#Feedback0http://www.aygfsteel.com/qqqckm/comments/commentRss/83054.htmlhttp://www.aygfsteel.com/qqqckm/services/trackbacks/83054.html 在JDBC应用?如果你已l是E有水^开发?你就应该始终以PreparedStatement代替Statement.也就是说,在Q何时候都不要使用Statement.
Z以下的原?
一.代码的可L和可维护?
虽然用PreparedStatement来代替Statement会代码多出几行,但这L代码无论从可L还是可l护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

不用我多?对于W一U方?别说其他人去M的代?是你自p一D|间再去读,都会觉得伤心.

?PreparedStatement最大可能提高性能.
每一U数据库都会最大努力对预编译语句提供最大的性能优化.因ؓ预编译语句有可能被重复调?所以语句在被DB的编译器~译后的执行代码被缓存下?那么下次调用时只要是相同的预~译语句׃需要编?只要参数直接传入编译过的语句执行代码中(相当于一个涵?׃得到执行.qƈ不是说只有一个Connection中多ơ执行的预编译语句被~存,而是对于整个DB?只要预编译的语句语法和缓存中匚w.那么在Q何时候就可以不需要再ơ编译而可以直接执?而statement的语句中,即是相同一操作,而由于每ơ操作的数据不同所以整个语句相匹配的Z极小,几乎不太可能匚w.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即是相同操作但因ؓ数据内容不一?所以整个个语句本n不能匚w,没有~存语句的意?事实是没有数据库会对普通语句编译后的执行代码缓?

当然q不是所以预~译语句都一定会被缓?数据库本w会用一U策?比如使用频度{因素来军_什么时候不再缓存已有的预编译结?以保存有更多的空间存储新的预~译语句.

?最重要的一Ҏ极大地提高了安全?

即到目前ؓ?仍有一些hq基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作ؓvarpasswd传入q来.用户名随?看看会成Z?

select * from tb_name = '随意' and passwd = '' or '1' = '1';
因ؓ'1'='1'肯定成立,所以可以Q何通过验证.更有甚?
把[';drop table tb_name;]作ؓvarpasswd传入q来,?
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功?但也有很多数据库可以ɘq些语句得到执行.

而如果你使用预编译语?你传入的M内容׃会和原来的语句发生Q何匹配的关系.只要全用预~译语句,你就用不着对传入的数据做Q何过?而如果用普通的statement,有可能要对drop,;{做费尽心机的判断和q虑.

上面的几个原?q不你在M时候都使用PreparedStatement?



qqqckm 2006-11-23 15:36 发表评论
]]>
վ֩ģ壺 | | ״| | | Ʊ| | | û| | Ͼ| ɣ| | ƽ| Ͽ| | Ȫ| | ͨ| ̩˳| | ʯ| ³| | ֣| | | ʲ| | | ǿ| | ʡ| | ̨| | ׺| | | | ׳|