??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲美女又黄又爽在线观看,国产v亚洲v天堂无码网站,亚洲国产精品午夜电影 http://m.tkk7.com/zlsunnan/category/5586.html世界L反反覆覆错错落落地飘?来不及叹?生活不是q_^淡E从从容容的东?不能攑ּzh-cnWed, 28 Feb 2007 07:56:06 GMTWed, 28 Feb 2007 07:56:06 GMT60Java集合概要及面试问题ȝhttp://m.tkk7.com/zlsunnan/archive/2006/07/23/59702.html☆蓝色梦想☆☆蓝色梦想☆Sun, 23 Jul 2006 13:12:00 GMThttp://m.tkk7.com/zlsunnan/archive/2006/07/23/59702.htmlhttp://m.tkk7.com/zlsunnan/comments/59702.htmlhttp://m.tkk7.com/zlsunnan/archive/2006/07/23/59702.html#Feedback0http://m.tkk7.com/zlsunnan/comments/commentRss/59702.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/59702.html

Java提供了数U持有对象的方式Q包括语a内置的ArrayQ还有就是utilities中提供的容器c?container classes)Q又U群集类(collection classes)。集合在java中非帔R要,在讨Z前,先来看几个面试中的经兔R题?br />1 Collection ?Collections的区别?br />2 List, Set, Map是否l承自Collection接口?br />3 ArrayList和Vector的区别?br />4 HashMap和Hashtable的区别?br />尾有答案,我们开始正题?br />
集合Collection接口
--Collection 是Q何对象组Q元素各自独立,通常拥有相同的套用规则。Set、List由它z?br />基本操作Q增加元素add(Object obj); addAll(Collection c);
删除元素Qremove(Object obj); removeAll(Collection c);
求交集:retainAll(Collection c);

讉K/遍历集合元素的好办法是用Iterator接口(q代器用于取代Enumeration)
Public interface Iterator{
Public Boolean hasNext(0;
Public Object next(0;
Public void remove(0;
}

集set
--没有重复目的集?br />有三U特定类型的集可?br />HashSet-Z散列表的集,加进散列表的元素要实现hashCode()Ҏ(gu)
LinkedHashSet-寚wq代Ӟ按增加顺序返回元?br />TreeSet-ZQ^衡)树的数据l构

清单List
--位置性集合。加q清单的元素可以加在清单中特定位|或加到末尾
有两个特定版?br />ArrayList(数组?-cM于VectorQ都用于~放数组l护集合。区别:
一.同步?Vector是线E安全的Q也是说是同步的,而ArrayList是线E序不安全的Q不是同步的
?数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一?br />LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点?br />用在FIFOQ用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()
ListIterator提供双向遍历next() previous()Q可删除、替换、增加元?br />
映射表Map
--用于关键?数值对Q像个Dictionary
处理Map的三U集?br />关键字集KeySet()
数值集value()
目集enrySet()
四个具体版本
HashMap-散列表的通用映射?br />LinkedHashMap-扩展HashMapQ对q回集合q代Ӟl护插入序
WeakHashMap-Z弱引用散列表的映表Q如果不保持映射表外的关键字的引用,则内存回收程序会回收?br />TreeMap-Zq树的映射?

Collectionsc,用于同步集合Q还能改变集合只L式的c?br />e.g.:
Map mp=new HashMap()
mp=Collections.synchronizedMap(mp); //生成U程安全的映表
mp=Collections.unmodifiableMap(mp); //生成只读映射?br />
Comparable 自然序的排序类 Comparator 面向树的集合排序c?br />
容器分类?Container taxonomy)
集合接口Q?Collection List Set;Map Iterator ListIterator?br />抽象c: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList?br />
老版本中的集合类?br />Vectorc?br />VectorQ就是向量。一U异构的混合体,可以动态增加容量。对它的操作要如?br />比如我们有一个Vector: Vector myVec=new Vector(a_Array.length)
取得vector的长?myVec.size();
赋|set(int position,Object obj) / setElementAt(Object obj, int position) –不支持动态增?br />add(Object obj )/ addElement(Object obj) 在Vector末尾加入对象
e.g.QmyVec.add(new a_Array[0]);
取出元素Qget(int position) / getElement(int position)

Stackc?br />是Vector的子cR就是数据结构里讲滥了的堆栈Q这个词可简U栈Q不要؜淆于heap-堆)。后q先出的存取方式?br />Stack()构造空?br />Empty()叛空
Search()查堆栈是否有元素
Peek()取得栈顶元素
Pop()Ҏ(gu)
Push()入栈

Enumeration接口
Dictionaryc?br />字典。关键字/数值方式存取数据,如果映射没有此关键字Q取回null?br />
Hashtablec?br />是Dictionaryl构的具体实现?br />
面试题答?br />1、Collection ?Collections的区别?br />Collections是个java.util下的c,它包含有各种有关集合操作的静态方法。Collections是针寚w合类的一个帮助类Q他提供一pd静态方法实现对各种集合的搜索、排序、线E安全化{操?
Collection是集合类的上U接口,xjava.util下的接口Q它是各U集合结构的父接口。承于它的接口主要有Set 和List?br />2、List, Set, Map是否l承自Collection接口? ListQSet是,Map不是
3、ArrayList和Vector的区别?br />一.同步?Vector是线E安全的Q也是说是同步的,而ArrayList是线E序不安全的Q不是同步的
?数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一?br />4、HashMap和Hashtable的区?
一.历史原因:Hashtable是基于陈旧的DictionarycȝQHashMap是Java 1.2引进的Map接口的一个实?
?同步?Hashtable是线E安全的Q也是说是同步的,而HashMap是线E序不安全的Q不是同步的
?|只有HashMap可以让你空gZ个表的条目的key或value


补充有关集合cȝ几个面试题目如下:
1、Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别
{:Set里的元素是不能重复的Q那么用iterator()Ҏ(gu)来区分重复与否。equals()是判M个Set是否相等
equals()?=Ҏ(gu)军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真?/p>

☆蓝色梦想☆ 2006-07-23 21:12 发表评论
]]>
SynchronizedMaphttp://m.tkk7.com/zlsunnan/archive/2006/07/02/56184.html☆蓝色梦想☆☆蓝色梦想☆Sun, 02 Jul 2006 11:28:00 GMThttp://m.tkk7.com/zlsunnan/archive/2006/07/02/56184.htmlhttp://m.tkk7.com/zlsunnan/comments/56184.htmlhttp://m.tkk7.com/zlsunnan/archive/2006/07/02/56184.html#Feedback1http://m.tkk7.com/zlsunnan/comments/commentRss/56184.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/56184.htmlDoug Lea?code>util.concurrent包除了包含许多其他有用的q发构造块之外Q还包含了一些主要集合类?code>List?code>Map的高性能的、线E安全的实现。Brian Goetz向?zhn)展示了?code>ConcurrentHashMap替换Hashtable?code>synchronizedMapQ将有多ƈ发程序获益?/blockquote>

在Javacd中出现的W一个关联的集合cLHashtableQ它是JDK 1.0的一部分?code>Hashtable提供了一U易于用的、线E安全的、关联的map功能Q这当然也是方便的。然而,U程安全性是凭代h来的—?code>Hashtable的所有方法都是同步的?此时Q无竞争的同步会D可观的性能代h(hun)?code>Hashtable的后l?code>HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的基cd一个同步的包装?code>Collections.synchronizedMapQ解决了U程安全性问题?通过基本的功能从线E安全性中分离开来,Collections.synchronizedMap允许需要同步的用户可以拥有同步Q而不需要同步的用户则不必ؓ同步付出代h(hun)?/p>

Hashtable ?code> synchronizedMap所采取的获得同步的单方法(同步Hashtable中或者同步的Map包装器对象中的每个方法)有两个主要的不。首先,q种Ҏ(gu)对于可׾~性是一U障,因ؓ一ơ只能有一个线E可以访问hash表?同时Q这样仍不以提供真正的U程安全性,许多公用的؜合操作仍焉要额外的同步。虽然诸?code>get() ?code> put()之类的简单操作可以在不需要额外同步的情况下安全地完成Q但q是有一些公用的操作序列 Q例如P代或者put-if-absentQ空则放入)Q需要外部的同步Q以避免数据争用?/p>

