#
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 出现错误
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网站. 每周都有新文章
http://java.sun.com
官方的Java开发者网站 - 每周都有新文章发表
http://www.developer.com/java
由Gamelan.com 维护的Java技术文章网站
http://www.java.net
Sun公司维护的一个Java社区网站
http://www.ibm.com/developerworks/java
IBM的Developerworks技术网站; 这是其中的Java技术主页
http://www.javaworld.com
最早的一个Java站点. 每周更新Java技术文章
http://www.javadesktop.org
位于Java.net的一个Java桌面技术社区网站.
http://www.theserverside.com
这是一个讨论所有Java服务器端技术的网站.
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
互联网上最活跃的一个Java Blog网站.
http://www.java2s.com
Java Codes
一条猎狗将兔子赶出了窝,一直追赶他,追了很久仍没有捉到。牧羊看到此种情景,讥笑猎狗说"你们两个之间小的反而跑得快得多。" 猎狗回答说:"你不知道我们两个的跑是完全不同的!我仅仅为了一顿饭而跑,他却是为了性命而跑呀!"
目标
这话被猎人听到了,猎人想:猎狗说的对啊,那我要想得到更多的猎物,得想个好法子。于是,猎人又买来几条猎狗,凡是能够在打猎中捉到兔子的,就可以得到几根骨头,捉不到的就没有饭吃.这一招果然有用,猎狗们纷纷去努力追兔子,因为谁都不愿意看着别人有骨头吃,自已没的吃.就这样过了一段时间,问题又出现了。大兔子非常难捉到,小兔子好捉.但捉到大兔子得到的奖赏和捉到小兔子得到的骨头差不多,猎狗们善于观察,发现了这个窍门,专门去捉小兔子。慢慢的, 大家都发现了这个窍门。猎人对猎狗说:最近你们捉的兔子越来越小了,为什么?猎狗们说:反正没有什么大的区别,为什么费那么大的劲去捉那些大的呢?
动力
猎人经过思考后,决定不将分得骨头的数量与是否捉到兔子挂钩,而是采用每过一段时间,就统计一次猎狗捉到兔子的总重量.按照重量来评价猎狗,决定一段时间内的待遇。于是猎狗们捉到兔子的数量和重量都增加了。猎人很开心。但是过了一段时间,猎人发现,猎狗们捉兔子的数量又少了,而且越有经验的猎狗,捉兔子的数量下降的就越利害.于是猎人又去问猎狗。猎狗说"我们把最好的时间都奉献给了您,主人,但是我们随着时间的推移会老,当我们捉不到兔子的时候,您还会给我们骨头吃吗?"
长期的骨头
猎人做了论功行赏的决定。分析与汇总了所有猎狗捉到兔子的数量与重量,规定如果捉到的兔子超过了一定的数量后,即使捉不到兔子,每顿饭也可以得到一定数量的骨头. 猎狗们都很高兴,大家都努力去达到猎人规定的数量。一段时间过后,终于有一些猎狗达到了猎人规定的数量.这时,其中有一只猎狗说:我们这么努力,只得到几根骨头,而我们捉的猎物远远超过了这几根骨头.我们为什么不能给自己捉兔子呢?"于是,有些猎狗离开了猎人,自己捉兔子去了。
骨头与肉兼而有之
猎人意识到猎狗正在流失,并且那些流失的猎狗像野狗一般和自己的猎狗抢兔子。情况变得越来越糟,猎人不得已引诱了一条野狗,问他到底野狗比猎狗强在那里。野狗说:“猎狗吃的是骨头,吐出来的是肉啊!”,接着又道:“也不是所有的野狗都顿顿有肉吃,大部分最后骨头都没的舔!不然也不至于被你诱惑。” 于是猎人进行了改革,使得每条猎狗除基本骨头外,可获得其所猎兔肉总量的n,而且随着服务时间加长,贡献变大,该比例还可递增,并有权分享猎人总兔肉的m。就这样,猎狗们与猎人一起努力,将野狗们逼得叫苦连天,纷纷强烈要求重归猎狗队伍。
故事还在继续
只有永远的利益,没有永远的朋友
日子一天一天地过去,冬天到了,兔子越来越少,猎人们的收成也一天不如一天。而那些服务时间长的老猎狗们老得不能捉到兔子,但仍然在无忧无虑地享受着那些他们自以为是应得的大份食物。终于有一天猎人再也不能忍受,把他们扫地出门,因为猎人更需要身强力壮的猎狗。。。。。
成立公司
被扫地出门的老猎狗们得了一笔不菲的赔偿金,于是他们成立了MicroBone公司。他们采用连锁加盟的方式招募野狗,向野狗们传授猎兔的技巧,他们从猎得的兔子中抽取一部分作为管理费。当赔偿金几乎全部用于广告后,他们终于有了足够多的野狗加盟。公司开始赢利。一年后,他们收购了猎人的家当...
发展公司
MicroBone公司许诺给加盟的野狗能得到公司n的股份。这实在是太有诱惑力了。这些自认为是怀才不遇的野狗们都以为找到了知音:终于做公司的主人了,不用再忍受猎人们呼来唤去的不快,不用再为捉到足够多的兔子而累死累活,也不用眼巴巴地乞求猎人多给两跟骨头而扮得楚楚可怜。这一切对这些野狗来说,这比多吃两根骨头更加受用。于是野狗们拖家带口地加入了MicroBone,一些在猎人门下的年轻猎口也开始蠢蠢欲动,甚至很多自以为聪明实际愚蠢的猎人也想加入。好多同类型的公司象雨后春笋般地成立了,BoneEase, Bone.com, ChinaBone....一时间,森林里热闹起来。
F4 的诞生
猎人凭借出售公司的钱走上了老猎狗走过的路,最后千辛万苦要与MicroBone公司谈判的时候,老猎狗出人意料的顺利答应了猎人,把 MicroBone公司卖给了猎人。老猎狗们从此不再经营公司,转而开始写自转《老猎狗的一生》,又写:《如何成为出色的猎狗》,《如何从一只普通猎狗成为一只管理层的猎狗》《猎狗成功秘诀》《成功猎狗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
注意:基本上可以按照该网页上的配置来实现,只是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... -> 常规 -> Bookmarks 中的编码选择gb2312,然后在Bookmarks -> 编辑书签 中每一站点Advanced中的服务器编码中选择gb2312
对于filezilla:
在 Windows 上有個好用的 FTP client -- Filezilla,它就可以設定遠端 FTP Server 的編碼,而現在 Filezilla 也有 Linux 版本了,可以到它官方網站下載(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 的檔案,內容如下:
[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浏览器采用添加/删除工具来实现
9. ubuntu默认没有装ssh服务,直接apt-get ssh就可以了
10. 更多参考
http://hi.baidu.com/wmywind/blog/item/16cb6c6089a251de8cb10d62.html
这次全国校园招聘,走了很多著名高校,比较下来,我们的面试官普遍认为科大学生相
对技术好能力强,这很让我感到振奋和自豪。大家临近毕业了,也基本都已有了自己的
选择了,但不管来群硕还是去任何一家公司,希望能就我这五年来所看到的有普遍性的
问题给大家一些建议,
1. 善于发现企业好的一面。人总有个特点,就是总是盯着问题不放,而习惯甚至忽略好
的一面。很多刚毕业的学生总是遇到问题就放弃,比如,领导不欣赏重视自己,辞职;
同事人际关系复杂或不够合群,辞职;工资待遇不够理想,辞职;企业暂时经历挫折,
辞职;做的事情不够感兴趣,辞职;当前项目枯燥乏味,辞职;工作辛苦个人时间少,
辞职;…很多毕业生总要经历若干次辞职之后,心态才能渐渐放平,但这时已经走过很多
弯路。尤其是研究生博士生们,还没换两个环境,已经三十多了,这时往往不得不接受
无奈的现实,但因为年龄的缘故在职场上的竞争力已经很有限。毕竟,学校背景只在你
毕业的前两年起作用。安心一些,耐心一些,乐观一些,想想对自己最重要的是什么,
没有十全十美的环境,一般这个环境只要能保证自己最重视的两样东西,就足够好了。
抱着一飞冲天的决心,但脚踏实地地努力,才是成功的关键。
2. 不要一味追逐新技术新环境新项目,轻易转换技术方向。任何真功夫都是要靠无数遍
反反复复的实践练出来的,你刚学一样东西的时候觉得很新鲜觉得提高很大,渐渐的你
看不到自己有明显提高,但如果你还能耐住性子不断地思考总结实践学习,这才是你真
正突破的时候。做第一遍到第十遍之间,你能感觉自己的飞速提高,做第一百遍和第一
百一十遍之间,也许你都看不到明显提高,但要成为真正的高手,最少需要做一千遍以上。
3. 多学以致用,再用实践指导学习。不要不读书,也不求多读书,每个领域读公认最好
的2,3本书,在实践中反复回顾把它们彻底吃透,就很好了。很多人工作后一开始读很多
书,工作了两年就不读书了,这样都不好,读太多不能消化,不读不能借鉴别人的知识
经验,提高会慢。
4. 不要轻易为环境所左右。大学毕业生大概有10%的人是不管在什么环境都偷懒懈怠,
有10%不管在什么环境都很努力,还有80%是随大流,环境松懈自己也松懈,环境努力自
己也努力。但是要有所成就,或者你是那10%的人,或者你要逼着自己去一个奋斗的环
境。此外,在大多数环境下,你越努力,听到的闲言碎语越多,受到的阻力和面对的不
公平越多,毕竟木秀于林,风必摧之。不要太过于看着别人怎么说怎么做,坚定执著地
去走自己的路,千万不要为风言风语所干扰。记住,大多数人所说的,不一定是对的,
不一定是最适合你的。
5. 不要过于计较短期利益,着眼长远。一般来讲人总有得失心,容易为某些短期的不公
平或者利益损失而忿忿不平。但真正能占“大便宜”的人,往往都是肯一次次吃小亏的
人。不要为短期的情绪而阻碍自己前进的脚步。举个例子,你很努力在项目中取得了不
错的成绩,可是领导却给另外一个表现明显不如你的人升职加薪,或者加薪比你多(在
这个社会你们不得不习惯这个现象),于是你就觉得很不公平很郁闷,于是停止努力不
再奋斗(或者换环境,但是换了环境,你就一定能改变这个了吗?何况,还要从零开始
重新证明自己。一次次换换环境,也会使你失去竞争力。),这时,长远吃亏的究竟是
谁呢?
6. 不要太急于追求安逸。人生走过的路总是前若干年先快速上升,然后进入稳定。你在
最前面几年能走到多高,直接决定你以后的位置。谁都想安逸,但太急于追求安逸,一
生反倒很难真正得到安逸。刚毕业的几年,也是学东西最快的几年,也是塑造你一生的
职业习惯的几年,要绝对珍惜。
7. 急于创业。初生牛犊不怕虎,很多毕业生工作不久就充满热情去创业。不是没有成功
的,但实在是太少太少,少到几乎可以忽略不计。创业有很多不同的玩法,比如接单子
做项目,比如争取融资,争取被收购合并,或者争取上市。但你有没有想过,这一单做
完,你如何取得下一单?单子做完了,你如何确保按时收到款而不是白条?你如何确保
项目不会因需求变更而严重延期(这是项目的天性)导致你耗尽所有流动资金(客户通
常不回提前付款)从而公司倒闭?你如何减少在项目和项目之间,闲置不创造效益的人
手不断消耗你的资本?… 风险根本举不胜举,但我还是看到一批又一批的同学,同事们
飞蛾扑火般去创业。记住,市场商机,渠道,管理,和有效的财务及收款机制和过硬的
“关系”,都是关键,技术反而相对次要。
8. 积累人脉。在前期取得成绩,主要依靠你的能力。而将来你走得很高的时候,往往不
取决于你的能力,而在于你的人脉。大家容易忙碌于自己的工作而忽略人脉的积累,如
果你将来希望能取得大的成绩,就早一点开始积累。人最愿意帮助的人,是帮助过自己
的人,和在平时始终记得自己的人,而不是在需要帮助时才出现的人。多一些善意,多
一些热情,多交一些朋友,少一些清高。
希望这对大家有些帮助。
对于TCP套接字,在服务器端通常采用下面的语句来实现:
ServerSocket welcomeSocket = new ServerSocket(6789); (1)
Socket connectionSocket = welcomeSocket.accept(); (2)
第(1)句创建了一个能监听某些客户机“敲门”声的门,welcomeSocket在6789端口上监听;当某些客户机与welcomeSocket连接时,第(2)句创建了一个新的套接字,称为connectionSocket,这个套接字也使用6789端口,这时,两个套接字使用了相同的端口号,因为TCP连接套接字由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识,UDP套接字(面向无连接的)由一个包含目的IP地址和目的端口号组成的二元组来标识。之后,TCP在客户端的clientSocket和服务器端的connectionSocket之间建立了一条直接的虚礼管道,该客户机与服务器可以通过该管道彼此发送字节,并且发送的所有字节将按顺序到达对方。随着connectionSocket的建立,该服务器能继续使用welcomeSocket监听其它客户机的连接请求。
一位教授把16张扑克牌放在桌上,如下;
黑桃 :A、7、Q
梅花: 3.4.7.9.J.Q
红心: 2.3.5.Q.K
方块: A.5
教授从中选出一张,把这张牌的数告诉了他的学生"甲”
把花色告诉了"乙”
然后教授问"甲”说"你知道是哪一张牌吗?
"甲”我不能确定是哪张牌
"乙”我知道你会这样说
"甲”现在我知道了
"乙”现在我也知道了
教授高兴的点点头.甲乙二人都是很有强的逻辑推理能力的人,并且都说了实话.
根据以上信息,通过你的推理告诉我这张牌
Override:
(覆盖)
1
、
Override
发生在继承中,使得一个子类
Override
其父类的一个
method
。
2
、
Override Rules
:
Keeping the contract
。子类
override
父类的
method
时,必须要保证
overriding method
和父类中的
overridden method
具有相同的对外协议
contract
,即相同的参数列表和兼容的返回类型。
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()
;则这些语句能够通过编译,当该类加载运行时,将会出现错误,因为父类
reference p
指向的是一子类
Son
的对象,而
Son
中的
test()
是
private
,不能在其他类中
invoke
。
另外,上面的语句在编译器允许权限变小情况下之所以能够通过编译,是因为在
“Parent p = new Son()
;
”
中,声明了一个父类
Parent
的
reference p
,由于
p
是父类的
reference
,由于父类中的
test()
是
public
,故
“p.test()
;
”
能够通过编译;而在运行时,
p
指向的是一个子类的对象,
p.test()
在运行时调用的是子类对象中的
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
种基本数据类型,
String
是一个对象。
因为对象的默认值是
null
,所以
String
的默认值也是
null
;但它又是一种特殊的对象,有其它对象没有的一些特性。
2. new String()
和
new String(“”)
都是申明一个新的空字符串,是空串不是
null
;
3. String str=”kvill”
;
String str=new String (“kvill”);
的区别:在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
常量池
(constant pool)
指的是在编译期被确定,并被保存在已编译的
.class
文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
看例
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()
创建的字符串不是常量,不能在编译期就确定,所以
new String()
创建的字符串不放入常量池中,它们有自己的地址空间。
看例
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
因为无法在编译期确定,所以是运行时创建的新对象
”kvill”
的引用,
s2
因为有后半部分
new String(“ill”)
所以也无法在编译期确定,所以也是一个新创建对象
”kvill”
的应用
;
明白了这些也就知道为何得出此结果了。
4. String.intern()
:
再补充介绍一点:存在于
.class
文件中的常量池,在运行期被
JVM
装载,并且可以扩充。
String
的
intern()
方法就是扩充常量池的一个方法;当一个
String
实例
str
调用
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 //
虽然执行了
s1.intern(),
但它的返回值没有赋给
s1
true //
说明
s1.intern()
返回的是常量池中
”kvill”
的引用
true
最后我再破除一个错误的理解:有人说,
“
使用
String.intern()
方法则可以将一个
String
类的保存到一个全局
String
表中,如果具有相同值的
Unicode
字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中
“
如果我把他说的这个全局的
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”
的,当我们调用
s1.intern()
后就在常量池中新添加了一个
”kvill”
常量,原来的不在常量池中的
”kvill”
仍然存在,也就不是
“
将自己的地址注册到常量池中
”
了。
s1==s1.intern()
为
false
说明原来的
“kvill”
仍然存在;
s2
现在为常量池中
“kvill”
的地址,所以有
s2==s1.intern()
为
true
。
5.
关于
equals()
和
==
这个对于
String
简单来说就是比较两字符串的
Unicode
序列是否相当,如果相等返回
true;
而
==
是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
6.
关于
String
是不可变的
这一说又要说很多,大家只要知道
String
的实例一旦生成就不会再改变了,比如说:
String str=”kv”+”ill”+” “+”ans”;
就是有
4
个字符串常量,首先
”kv”
和
”ill”
生成了
”kvill”
存在内存中,然后
”kvill”
又和
” “
生成
”kvill “
存在内存中,最后又和生成了
”kvill ans”;
并把这个字符串的地址赋给了
str,
就是因为
String
的
“
不可变
”
产生了很多临时变量,这也就是为什么建议用
StringBuffer
的原因了,因为
StringBuffer
是可改变的。