#
zz from http://swik.net/User:dnoble/Distributed+Collaboration+Blog/Pidgin+on+Ubuntu+6.10+(Edgy+Eft)/8ik1
1. Get the source bundle from the Pidgin download sitehttp://pidgin.im/pidgin/download/source/2. Extract the contents
tar jxf pidgin-2.0.0.tar.bz2
cd pidgin-2.0.0
3. Install some prerequisites
sudo apt-get install \
libglib1.2-dev \
libglib2.0-dev \
libgtk2.0-dev
sudo apt-get install \
libnspr-dev \
libnspr4 \
libnspr4-0d \
libnss3 \
libnss3-0d \
libnss-db \
libnss-dev \
libssl0.9.8 \
libssl-dev \
openssl \
ssl-cert
(Thanks to the
Ubuntu forums for tips on the SSL library packages)
4. Configure the buildOverride defaults pointing to older versions of GLib and GTK, then generate the makefiles and other build configuration.
export GLIB_LFLAGS=-lglib-2.0
export GLIB_CFLAGS="-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include"
export GTK_LFLAGS="-lgtk-x11-2.0 -lcairo -latk-1.0"
export GTK_CFLAGS="-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include \
-I/usr/include/cairo -I/usr/include/atk-1.0"
export pango_LIBS=-lpango-1.0
export pango_CFLAGS=-I/usr/include/pango-1.0
export CFLAGS="$GLIB_CFLAGS $GTK_CFLAGS $pango_CFLAGS"
./configure
Add a "--prefix=DIR" option to the
configure command if you prefer to specify a custom installation directory.
*
***************************************************************************
./configure 出現(xiàn)錯誤
checking for LIBXML... no
no
configure: error:
You must have libxml2 >= 2.6.0 development headers installed to build.
于是安裝
sudo apt-get install libxml2-dev
*****************************************************************************
5. Build the software
make
If that doesn't work, redirect the output of "make" to a file and search for the string "errors:" to see what went wrong:
make > OUTPUT 2>&1
6. Install the software
sudo make install
If
you ran the configure script with a custom prefix option pointing to a
directory that you can write to without root privileges, then you can
run "make install" without the "sudo".
7. DoneSo that's it. If you are upgrading from Gaim 1.5, all of your configuration will be copied from the
.gaim directory to
.purple in your home directory. Your log files will also be moved, but a symbolic link will point from the
.gaim/logs directory to the .purple/logs directory.
http://www.onjava.com
O'Reilly的Java網(wǎng)站. 每周都有新文章
http://java.sun.com
官方的Java開發(fā)者網(wǎng)站 - 每周都有新文章發(fā)表
http://www.developer.com/java
由Gamelan.com 維護的Java技術文章網(wǎng)站
http://www.java.net
Sun公司維護的一個Java社區(qū)網(wǎng)站
http://www.ibm.com/developerworks/java
IBM的Developerworks技術網(wǎng)站; 這是其中的Java技術主頁
http://www.javaworld.com
最早的一個Java站點. 每周更新Java技術文章
http://www.javadesktop.org
位于Java.net的一個Java桌面技術社區(qū)網(wǎng)站.
http://www.theserverside.com
這是一個討論所有Java服務器端技術的網(wǎng)站.
http://www.jars.com
提供Java評論服務. 包括各種framework和應用程序
http://www.ibiblio.org/javafaq/javafaq.html
comp.lang.java的FAQ站點 - 收集了來自comp.lang.java新聞組的問題和答案的分類目錄.
http://java.sun.com/docs/books/tutorial/
來自SUN公司的官方Java指南 - 對于了解幾乎所有的java技術特性非常有幫助.
http://www.javablogs.com
互聯(lián)網(wǎng)上最活躍的一個Java Blog網(wǎng)站.
http://www.java2s.com
Java Codes
一條獵狗將兔子趕出了窩,一直追趕他,追了很久仍沒有捉到。牧羊看到此種情景,譏笑獵狗說"你們兩個之間小的反而跑得快得多。" 獵狗回答說:"你不知道我們兩個的跑是完全不同的!我僅僅為了一頓飯而跑,他卻是為了性命而跑呀!"
目標
這話被獵人聽到了,獵人想:獵狗說的對啊,那我要想得到更多的獵物,得想個好法子。于是,獵人又買來幾條獵狗,凡是能夠在打獵中捉到兔子的,就可以得到幾根骨頭,捉不到的就沒有飯吃.這一招果然有用,獵狗們紛紛去努力追兔子,因為誰都不愿意看著別人有骨頭吃,自已沒的吃.就這樣過了一段時間,問題又出現(xiàn)了。大兔子非常難捉到,小兔子好捉.但捉到大兔子得到的獎賞和捉到小兔子得到的骨頭差不多,獵狗們善于觀察,發(fā)現(xiàn)了這個竅門,專門去捉小兔子。慢慢的, 大家都發(fā)現(xiàn)了這個竅門。獵人對獵狗說:最近你們捉的兔子越來越小了,為什么?獵狗們說:反正沒有什么大的區(qū)別,為什么費那么大的勁去捉那些大的呢?
動力
獵人經(jīng)過思考后,決定不將分得骨頭的數(shù)量與是否捉到兔子掛鉤,而是采用每過一段時間,就統(tǒng)計一次獵狗捉到兔子的總重量.按照重量來評價獵狗,決定一段時間內(nèi)的待遇。于是獵狗們捉到兔子的數(shù)量和重量都增加了。獵人很開心。但是過了一段時間,獵人發(fā)現(xiàn),獵狗們捉兔子的數(shù)量又少了,而且越有經(jīng)驗的獵狗,捉兔子的數(shù)量下降的就越利害.于是獵人又去問獵狗。獵狗說"我們把最好的時間都奉獻給了您,主人,但是我們隨著時間的推移會老,當我們捉不到兔子的時候,您還會給我們骨頭吃嗎?"
長期的骨頭
獵人做了論功行賞的決定。分析與匯總了所有獵狗捉到兔子的數(shù)量與重量,規(guī)定如果捉到的兔子超過了一定的數(shù)量后,即使捉不到兔子,每頓飯也可以得到一定數(shù)量的骨頭. 獵狗們都很高興,大家都努力去達到獵人規(guī)定的數(shù)量。一段時間過后,終于有一些獵狗達到了獵人規(guī)定的數(shù)量.這時,其中有一只獵狗說:我們這么努力,只得到幾根骨頭,而我們捉的獵物遠遠超過了這幾根骨頭.我們?yōu)槭裁床荒芙o自己捉兔子呢?"于是,有些獵狗離開了獵人,自己捉兔子去了。
骨頭與肉兼而有之
獵人意識到獵狗正在流失,并且那些流失的獵狗像野狗一般和自己的獵狗搶兔子。情況變得越來越糟,獵人不得已引誘了一條野狗,問他到底野狗比獵狗強在那里。野狗說:“獵狗吃的是骨頭,吐出來的是肉啊!”,接著又道:“也不是所有的野狗都頓頓有肉吃,大部分最后骨頭都沒的舔!不然也不至于被你誘惑。” 于是獵人進行了改革,使得每條獵狗除基本骨頭外,可獲得其所獵兔肉總量的n,而且隨著服務時間加長,貢獻變大,該比例還可遞增,并有權分享獵人總兔肉的m。就這樣,獵狗們與獵人一起努力,將野狗們逼得叫苦連天,紛紛強烈要求重歸獵狗隊伍。
故事還在繼續(xù)
只有永遠的利益,沒有永遠的朋友
日子一天一天地過去,冬天到了,兔子越來越少,獵人們的收成也一天不如一天。而那些服務時間長的老獵狗們老得不能捉到兔子,但仍然在無憂無慮地享受著那些他們自以為是應得的大份食物。終于有一天獵人再也不能忍受,把他們掃地出門,因為獵人更需要身強力壯的獵狗。。。。。
成立公司
被掃地出門的老獵狗們得了一筆不菲的賠償金,于是他們成立了MicroBone公司。他們采用連鎖加盟的方式招募野狗,向野狗們傳授獵兔的技巧,他們從獵得的兔子中抽取一部分作為管理費。當賠償金幾乎全部用于廣告后,他們終于有了足夠多的野狗加盟。公司開始贏利。一年后,他們收購了獵人的家當...
發(fā)展公司
MicroBone公司許諾給加盟的野狗能得到公司n的股份。這實在是太有誘惑力了。這些自認為是懷才不遇的野狗們都以為找到了知音:終于做公司的主人了,不用再忍受獵人們呼來喚去的不快,不用再為捉到足夠多的兔子而累死累活,也不用眼巴巴地乞求獵人多給兩跟骨頭而扮得楚楚可憐。這一切對這些野狗來說,這比多吃兩根骨頭更加受用。于是野狗們拖家?guī)Э诘丶尤肓薓icroBone,一些在獵人門下的年輕獵口也開始蠢蠢欲動,甚至很多自以為聰明實際愚蠢的獵人也想加入。好多同類型的公司象雨后春筍般地成立了,BoneEase, Bone.com, ChinaBone....一時間,森林里熱鬧起來。
F4 的誕生
獵人憑借出售公司的錢走上了老獵狗走過的路,最后千辛萬苦要與MicroBone公司談判的時候,老獵狗出人意料的順利答應了獵人,把 MicroBone公司賣給了獵人。老獵狗們從此不再經(jīng)營公司,轉而開始寫自轉《老獵狗的一生》,又寫:《如何成為出色的獵狗》,《如何從一只普通獵狗成為一只管理層的獵狗》《獵狗成功秘訣》《成功獵狗500條》《窮獵狗,富獵狗》,并且將老獵狗的故事搬上屏幕,取名《獵狗花園》,四只老獵狗成為了家喻戶曉的明星F4. 收版權費,沒有風險,利潤更高。
總結:干活的總是拿得少的,拿得多的都是不干活的。
Starvation and Deadlock are the two kinds of the process status. If a process stays as starvation or deadlock, that means it is waiting?for getting the needed share resource which has been holding by other processes. When the resources are released , the process status is going to be changed from starvation to run, but for deadlock, it has no chance to get the share resource the process needs because another process which has been holding the share resource needed by the first process, but the second process is staying there to wait for the first process to release the another share resource needed by itself, that is to say, they are waiting for each other's releasing the share resource they need. Deadlock is a innormal status which should be as much avoided as possible by the system designer.
I do think they are the two status of one's life, try to avoid deadlock, starvation is allowed, but do not only wait there to unacitvely get the released resource, go around to look for what you needs, on the way, the important thing is?to learn how to ?abandon the resource you've got. The new resource you really needed may get the chance to?be?in touch?only after the abandonment. Sometimes, it needs a long and boring time to get or understand what is the really love in your heart,?however worthy it is. Remember, don't give up your belief, the root of your prospect.
1. 修改源并更新升級Ubuntu:參見 http://wiki.ubuntu.org.cn/%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/EdgyEft
?? 注意:基本上可以按照該網(wǎng)頁上的配置來實現(xiàn),只是Lumaqq就不用裝了
2. 以下軟件安裝可以先通過ubuntu自帶的工具:應用程序 -> 添加/刪除...來搜索關鍵字來查看是否存在
3. qq軟件:eva?? ?? msn:使用gaim中自帶的就可以了
4. 音樂:audacious or beep-media-player
5. 視頻:參見 http://wiki.ubuntu.org.cn/EdgyGuide#head-a12a543ea800098877d88c7a8e2813dfb5253a55
?? 1) totem-xine: sudo apt-get install totem-xine w32codecs libxine-extracodecs
???????注意:totem-xine在打開url時,需要在 打開位置 后,右擊鼠標將選擇的 X輸入法 改成 默認,否則,點擊打開位置后?,totem-xine將會停止相應。
?? 2) vlc
?? 3) Mplayer
?? 4) realplayer
6. ftp client: KFTPgrabber or filezilla
?? 對于KFTPGrabber可以采用apt-get直接安裝,安裝后在 Setting -> Configure KFTPGrabber... -> 常規(guī) -> Bookmarks 中的編碼選擇gb2312,然后在Bookmarks -> 編輯書簽 中每一站點Advanced中的服務器編碼中選擇gb2312
?? 對于filezilla:
在 Windows 上有個好用的 FTP client -- Filezilla,它就可以設定遠端 FTP Server 的編碼,而現(xiàn)在 Filezilla 也有 Linux 版本了,可以到它官方網(wǎng)站下載(http://filezilla-project.org/nightly.php),解開後(用 tar -jxvf)會有一個 filezilla3 的目錄,裡面分別有 bin, share 的目錄,你可以按照下面步驟來安裝:
?? 1) 把 filezilla3/bin/ 目錄下的檔案放在 /usr/local/bin 下(sudo mv filezilla3/bin/* /usr/local/bin/)。
?? 2) 把 filezilla3/share/ 目錄下的檔案放在 /usr/local/share/filezilla 目錄下(sudo mv filezilla3/share/filezilla /usr/local/share/)。
?? 3) 然後在 /usr/share/applications 下新增一個 filezilla.desktop 的檔案,內(nèi)容如下:
????????? [Desktop Entry]
????????? Encoding=UTF-8
????????? Name=Filezilla 3
????????? Comment=Filezilla FTP Client
????????? Exec=filezilla
????????? Icon=/usr/local/share/filezilla/resources/filezilla.png
????????? Terminal=false
????????? Type=Application
????????? Categories=Application;Network;
? 這樣就可以在選單下啟動 Filezilla 了。
? 而設定遠端伺服器編碼的地方,必須要在站臺管理員裡設定才行,在站點管理 -> 字符集 -> 使用自定義字符集 中選擇gb2312
7. Qterm: 直接apt-get
8. chm 和 pdf瀏覽器采用添加/刪除工具來實現(xiàn)
9. ubuntu默認沒有裝ssh服務,直接apt-get ssh就可以了
10. 更多參考
http://hi.baidu.com/wmywind/blog/item/16cb6c6089a251de8cb10d62.html
這次全國校園招聘,走了很多著名高校,比較下來,我們的面試官普遍認為科大學生相
對技術好能力強,這很讓我感到振奮和自豪。大家臨近畢業(yè)了,也基本都已有了自己的
選擇了,但不管來群碩還是去任何一家公司,希望能就我這五年來所看到的有普遍性的
問題給大家一些建議,
1.?善于發(fā)現(xiàn)企業(yè)好的一面。人總有個特點,就是總是盯著問題不放,而習慣甚至忽略好
的一面。很多剛畢業(yè)的學生總是遇到問題就放棄,比如,領導不欣賞重視自己,辭職;
同事人際關系復雜或不夠合群,辭職;工資待遇不夠理想,辭職;企業(yè)暫時經(jīng)歷挫折,
辭職;做的事情不夠感興趣,辭職;當前項目枯燥乏味,辭職;工作辛苦個人時間少,
辭職;…很多畢業(yè)生總要經(jīng)歷若干次辭職之后,心態(tài)才能漸漸放平,但這時已經(jīng)走過很多
彎路。尤其是研究生博士生們,還沒換兩個環(huán)境,已經(jīng)三十多了,這時往往不得不接受
無奈的現(xiàn)實,但因為年齡的緣故在職場上的競爭力已經(jīng)很有限。畢竟,學校背景只在你
畢業(yè)的前兩年起作用。安心一些,耐心一些,樂觀一些,想想對自己最重要的是什么,
沒有十全十美的環(huán)境,一般這個環(huán)境只要能保證自己最重視的兩樣東西,就足夠好了。
抱著一飛沖天的決心,但腳踏實地地努力,才是成功的關鍵。
2.?不要一味追逐新技術新環(huán)境新項目,輕易轉換技術方向。任何真功夫都是要靠無數(shù)遍
反反復復的實踐練出來的,你剛學一樣東西的時候覺得很新鮮覺得提高很大,漸漸的你
看不到自己有明顯提高,但如果你還能耐住性子不斷地思考總結實踐學習,這才是你真
正突破的時候。做第一遍到第十遍之間,你能感覺自己的飛速提高,做第一百遍和第一
百一十遍之間,也許你都看不到明顯提高,但要成為真正的高手,最少需要做一千遍以上。
3.?多學以致用,再用實踐指導學習。不要不讀書,也不求多讀書,每個領域讀公認最好
的2,3本書,在實踐中反復回顧把它們徹底吃透,就很好了。很多人工作后一開始讀很多
書,工作了兩年就不讀書了,這樣都不好,讀太多不能消化,不讀不能借鑒別人的知識
經(jīng)驗,提高會慢。
4.?不要輕易為環(huán)境所左右。大學畢業(yè)生大概有10%的人是不管在什么環(huán)境都偷懶懈怠,
有10%不管在什么環(huán)境都很努力,還有80%是隨大流,環(huán)境松懈自己也松懈,環(huán)境努力自
己也努力。但是要有所成就,或者你是那10%的人,或者你要逼著自己去一個奮斗的環(huán)
境。此外,在大多數(shù)環(huán)境下,你越努力,聽到的閑言碎語越多,受到的阻力和面對的不
公平越多,畢竟木秀于林,風必摧之。不要太過于看著別人怎么說怎么做,堅定執(zhí)著地
去走自己的路,千萬不要為風言風語所干擾。記住,大多數(shù)人所說的,不一定是對的,
不一定是最適合你的。
5.?不要過于計較短期利益,著眼長遠。一般來講人總有得失心,容易為某些短期的不公
平或者利益損失而忿忿不平。但真正能占“大便宜”的人,往往都是肯一次次吃小虧的
人。不要為短期的情緒而阻礙自己前進的腳步。舉個例子,你很努力在項目中取得了不
錯的成績,可是領導卻給另外一個表現(xiàn)明顯不如你的人升職加薪,或者加薪比你多(在
這個社會你們不得不習慣這個現(xiàn)象),于是你就覺得很不公平很郁悶,于是停止努力不
再奮斗(或者換環(huán)境,但是換了環(huán)境,你就一定能改變這個了嗎?何況,還要從零開始
重新證明自己。一次次換換環(huán)境,也會使你失去競爭力。),這時,長遠吃虧的究竟是
誰呢?
6.?不要太急于追求安逸。人生走過的路總是前若干年先快速上升,然后進入穩(wěn)定。你在
最前面幾年能走到多高,直接決定你以后的位置。誰都想安逸,但太急于追求安逸,一
生反倒很難真正得到安逸。剛畢業(yè)的幾年,也是學東西最快的幾年,也是塑造你一生的
職業(yè)習慣的幾年,要絕對珍惜。
7.?急于創(chuàng)業(yè)。初生牛犢不怕虎,很多畢業(yè)生工作不久就充滿熱情去創(chuàng)業(yè)。不是沒有成功
的,但實在是太少太少,少到幾乎可以忽略不計。創(chuàng)業(yè)有很多不同的玩法,比如接單子
做項目,比如爭取融資,爭取被收購合并,或者爭取上市。但你有沒有想過,這一單做
完,你如何取得下一單?單子做完了,你如何確保按時收到款而不是白條?你如何確保
項目不會因需求變更而嚴重延期(這是項目的天性)導致你耗盡所有流動資金(客戶通
常不回提前付款)從而公司倒閉?你如何減少在項目和項目之間,閑置不創(chuàng)造效益的人
手不斷消耗你的資本?… 風險根本舉不勝舉,但我還是看到一批又一批的同學,同事們
飛蛾撲火般去創(chuàng)業(yè)。記住,市場商機,渠道,管理,和有效的財務及收款機制和過硬的
“關系”,都是關鍵,技術反而相對次要。
8.?積累人脈。在前期取得成績,主要依靠你的能力。而將來你走得很高的時候,往往不
取決于你的能力,而在于你的人脈。大家容易忙碌于自己的工作而忽略人脈的積累,如
果你將來希望能取得大的成績,就早一點開始積累。人最愿意幫助的人,是幫助過自己
的人,和在平時始終記得自己的人,而不是在需要幫助時才出現(xiàn)的人。多一些善意,多
一些熱情,多交一些朋友,少一些清高。
希望這對大家有些幫助。
對于TCP套接字,在服務器端通常采用下面的語句來實現(xiàn):
????ServerSocket welcomeSocket = new ServerSocket(6789);??(1)
????Socket connectionSocket?= welcomeSocket.accept();?????(2)
第(1)句創(chuàng)建了一個能監(jiān)聽某些客戶機“敲門”聲的門,welcomeSocket在6789端口上監(jiān)聽;當某些客戶機與welcomeSocket連接時,第(2)句創(chuàng)建了一個新的套接字,稱為connectionSocket,這個套接字也使用6789端口,這時,兩個套接字使用了相同的端口號,因為TCP連接套接字由一個四元組(源IP地址,源端口號,目的IP地址,目的端口號)來標識,UDP套接字(面向無連接的)由一個包含目的IP地址和目的端口號組成的二元組來標識。之后,TCP在客戶端的clientSocket和服務器端的connectionSocket之間建立了一條直接的虛禮管道,該客戶機與服務器可以通過該管道彼此發(fā)送字節(jié),并且發(fā)送的所有字節(jié)將按順序到達對方。隨著connectionSocket的建立,該服務器能繼續(xù)使用welcomeSocket監(jiān)聽其它客戶機的連接請求。
?
一位教授把16張撲克牌放在桌上,如下;?
黑桃?:A、7、Q?????
梅花:?3.4.7.9.J.Q?????
紅心:?2.3.5.Q.K?????
方塊:?A.5??????????
教授從中選出一張,把這張牌的數(shù)告訴了他的學生"甲”
把花色告訴了"乙”
然后教授問"甲”說"你知道是哪一張牌嗎?????????????
"甲”我不能確定是哪張牌????????????
"乙”我知道你會這樣說????????????
"甲”現(xiàn)在我知道了????????????
"乙”現(xiàn)在我也知道了
教授高興的點點頭.甲乙二人都是很有強的邏輯推理能力的人,并且都說了實話.?????????
根據(jù)以上信息,通過你的推理告訴我這張牌
Override:
(覆蓋)
1
、
Override
發(fā)生在繼承中,使得一個子類
Override
其父類的一個
method
。
2
、
Override Rules
:
Keeping the contract
。子類
override
父類的
method
時,必須要保證
overriding method
和父類中的
overridden method
具有相同的對外協(xié)議
contract
,即相同的參數(shù)列表和兼容的返回類型。
3
、
Arguments must be the same, and return types must be compatible.
4
、
The method can't be less accessible.
考慮如下情況:如果訪問權限變小了,如由父類
Parent
中的
public void test()
變成子類
Son
中的
private void test()
,如果編譯器允許權限變小,在某一類中有如下語句:
Parent?p = new Son()
;
p.test()
;則這些語句能夠通過編譯,當該類加載運行時,將會出現(xiàn)錯誤,因為父類
reference p
指向的是一子類
Son
的對象,而
Son
中的
test()
是
private
,不能在其他類中
invoke
。
??????
另外,上面的語句在編譯器允許權限變小情況下之所以能夠通過編譯,是因為在
“Parent?p = new Son()
;
”
中,聲明了一個父類
Parent
的
reference p
,由于
p
是父類的
reference
,由于父類中的
test()
是
public
,故
“p.test()
;
”
能夠通過編譯;而在運行時,
p
指向的是一個子類的對象,
p.test()
在運行時調(diào)用的是子類對象中的
test()
。
Overload
:(重載)
1
、重載:兩個或多個
methods
具有相同的
name
,
和
不同的
argument lists
。
2
、
The return types can be different.
3
、
You can't change ONLY the return type
:不能僅僅改變返回類型,
To overload a method, you MUST change the argument list, although you can change the return type to anything.
4
、
You can vary the access levels in any direction.
1.
首先
String
不屬于
8
種基本數(shù)據(jù)類型,
String
是一個對象。
因為對象的默認值是
null
,所以
String
的默認值也是
null
;但它又是一種特殊的對象,有其它對象沒有的一些特性。
2. new String()
和
new String(“”)
都是申明一個新的空字符串,是空串不是
null
;
3. String str=”kvill”
;
String str=new String (“kvill”);
的區(qū)別:在這里,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。
常量池
(constant pool)
指的是在編譯期被確定,并被保存在已編譯的
.class
文件中的一些數(shù)據(jù)。它包括了關于類、方法、接口等中的常量,也包括字符串常量。
看例
1
:
String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
結果為:
true
true
首先,我們要知結果為道
Java
會確保一個字符串常量只有一個拷貝
。
因為例子中的
s0
和
s1
中的
”kvill”
都是字符串常量,它們在編譯期就被確定了,所以
s0==s1
為
true
;而
”kv”
和
”ill”
也都是字符串常量,當一個字符串由多個字符串常量連接而成時,它自己肯定也是字符串常量,所以
s2
也同樣在編譯期就被解析為一個字符串常量,所以
s2
也是常量池中
”kvill”
的一個引用。
所以我們得出
s0==s1==s2;
用
new String()
創(chuàng)建的字符串不是常量,不能在編譯期就確定,所以
new String()
創(chuàng)建的字符串不放入常量池中,它們有自己的地址空間。
看例
2
:
String s0=”kvill”;
String s1=new String(”kvill”);
String s2=”kv” + new String(“ill”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
結果為:
false
false
false
例
2
中
s0
還是常量池中
”kvill”
的應用,
s1
因為無法在編譯期確定,所以是運行時創(chuàng)建的新對象
”kvill”
的引用,
s2
因為有后半部分
new String(“ill”)
所以也無法在編譯期確定,所以也是一個新創(chuàng)建對象
”kvill”
的應用
;
明白了這些也就知道為何得出此結果了。
4. String.intern()
:
再補充介紹一點:存在于
.class
文件中的常量池,在運行期被
JVM
裝載,并且可以擴充。
String
的
intern()
方法就是擴充常量池的一個方法;當一個
String
實例
str
調(diào)用
intern()
方法時,
Java
查找常量池中是否有相同
Unicode
的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個
Unicode
等于
str
的字符串并返回它的引用;看例
3
就清楚了
例
3
:
String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //
把常量池中
“kvill”
的引用賦給
s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
結果為:
false
**********
false //
雖然執(zhí)行了
s1.intern(),
但它的返回值沒有賦給
s1
true //
說明
s1.intern()
返回的是常量池中
”kvill”
的引用
true
最后我再破除一個錯誤的理解:有人說,
“
使用
String.intern()
方法則可以將一個
String
類的保存到一個全局
String
表中,如果具有相同值的
Unicode
字符串已經(jīng)在這個表中,那么該方法返回表中已有字符串的地址,如果在表中沒有相同值的字符串,則將自己的地址注冊到表中
“
如果我把他說的這個全局的
String
表理解為常量池的話,他的最后一句話,
“
如果在表中沒有相同值的字符串,則將自己的地址注冊到表中
”
是錯的:
看例
4
:
String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
結果:
false
kvill kvill
true
在這個類中我們沒有聲名一個
”kvill”
常量,所以常量池中一開始是沒有
”kvill”
的,當我們調(diào)用
s1.intern()
后就在常量池中新添加了一個
”kvill”
常量,原來的不在常量池中的
”kvill”
仍然存在,也就不是
“
將自己的地址注冊到常量池中
”
了。
s1==s1.intern()
為
false
說明原來的
“kvill”
仍然存在;
s2
現(xiàn)在為常量池中
“kvill”
的地址,所以有
s2==s1.intern()
為
true
。
5.
關于
equals()
和
==
這個對于
String
簡單來說就是比較兩字符串的
Unicode
序列是否相當,如果相等返回
true;
而
==
是比較兩字符串的地址是否相同,也就是是否是同一個字符串的引用。
6.
關于
String
是不可變的
這一說又要說很多,大家只要知道
String
的實例一旦生成就不會再改變了,比如說:
String str=”kv”+”ill”+” “+”ans”;
就是有
4
個字符串常量,首先
”kv”
和
”ill”
生成了
”kvill”
存在內(nèi)存中,然后
”kvill”
又和
” “
生成
”kvill “
存在內(nèi)存中,最后又和生成了
”kvill ans”;
并把這個字符串的地址賦給了
str,
就是因為
String
的
“
不可變
”
產(chǎn)生了很多臨時變量,這也就是為什么建議用
StringBuffer
的原因了,因為
StringBuffer
是可改變的。