有条件的U程安全?/span>
同步的集合包装器 synchronizedMap ?code> synchronizedListQ有时也被称?em>有条件地U程安全——所?单个的操作都是线E安全的Q但是多个操作组成的操作序列却可能导致数据争用,因ؓ在操作序列中控制取决于前面操作的结果?清单1中第一片段展示了公用的put-if-absent语句块——如果一个条目不?code>Map中,那么dq个条目。不q的是, ?code>containsKey()Ҏ(gu)q回?code>put() Ҏ(gu)被调用这D|间内Q可能会有另一个线E也插入一个带有相同键的倹{如果?zhn)想确保只有一ơ插入,(zhn)需要用一个对Map mq行同步的同步块这一对语句包装v来?/p>

清单1中其他的例子与P代有兟뀂在W一个例子中Q?code>List.size() 的结果在循环的执行期间可能会变得无效Q因为另一个线E可以从q个列表中删除条目。如果时Z得当Q在刚好q入循环的最后一ơP代之后有一个条目被另一个线E删?了,?code>List.get()返?code>nullQ?code>doSomething() 则很可能会抛Z?code>NullPointerException异常。那么,采取什么措施才能避免这U情况呢Q如果当(zhn)正在P代一?code>List 时另一个线E也 可能正在讉Kq个 ListQ那么在q行q代时?zhn)必须使用一?code>synchronized 块将q个List 包装hQ??code>List 1 上同步,从而锁住整?code>List。这样做虽然解决了数据争用问题,但是在ƈ发性方面付Z更多的代P因ؓ在P代期间锁住整?code>List会阻塞其他线E,使它们在很长一D|间内不能讉Kq个列表?/p>

集合框架引入了P代器Q用于遍历一个列表或者其他集合,从而优化了对一个集合中的元素进行P代的q程。然而,?code>java.util 集合cM实现的P代器极易崩溃Q也是_如果在一个线E正在通过一?code>Iterator遍历集合Ӟ另一个线E也来修改这?集合Q那么接下来?code>Iterator.hasNext() ?code> Iterator.next()调用抛?code>ConcurrentModificationException异常。就?刚才q个例子来讲Q如果想要防止出?code>ConcurrentModificationException异常Q那么当(zhn)正在进行P代时Q?zhn)必?使用一个在 List l上同步的synchronized块将?List 包装hQ从而锁住整?List。(或者,(zhn)也可以调用List.toArray()Q在 不同步的情况下对数组q行q代Q但是如果列表比较大的话q样做代价很高)?/p> 清单 1. 同步的map中的公用竞争条g
												
    Map m = Collections.synchronizedMap(new HashMap());
    List l = Collections.synchronizedList(new ArrayList());

    // put-if-absent idiom -- contains a race condition
    // may require external synchronization
    if (!map.containsKey(key))
      map.put(key, value);

    // ad-hoc iteration -- contains race conditions
    // may require external synchronization
    for (int i=0; i<list.size(); i++) {
      doSomething(list.get(i));
    }

    // normal iteration -- can throw ConcurrentModificationException
    // may require external synchronization
    for (Iterator i=list.iterator(); i.hasNext(); ) {
      doSomething(i.next());
    }

										

信Q的错?/span>
synchronizedList ?code> synchronizedMap提供的有条g的线E安全性也带来了一个隐(zhn)?code>—?/code>开发者会假设Q因些集合都是同步的Q所以它们都是线E安全的Q这样一来他们对于正地同步混合操作qg事就会疏忽。其l果是尽表面上q些E序在负载较ȝ时候能够正常工作,但是一旦负载较重,它们׃开始抛?code>NullPointerException ?code> ConcurrentModificationException?/code>

可׾~性问?/span>
可׾~性指的是一个应用程序在工作负蝲和可用处理资源增加时其吞吐量的表现情c一个可伸羃的程序能够通过使用更多的处理器、内存或者I/O带宽来相应地处理更大的工作负载。锁住某个共享的资源以获得独占式的访问这U做法会形成可׾~性瓶颈——它使其他线E不能访问那个资源,即有空闲的处理器可以调用那些线E也无济于事。ؓ了取得可伸羃性,我们必须消除或者减我们对独占式资源锁的依赖?/p>

同步的集合包装器以及早期?code>Hashtable ?code> Vectorcd来的更大的问题是Q它们在单个的锁 上进行同步。这意味着一ơ只有一个线E可以访问集合,如果有一个线E正在读一?code>MapQ那么所有其他想要读或者写q个Map的线E就必须{待。最常见?code>Map操作Q?code>get() ?code> put()Q可能比表面上要q行更多的处理——当遍历一个hash表的bucket以期扑ֈ某一特定的keyӞget()必须对大量的候选bucket调用Object.equals()。如果keyc?/font>所使用?code>hashCode()函数不能value均匀地分布在整个hash表范围内Q或者存在大量的hash冲突Q那么某些bucket铑ְ会比其他的链长很多,而遍历一个长的hash链以及对该hash链上一定百分比的元素调?equals()是一件很慢的事情。在上述条g下,调用 get() ?code> put() 的代价高的问题不仅仅是指讉Kq程的缓慢,而且Q当有线E正在遍历那个hash链时Q所有其他线E都被锁在外面,不能讉Kq个Map?/p>

Q哈希表Ҏ(gu)一个叫做hash的数字关键字QkeyQ将对象存储在bucket中。hash value是从对象中的D得来的一个数字。每个不同的hash value都会创徏一个新的bucket。要查找一个对象,(zhn)只需要计这个对象的hash valueq搜索相应的bucketp了。通过快速地扑ֈ相应的bucketQ就可以减少(zhn)需要搜索的对象数量了。译者注Q?/p>

get()执行h可能会占用大量的旉Q而在某些情况下,前面已经作了讨论的有条g的线E安全性问题会让这个问题变得还要糟p得多?a >清单1 中演C的争用条g常常使得对单个集合的锁在单个操作执行完毕之后q必ȝl保持一D较长的旉。如果?zhn)要在整个q代期间都保持对集合的锁Q那么其他的U程׃在锁外停留很长的一D|_{待解锁?/p>

实例Q一个简单的cache
Map在服务器应用中最常见的应用之一是实现一?code>cache?/code>服务器应用可能需要缓存文件内宏V生成的面、数据库查询的结果、与l过解析的XML文g相关的DOM树,以及许多其他cd的数据。cache的主要用途是重用前一ơ处理得出的l果 以减服务时间和增加吞吐量。cache工作负蝲的一个典型的特征是索大大多于更斎ͼ因此Q理x况下Qcache能够提供非常好的get()性能。不q,使用?妨碍性能的cacheq不如完全不用cache?/p>

如果使用 synchronizedMap 来实C个cacheQ那么?zhn)在?zhn)的应用E序中引入了一个潜在的可׾~性瓶颈。因Zơ只有一个线E可以访?code>MapQ这 些线E包括那些要?code>Map中取Z个值的U程以及那些要将一个新?code>(key, value)Ҏ(gu)入到该map中的U程?/p>

减小锁粒?/span>
提高HashMap的ƈ发性同时还提供U程安全性的一U方法是废除Ҏ(gu)个表使用一个锁的方式,而采用对hash表的每个bucket都用一个锁的方式(或者,更常见的是,使用一个锁池,每个锁负责保护几个bucketQ?。这意味着多个U程可以同时地访问一?code>Map的不同部分,而不必争用单个的集合范围的锁。这U方法能够直接提高插入、检索以及移除操作的可׾~性。不q的是,q种q发性是以一定的代h(hun)换来的——这使得Ҏ(gu)?集合q行操作的一些方法(例如 size() ?code> isEmpty()Q的实现更加困难Q因些方法要求一ơ获得许多的锁,q且q存在返回不正确的结果的风险。然而,对于某些情况Q例如实现cacheQ这样做是一个很好的折衷——因为检索和插入操作比较频繁Q?size() ?code> isEmpty()操作则少得多?/p>

ConcurrentHashMap
util.concurrent 包中?code>ConcurrentHashMapc(也将出现在JDK 1.5中的java.util.concurrent包中Q是?code>Map的线E安全的实现Q比?code>synchronizedMap来,它提供了好得多的q发性。多个读操作几乎d以ƈ发地执行Q同时进行的d写操作通常也能q发地执行,而同时进行的写操作仍然可以不时地q发q行Q相关的cM提供了类似的多个ȝE的q发性,但是Q只允许有一个活动的写线E)。ConcurrentHashMap被设计用来优化检索操作;实际上,成功?get() 操作完成之后通常Ҏ(gu)不会有锁着的资源。要在不使用锁的情况下取得线E安全性需要一定的技巧性,q且需要对Java内存模型QJava Memory ModelQ的l节有深入的理解?code>ConcurrentHashMap实现Q加?code>util.concurrent包的其他部分Q已l被研究正确性和U程安全性的q发专家所正视。在下个月的文章中,我们看?code>ConcurrentHashMap的实现的l节?/p>

ConcurrentHashMap 通过E微地松弛它对调用者的承诺而获得了更高的ƈ发性。检索操作将可以q回由最q完成的插入操作所插入的|也可以返回在步调上是q发的插入操作所d的|但是决不会返回一个没有意义的l果Q。由ConcurrentHashMap.iterator()q回?code>Iterators每ơ最多返回一个元素,q且决不会抛?code>ConcurrentModificationException异常Q但是可能会也可能不会反映在该P代器被构Z后发生的插入操作或者移除操作。在?集合q行q代Ӟ不需要表范围的锁p提供U程安全性。在M不依赖于锁整个表来防止更新的应用E序中,可以使用ConcurrentHashMap来替?code>synchronizedMap?code>Hashtable?/p>

上述改进使得ConcurrentHashMap能够提供?code>Hashtable高得多的可׾~性,而且Q对于很多类型的公用案例Q比如共享的cacheQ来_q不用损失其效率?/p>

好了多少Q?/span>
?1?code>Hashtable ?code> ConcurrentHashMap的可伸羃性进行了_略的比较。在每次q行q程中,n 个线Eƈ发地执行一个死循环Q在q个d@环中q些U程从一?code>Hashtable 或?ConcurrentHashMap中检索随机的key valueQ发现在执行put()操作时有80%的检索失败率Q在执行操作时有1%的检索成功率。测试所在的q_是一个双处理器的XeonpȝQ操作系l是Linux。数据显CZ10,000,000ơP代以毫秒计的q行旉Q这个数据是在将?code>ConcurrentHashMap?/code>操作标准化ؓ一个线E的情况下进行统计的。?zhn)可以看到Q当U程增加到多个时Q?code>ConcurrentHashMap的性能仍然保持上升势Q?code>Hashtable的性能则随着争用锁的情况的出现而立即降了下来?/p>

比v通常情况下的服务器应用,q次试中线E的数量看上L点少。然而,因ؓ每个U程都在不停地对表进行操作,所以这与实际环境下使用q个表的更多数量的线E的争用情况基本{同?/p>

?1.Hashtable ?ConcurrentHashMap在可伸羃性方面的比较

U程?/b> ConcurrentHashMap Hashtable
1 1.00 1.03
2 2.59 32.40
4 5.58 78.23
8 13.21 163.48
16 27.58 341.21
32 57.27 778.41

CopyOnWriteArrayList
在那些遍历操作大大地多于插入或移除操作的q发应用E序中,一般用CopyOnWriteArrayListcL?code>ArrayList。如果是用于存放一个侦听器QlistenerQ列表,例如在AWT或Swing应用E序中,或者在常见的JavaBean中,那么q种情况很常见(相关?code>CopyOnWriteArraySet使用一?code>CopyOnWriteArrayList来实?code>Set接口Q??/p>

如果(zhn)正在用一个普通的ArrayList来存放一个侦听器列表Q那么只要该列表是可变的Q而且可能要被多个U程讉KQ?zhn)?必要么在对其q行q代操作期间Q要么在q代前进行的克隆操作期间Q锁定整个列表,q两U做法的开销都很大。当对列表执行会引v列表发生变化的操作时Q?code>CopyOnWriteArrayListq不是ؓ列表创徏一个全新的副本Q它的P代器肯定能够q回在P代器被创建时列表的状态,而不会抛?code>ConcurrentModificationException。在对列表进行P代之前不必克隆列表或者在q代期间?定列表,因ؓq代器所看到的列表的副本是不变的。换句话_CopyOnWriteArrayList含有对一个不可变数组的一个可变的引用Q因此,只要保留好那个引用,(zhn)就可以获得不可变的U程安全性的好处Q而且不用?定列表?/p>

l束?/span>
同步的集合类Hashtable ?code> VectorQ以及同步的包装器类 Collections.synchronizedMap ?code> Collections.synchronizedListQؓMap ?code> List提供了基本的有条件的U程安全的实现。然而,某些因素使得它们q不适用于具有高度ƈ发性的应用E序中——它们的 集合范围的单锁特性对于可伸羃性来说是一个障,而且Q很多时候还必须在一D较长的旉内锁定一个集合,以防止出?code>ConcurrentModificationExceptions异常?ConcurrentHashMap ?code> CopyOnWriteArrayList实现提供了更高的q发性,同时q保住了U程安全性,只不q在对其调用者的承诺上打了点折扣?code>ConcurrentHashMap ?code> CopyOnWriteArrayListq不是在(zhn)?code>HashMap ?code> ArrayList的Q何地斚w一定有用,但是它们是设计用来优化某些特定的公用解决Ҏ(gu)的。许多ƈ发应用程序将从对它们的用中获得好处?/p>

]]>
Javacd转换的一个工Lhttp://m.tkk7.com/zlsunnan/archive/2006/06/08/51551.html☆蓝色梦想☆☆蓝色梦想☆Thu, 08 Jun 2006 15:07:00 GMThttp://m.tkk7.com/zlsunnan/archive/2006/06/08/51551.htmlhttp://m.tkk7.com/zlsunnan/comments/51551.htmlhttp://m.tkk7.com/zlsunnan/archive/2006/06/08/51551.html#Feedback0http://m.tkk7.com/zlsunnan/comments/commentRss/51551.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/51551.html

代码内容
/*
* Created on 2005-6-6
* Made In GamVan
*/
package com.gamvan.tools;
public class TypeChange {


public static String nullOfString(String str){
if(str==null){
str = "";
}
return str;
}

public static byte stringToByte(String str){
byte b = 0;
if(str!=null){
try{
b = Byte.parseByte(str);
}catch(Exception e){

}
}
return b;
}

public static boolean stringToBoolean(String str){
if(str==null){
return false;
}else{
if(str.equals("1")){
return true;
}else if(str.equals("0")){
return false;
}else{
try{
return Boolean.parseBoolean(str);
}catch(Exception e){
return false;
}
}
}
}

public static int stringToInt(String str){
int i=0;
if(str!=null){
try{
i = Integer.parseInt(str.trim());
}catch(Exception e){
i = 0;
}

}else{
i = 0;
}
return i;
}
public static short stringToShort(String str){
short i=0;
if(str!=null){
try{
i = Short.parseShort(str.trim());
}catch(Exception e){
i = 0;
}
}else{
i = 0;
}
return i;
}


public static double stringToDouble(String str){
double i=0;
if(str!=null){
try{
i = Double.parseDouble(str.trim());
}catch(Exception e){
i = 0;
}
}else{
i = 0;
}
return i;
}

public static String intToString(int i){
String str = "";
try{
str = String.valueOf(i);
}catch(Exception e){
str = "";
}
return str;
}


public static long doubleToLong(double d){
long lo=0;
try{
//double转换成long前要qo掉doublecd数点后数据
lo = Long.parseLong(String.valueOf(d).substring(0,String.valueOf(d).lastIndexOf(".")));
}catch(Exception e){
lo=0;
}
return lo;
}

public static int doubleToInt(double d){
int i=0;
try{
//double转换成long前要qo掉doublecd数点后数据
i = Integer.parseInt(String.valueOf(d).substring(0,String.valueOf(d).lastIndexOf(".")));
}catch(Exception e){
i=0;
}
return i;
}

public static double longToDouble(long d){
double lo=0;
try{
lo = Double.parseDouble(String.valueOf(d));
}catch(Exception e){
lo=0;
}
return lo;
}

public static int longToInt(long d){
int lo=0;
try{
lo = Integer.parseInt(String.valueOf(d));
}catch(Exception e){
lo=0;
}
return lo;
}
public static long stringToLong(String str) {
Long li = new Long(0);
try{
li = Long.valueOf(str);
}catch(Exception e){
//li = new Long(0);
}
return li.longValue();
}
public static String longToString(long li) {
String str = "";
try{
str = String.valueOf(li);
}catch(Exception e){

}
return str;
}

}

怿大家都能看懂Q这里就不解释了Q关于用我举个例子字符串{换成Intcd  如下

代码内容
int i = TypeChange.stringToInt("213324");


]]>
充分利用java.util.Collectionsc?http://m.tkk7.com/zlsunnan/archive/2006/05/24/47915.html☆蓝色梦想☆☆蓝色梦想☆Wed, 24 May 2006 15:30:00 GMThttp://m.tkk7.com/zlsunnan/archive/2006/05/24/47915.htmlhttp://m.tkk7.com/zlsunnan/comments/47915.htmlhttp://m.tkk7.com/zlsunnan/archive/2006/05/24/47915.html#Feedback0http://m.tkk7.com/zlsunnan/comments/commentRss/47915.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/47915.htmlClick here to find out more!

Javadocl出CollectionscL完整的描qͼ“这一个类包含可以操作或返回集合的专用静态类。?/p>

使用copyҎ(gu)可以一个java.util.List复制到其他:

Collections.copy(newList, sourceList);

如果你需要一个列表随机化Q可以调用shuffleҎ(gu)Q?/p>

shuffle(list);

q一Ҏ(gu)可以记录列表中的内容。如果你惌回随机列表的来源处,可以调用它的siblingҎ(gu)Q?/p>

shuffle(List list, Random random)

如果你需要徏立一个不能更改的集合Q可以?i>unmodifiableCollection(Collection c)Ҏ(gu)。这一Ҏ(gu)包含siblingҎ(gu)QsiblingҎ(gu)可以处理特定cd的Set, List, 和Map。对于Set和MapQ你可以通过使用一些sortedҎ(gu)来获得结果对象的排序?/p>

List newList = Collections.unmodifiableList(myList);

如果你是在编写需要Enumeration对象操作斚w的代码,可以充分利用enumerationҎ(gu)Q?/p>

Enumeration e = Collections.enumeration(collection);

当你想用一个简单对象来代替多个对象的时候,请?i>fill(List list, Object obj)Ҏ(gu)?/p>

其他的,当你需要具有相同对象的多个引用的列表时Q可以?i>nCopies(int n, Object o)Ҏ(gu)?/p>

当你需要在其他列表中查找一个列表的位置Ӟ请?i>indexOfSubList(List source, List target)或?i>lastIndexOfSubList(List source, List target)Ҏ(gu)。如果目标列表存在于其他列表中,q一Ҏ(gu)返回包含列表v始位|的索引。如果在列表中无法找到目标列表,q两U方法都q回-1?/p>

如果你需要一个列表的排序相反?反序)Q则可以调用reverseҎ(gu)Q这一Ҏ(gu)可以使列表现有元素的序号重新排序?/p>

正如你所看到的,collectionscd含很多方法。也怽很少使用到某些方法,但你可以会经怋用到其中的一些?/p>

同样Q也存在三种I的集合域。EMPTY_LIST, EMPTY_MAP, 和EMPTY_SET可以帮助你避免不必要的对象生成,特别是当q回数据的空集合的时候。例如:

public List getData(Criteria c) {
  ...
  
  if ( noData ) {
      return Collections.EMPTY_LIST;
  }
  
  // otherwise
  // gather and return data

  ... 
}

你可以徏立一个没有元素的列表Q但是当可以避免建立对象的时候最好不要徏立对象?/p>

]]>
Java中对HashMap的深度分析与比较http://m.tkk7.com/zlsunnan/archive/2006/03/09/34557.html☆蓝色梦想☆☆蓝色梦想☆Thu, 09 Mar 2006 14:25:00 GMThttp://m.tkk7.com/zlsunnan/archive/2006/03/09/34557.htmlhttp://m.tkk7.com/zlsunnan/comments/34557.htmlhttp://m.tkk7.com/zlsunnan/archive/2006/03/09/34557.html#Feedback0http://m.tkk7.com/zlsunnan/comments/commentRss/34557.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/34557.html 
  HashMap可谓JDK的一大实用工P把各个Object映射hQ实C“键Q-值”对应的快速存取。但实际里面做了些什么呢Q?

  在这之前Q先介绍一下负载因子和定w的属性。大安知道其实一?HashMap 的实际容量就 因子*定wQ其默认值是 16×0.75Q?2Q?q个很重要,Ҏ(gu)率很一定媄响!当存入HashMap的对象超q这个容量时QHashMap ׃重新构造存取表。这是一个大问题Q我后面慢慢介绍Q反正,如果你已l知道你大概要存攑֤个对象Q最好设实际定w的能接受的数字?/P>

  两个关键的方法,put和getQ?/P>

  先有q样一个概念,HashMap是声明了 MapQCloneable, Serializable 接口Q和l承?AbstractMap c,里面?Iterator 其实主要都是其内部类HashIterator 和其他几?iterator cd玎ͼ当然q有一个很重要的承了Map.Entry ?Entry 内部c,׃大家都有源代码,大家有兴可以看看这部分Q我主要惌明的?Entry 内部cR它包含了hashQvalueQkey 和next q四个属性,很重要。put的源码如?/P>

  public Object put(Object key, Object value) {
  Object k = maskNull(key);

  q个是判断键值是否ؓI,q不很深奥,其实如果为空Q它会返回一个static Object 作ؓ键|q就是ؓ什么HashMap允许I键值的原因?/P>

  int hash = hash(k);
  int i = indexFor(hash, table.length);

  q连l的两步是 HashMap 最牛的地方Q研I完我都汗颜了,其中 hash 是通过 key q个Object?hashcode q行 hashQ然后通过 indexFor 获得在Object table的烦引倹{?/P>

  tableQ?Q不要惊Ӟ其实HashMap也神不到哪里去,它就是用 table 来放的。最牛的是?hash 能正的q回索引。其中的hash法Q我跟JDK的作?Doug 联系q,他徏议我看看《The art of programing vol3》可恨的是,我之前就一直在找,我都找不刎ͼ他这样一提,我就更加急了Q可惜口袋空I啊Q!Q?/P>

  不知道大家有没有留意 put 其实是一个有q回的方法,它会把相同键值的 put 覆盖掉ƈq回旧的|如下Ҏ(gu)d说明?HashMap 的结构,其实是一个表加上在相应位|的Entry的链表:

for (Entry e = table[i]; e != null; e = e.next) {
 if (e.hash == hash && eq(k, e.key)) {
  Object oldvalue = e.value;
  e.value = value; //把新的D予给对应键倹{?BR>  e.recordAccess(this); //I方法,留待实现
  return oldvalue; //q回相同键值的对应的旧的倹{?BR> }
}
modCount++; //l构性更改的ơ数
addEntry(hash, k, value, i); //d新元素,关键所在!
return null; //没有相同的键D?BR>}

  我们把关键的Ҏ(gu)拿出来分析:

  void addEntry(int hash, Object key, Object value, int bucketIndex) {
  table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]); 

  因ؓ hash 的算法有可能令不同的键值有相同的hash码ƈ有相同的table索引Q如QkeyQ?3”和keyQObject g的hash都是Q?901334Q那它经qindexfor之后的烦引一定都为iQ这样在new的时候这个Entry的next׃指向q个原本的table[i]Q再有下一个也如此QŞ成一个链表,和put的@环对定e.next获得旧的倹{到q里QHashMap的结构,大家也十分明白了吧?

  if (size++ >= threshold) //q个threshold是能实际容U的?BR>  resize(2 * table.length); //出q个定w׃Object table重构

  所谓的重构也不,是Z个两倍大的tableQ我在别的论坛上看到有h说是两倍加1Q把我骗了)Q然后再一个个indexforq去Q注意!Q这是效率Q!如果你能让你的HashMap不需要重构那么多ơ,效率会大大提高!

  说到q里也差不多了,get比put单得多,大家Q了解putQget也差不了多少了。对于collections我是认ؓQ它是适合q泛的,当不完全适合Ҏ(gu)的,如果大家的程序需要特D的用途,自己写吧Q其实很单。(作者是q样跟我说的Q他q徏议我用LinkedHashMap,我看了源码以后发玎ͼLinkHashMap其实是l承HashMap的,然后override相应的方法,有兴的同hQ自己looklookQ徏?Object tableQ写相应的算法,ok啦?/P>

  举个例子吧,?VectorQlist 啊什么的其实都很单,最多就多了的同步的声明Q其实如果要实现像Vector那种Q插入,删除不多的,可以用一个Object table来实玎ͼ按烦引存取,d{?/P>

  如果插入Q删除比较多的,可以Z个Object tableQ然后每个元素用含有nextl构的,一个table存,如果要插入到iQ但是i已经有元素,用nextqv来,然后sizeQ+Qƈ在另一个table记录其位|?/P>

]]>
Java打包详解http://m.tkk7.com/zlsunnan/archive/2005/12/28/25684.html☆蓝色梦想☆☆蓝色梦想☆Wed, 28 Dec 2005 03:01:00 GMThttp://m.tkk7.com/zlsunnan/archive/2005/12/28/25684.htmlhttp://m.tkk7.com/zlsunnan/comments/25684.htmlhttp://m.tkk7.com/zlsunnan/archive/2005/12/28/25684.html#Feedback0http://m.tkk7.com/zlsunnan/comments/commentRss/25684.htmlhttp://m.tkk7.com/zlsunnan/services/trackbacks/25684.html兄弟Q对java着q吗Q或者是Z自己的生计,不论怎样都欢q你q入_ֽjava世界QwelcomeQ可能你刚刚Ҏ(gu)个h_Hello WorldQ也或者……okQ这已经_了。那p我们开始吧Q开始这个魔qM界的旅程Q?

jar文g听说q吗Q没有?或者陌生!好,没关p,q就是我们的W一站:打包发布?

Z么会有这个玩意呢Q首先,q是jar的全UͼJavaTM Archive (JAR) fileQ是的,是java存档文g。这有点cMzip文gQ想一惛_是干什么的用的呢,压羃Q?没错是要压~,我们原先零散的东西攑ֈ一下,重新l织Q所有这些目的只有一个:方便Q好了,不用他是怎么压羃的,我们的重Ҏ(gu)哪些是我们要压羃?输入)Q还有压~成了什?输出)Q进而将它发?部v)?

那我们的输入(要压~的东西)主要是class文gQ还有辅助的资源(q其中可能有囄Qjsp文gQhtml文g{等)。Jar技术在jdk1.1版本中就已存在,?.2中又有了增强。接下来说说jar的好处吧Q这是官方的描述Q安全,快速下载,压羃Q猎取包Q版本化包,可携?

说了q么多,我们现在开始实施?

先打开命o提示W?win2000或在q行{里执行cmd命oQwin98为DOS提示W?Q输入jar –help,然后回R(如果你盘上已l有了jdk1.1或以上版?Q看C么:

用法Qjar {ctxu}[vfm0Mi] [jar-文g] [manifest-文g] [-C 目录] 文g?...

选项Q?

-c 创徏新的存档
-t 列出存档内容的列?BR>-x 展开存档中的命名的(或所有的〕文?BR>-u 更新已存在的存档
-v 生成详细输出到标准输Z
-f 指定存档文g?BR>-m 包含来自标明文g的标明信?BR>-0 只存储方式;未用ZIP压羃格式
-M 不生所有项的清单(manifest〕文?BR>-i 为指定的jar文g产生索引信息
-C 改变到指定的目录Qƈ且包含下列文Ӟ

如果一个文件名是一个目录,它将被递归处理?

清单Qmanifest〕文件名和存档文件名都需要被指定Q按'm' ?'f'标志指定的相同顺序?

CZ1Q将两个class文g存档C个名?'classes.jar' 的存档文件中Q?BR>jar cvf classes.jar Foo.class Bar.class

CZ2Q用一个存在的清单QmanifestQ文?'mymanifest' ?foo/ 目录下的所有文件存档到一个名?'classes.jar' 的存档文件中Q?BR>jar cvfm classes.jar mymanifest -C foo/ .

来个例子试试看Q?BR>我们只有一个HelloWorldQ如下:

public  class  HelloWorld{
 public static void main(String[] args){
 System.out.println(“Hi, Hello World!?;
}
}


我将q个java文g存到C盘跟目录下,okQ接下来Q?

在先前打开的命令提C符?跌{到C盘提C符?Q我们输入javac HelloWorld.javaQ然后l输入:jar cvf hello.jar HelloWorld.classQ回车后M的C盘看看,多了什么,没错 hello.jar ?

基本的步骤我们现在都知道了,你可以自己去试一下随着jar后面的参数的不同Q结果有什么变化?

紧接着我们看看如何q行我们的jar包?

在进入正题之前,你要先打开我们刚刚做好的jar包看看,多了什么呢QMETA-INF目录Q再看看里面是什么,q有一个MANIFEST.MF文g是不是?用文本编辑器(我这里是UltraEdit)打开它看看:
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)

是q样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类Q也是我们的入口类。也卻I
Manifest-Version: 1.0
Created-By: 1.4.2 (Sun Microsystems Inc.)
Main-Class: HelloWorld

接下来,我们在命令提C符里执行:
jar umf MANIFEST.MF app.jar

q样我们使用了我们自qMANIFEST.MF文g对原来默认的q行了更新。你不妨可以再进ȝ看是不是M了Main-Class: HelloWorldq一句?

OkQ这个最后的一步了Q来验证我们做的一切,在命令提C符中输入:
java -jar hello.jar(执行)

出现了什么,――Hi, Hello World!

我们再来看看jar文g在tomcat中发布,注意Q在tomcat中我们就不能再用jarq种格式Q而改war格式Q它是专门用于web应用的,其实整个q程下来基本上和jar是类似的Q?

先准备我们要打包的资源?

扑ֈ存放tomcat的webapps目录Q进到其中,新徏一个文件夹Q这里命名ؓhelloQ再q去新徏WEB-INF文g夹,再进L建classes文g夹,此时我们也将我们唯一的servletQHelloWorld.java攑ֈq里Q在与classes目录同下徏立一文gweb.xml。OkQ目前我们初步徏立了一个简单的web应用?

q是HelloWorld.javaQ?

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse res)
                              throws ServletException, IOException {
  res.setContentType("text/html");
  PrintWriter out = res.getWriter();
  out.println("<HTML>");
  out.println("<HEAD><TITLE>Hello, World!</TITLE></HEAD>");
  out.println("<BODY>");
  out.println("Hello, World!");
  out.println("</BODY></HTML>");
 }
}//end here!


对它~译。下面是web.xmlQ?

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
  '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
  'http://java.sun.com/j2ee/dtds/web-app_2_3.dtd&#39;>
<web-app>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
 <servlet-name>hello</servlet-name>
 <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>
</web-app>


开始压~,形成war档:

在命令提C符下进到先前创制的hello目录下,执行 jar cvf hello.war * Q我们便得到hello.war。将它拷贝至webapps目录下,okQ来看最后一步,打开tomcat的目录conf中的server.xmlQ加入:

<Context path="/hello" docBase="hello.war" debug="0"
    reloadable="true"/>


大功告成Q运行它Q启动tomcatQ后在浏览器中输入http://localhost:8080/hello/HelloWorldQ有了吗Q?

最后,如果你想用ant来完成以上的打包zdQ下面就告诉你:

对于jar来说。在build.xml中,

<target name="jar">
  <jar destfile="${app_home}/hello.jar">
   <fileset dir="${dest}" includes="**"/>
      <!--fileset dir="${dest}" includes="**/action.properties"/-->
    </jar>
 </target>


对于warQ?

<war warfile="hello.war" webxml="./WEB-INF/web.xml">
    <fileset dir="html"/>
    <lib dir="lib/">
        <exclude name="oracle*.jar"/>
    </lib>
    <classes dir="build/servlets">
         <include name="**/*.class"/>
  </classes>
</war>


好了Q就q么多,希望对你有点帮助。:Q?

我上传了上面打过的两个包Qhello.jar和hello.war??点击下蝲 ?/FONT>

?点击下蝲 ?/FONT>

W一rar文g对应的是hello.jar,下蝲后将其名改ؓhello.jar
W二rar文g对应hello.warQ下载后改ؓhello.war?BR>q是׃上传不了jar格式和war格式的文Ӟ你只好照我上面说的去做了 Q)

补充Q?/B>

############

jar基本操作Q?

############

1. 创徏jar文g

jar cf jar-file input-file(s)
c---want to Create a JAR file.
f---want the output to go to a file rather than to stdout.
eg: 1)jar cf myjar.jar query_maintain_insert.htm
    2)jar cvf myjar.jar query_maintain_insert.htm
      v---Produces verbose(详细? output.
    3)jar cvf myjar.jar query_maintain_insert.htm mydirectory
    4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory
      0---don't want the JAR file to be compressed.
    5)jar cmf MANIFEST.MF myjar.jar yahh.txt
      m---Used to include manifest information from an existing manifest file.
    6)jar cMf MANIFEST.MF myjar.jar yahh.txt
      M---the default manifest file should not be produced.
    7)jar cvf myjar.jar *
      *---create all contents in current directory.


2. 察看jar文g

jar tf jar-file

t---want to view the Table of contents of the JAR file.

eg: 1)jar vft yahh.jar

v---Produces verbose(详细? output.

3. 提取jar文g

jar xf jar-file [archived-file(s)]

x---want to extract files from the JAR archive.

eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt)

2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文gyahhalex.txt)

3)jar xf yahh.jar(提取该jar包中的所有文件或目录)

4. 修改Manifest文g

jar cmf manifest-addition jar-file input-file(s)

m---Used to include manifest information from an existing manifest file.

5. 更新jar文g

jar uf jar-file input-file(s)

u---want to update an existing JAR file.


]]>
վ֩ģ壺 ޿ѿ| AV鶹Ʒ| av뾫Ʒ| ѹۿŮվ| ŷ У԰| ëƬvipԱ߿| ɫ͵Ʒһ| պѹۿ| av͵߹ۿ| ѹۿ| WWWѹۿƵ| ɫƷvrһ| ˾Ʒѿ | ޾Ʒ߲| һ߹ۿ| ŷպƵ| avtt| ھƷһëƬѿ| ޳AVۺ߹ۿ| AëƬѹۿAVվ| ߲޾Ʒ| ޾þþþþAV| re99þ6Ʒ| žžƵ| ƷƵ| þùֱ| ޾ƷƵۿ| ƷٸAVѾþϴ| | 337pձŷ޴ɫ| ŮȸͰƵѰ| vaѾƷ| Ƶۿ| ޹Ʒһ| þѹƵ| ޸һӰ | avһ߹ۿ| ĻѸƵ| ޹Ʒ˾Ʒ| һ| þóѵӰ|