下載 Pietty
http://ntu.csie.org/~piaip/pietty/
===================================================
Pietty 可直接將檔案拉到視窗中,直接上傳檔案。
我另外再找 SSH FTP Client 端的軟體 WinSCP
傳檔方面 WinSCP 比 Pietty 好用太多
你的目錄在哪裡,拖曳過去就是傳到那裡
也可以輕鬆的管理檔案 ( 複製, 移動, 刪除, 更改權限... )
用起來就像 Windows 一樣
不用去背關於管理檔案的指令
WinSCP 有附簡單的文字編輯器
===================================================
WinSCP SSH
http://winscp.net/eng/docs/lang:cht
WinSCP 是在Windows中使用SSH的開放原始碼的圖形化SFTP用戶端。WinSCP同時也支援SCP通訊協定。它主要的功能是安全的在電腦間傳輸檔案。
選擇 Portable executables 也是可以用中文語言包
===================================================
https://sites.google.com/site/code10111/winscp-pietty
本壓縮檔內含WinSCP(Traditional Chinese)
且已將WinSCP的PuTTY的path指向檔案內的PieTTY
2011年3月31日 星期四
Re: [閒聊] Java的CheckStyle...
http://disp.cc/b/27-1u06
節錄部份
ptt.cc
=============================================================
作者 hegemon (hegemon) 看板 Soft_Job
Java Code都要符合CheckStyle Plugin的標準.
tab跟四個space,括號前後space,或是變數大小寫
一個method不能超過一百五十行,一個method不能代入超過七個變數.
========================================================================
<軟體建構之道>(code complete)裡面就有提到
"人腦所能掌握的物件個數大約在七個左右, 所以變數跟參數最好不要超過7"
掌握設計時真正的想法, 才能循線把整個設計實作出來
設計師把衣服的設計圖畫好, 材質選好, ......然後送給中國大陸去製造
然後成品就整個毀了...
由於製作的工人完全不能體會設計者的用心, 作出來的成品自然參差不齊.
========================================================================
根據統計, 只要一個method超過這個行數, 可能就要思考一下另行的作法了
另一方面也是為了code可讀性的關係.
所以, 當參數個數太多的時候, 你可能要考慮一下是不是要把這些參數包成一個
private的class, 然後user看class name就大概能知道這裡面的參數是什麼用途.
ex :
菜刀
覘板
牛肉
鹽
的參數可以包在一個叫做"晚餐材料"的class裡面傳遞給method.
==========================================================================
一個method 不能超過 150行, 也是為了怕沒經驗的coder把一堆有的沒的全部寫在
同一個method裡面, 造成可讀性&複用性差(而且會這樣通常是copy & paste造成的).
通常如果幾行code描述一件事, 那最好就用一個method把這件事包起來.
比如說 :
脫外褲;
脫內褲;
大便;
沖水;
穿內褲;
穿外褲;
看的人可能要一直讀到一個段落才能了解你的意思, 那乾脆就直接包成一個叫
"去上大號"的method, 清楚多了
=========================================================================
因為就你所說的情況, 很明顯是因為整個程式整體架構的問題,
現行有ORM比如引入Hibernate可以減少SQL行數的問題,
反正絕對不是幾個小coder敲敲鍵盤全手工打造 + check style
就能在一兩個月內解決的, (這是架構問題, 應該是project leader要解決的)
在沒整體修改架構前, 反而會為了要遵守這個check style而產生更多問題.
另外, 一支優秀的API, 註解比code多很多才能讓user用得很安心
這個150行的限制竟然包含註解絕對是錯的
這豈不是鼓勵大家為了就範而產生大量無註解的爛code嗎?
=========================================================================
如果不清楚原因跟相對應的OO寫作技巧
而硬是要去遵守150行限制, 會產生一大堆沒有內聚力的
classA-1
classA-2
classA-3
這是OO典型的anti-pattern阿! 它本來是想解決code難以閱讀維護的問題,
但是方法沒用對, 反而造成更大的問題. (比全部寫在同一隻code還難trace)
節錄部份
ptt.cc
=============================================================
作者 hegemon (hegemon) 看板 Soft_Job
Java Code都要符合CheckStyle Plugin的標準.
tab跟四個space,括號前後space,或是變數大小寫
一個method不能超過一百五十行,一個method不能代入超過七個變數.
========================================================================
作者: newjoy (職業格鬥家) 看板: Soft_Job
<軟體建構之道>(code complete)裡面就有提到
"人腦所能掌握的物件個數大約在七個左右, 所以變數跟參數最好不要超過7"
掌握設計時真正的想法, 才能循線把整個設計實作出來
設計師把衣服的設計圖畫好, 材質選好, ......然後送給中國大陸去製造
然後成品就整個毀了...
由於製作的工人完全不能體會設計者的用心, 作出來的成品自然參差不齊.
========================================================================
根據統計, 只要一個method超過這個行數, 可能就要思考一下另行的作法了
另一方面也是為了code可讀性的關係.
所以, 當參數個數太多的時候, 你可能要考慮一下是不是要把這些參數包成一個
private的class, 然後user看class name就大概能知道這裡面的參數是什麼用途.
ex :
菜刀
覘板
牛肉
鹽
的參數可以包在一個叫做"晚餐材料"的class裡面傳遞給method.
==========================================================================
一個method 不能超過 150行, 也是為了怕沒經驗的coder把一堆有的沒的全部寫在
同一個method裡面, 造成可讀性&複用性差(而且會這樣通常是copy & paste造成的).
通常如果幾行code描述一件事, 那最好就用一個method把這件事包起來.
比如說 :
脫外褲;
脫內褲;
大便;
沖水;
穿內褲;
穿外褲;
看的人可能要一直讀到一個段落才能了解你的意思, 那乾脆就直接包成一個叫
"去上大號"的method, 清楚多了
=========================================================================
因為就你所說的情況, 很明顯是因為整個程式整體架構的問題,
現行有ORM比如引入Hibernate可以減少SQL行數的問題,
反正絕對不是幾個小coder敲敲鍵盤全手工打造 + check style
就能在一兩個月內解決的, (這是架構問題, 應該是project leader要解決的)
在沒整體修改架構前, 反而會為了要遵守這個check style而產生更多問題.
另外, 一支優秀的API, 註解比code多很多才能讓user用得很安心
這個150行的限制竟然包含註解絕對是錯的
這豈不是鼓勵大家為了就範而產生大量無註解的爛code嗎?
=========================================================================
如果不清楚原因跟相對應的OO寫作技巧
而硬是要去遵守150行限制, 會產生一大堆沒有內聚力的
classA-1
classA-2
classA-3
這是OO典型的anti-pattern阿! 它本來是想解決code難以閱讀維護的問題,
但是方法沒用對, 反而造成更大的問題. (比全部寫在同一隻code還難trace)
標籤:
Coding Style,
PTT
程式碼排版的好工具 Artistic Style
http://jarsing.blogspot.com/2007/10/artistic-style.html
可以通吃C、C++、C#和Java
astyle -rn --style=ansi --indent=tab --indent-switches --indent-cases *.c *.h
因為Artistic Style會將舊的程式檔案備份起來,但是我覺得這樣浪費空間,所以使用參數「n」選擇不留存這些原始內容的備份檔案(這當然是有風險的,但是我選擇相信這套工具),另外參數「r」則會以遞迴的方式處理所有子目錄。換言之,這段指令會一次處理專案內的所有程式檔案,而且不會進行備份。
更多有關參數的詳細用法,可以透過執行astyle --help取得。
可以通吃C、C++、C#和Java
astyle -rn --style=ansi --indent=tab --indent-switches --indent-cases *.c *.h
因為Artistic Style會將舊的程式檔案備份起來,但是我覺得這樣浪費空間,所以使用參數「n」選擇不留存這些原始內容的備份檔案(這當然是有風險的,但是我選擇相信這套工具),另外參數「r」則會以遞迴的方式處理所有子目錄。換言之,這段指令會一次處理專案內的所有程式檔案,而且不會進行備份。
更多有關參數的詳細用法,可以透過執行astyle --help取得。
2011年3月30日 星期三
const string in class
常數字串須在類別外初始化
http://bbs.chinaunix.net/archiver/?tid-953427.html
fiowrf 发表于 2007-06-25 11:38
class Operator:public BaseStructure{
private:
OperatorType mType;
static int ar[6];
static const string OperatorSymbol[7]={"+","-","*","/","^","??"};
public:
}
结果提示错误:
Operator.hxx:13: error: invalid in-class initialization of static data member
of non-integral type `const std::string[7]'
_Erics 发表于 2007-06-25 12:53
在类外初始化
class Operator:public BaseStructure{
private:
OperatorType mType;
static int ar[6];
static const string OperatorSymbol[7];
public:
}
const string Operator:OperatorSymbol[]={"+","-","*","/","^","??"};
gooderfeng 发表于 2007-06-25 13:00
静态数据在c++中只有 static const int t = 0;
可以初始化。
其他都要在类的外面。
http://bbs.chinaunix.net/archiver/?tid-953427.html
fiowrf 发表于 2007-06-25 11:38
class Operator:public BaseStructure{
private:
OperatorType mType;
static int ar[6];
static const string OperatorSymbol[7]={"+","-","*","/","^","??"};
public:
}
结果提示错误:
Operator.hxx:13: error: invalid in-class initialization of static data member
of non-integral type `const std::string[7]'
_Erics 发表于 2007-06-25 12:53
在类外初始化
class Operator:public BaseStructure{
private:
OperatorType mType;
static int ar[6];
static const string OperatorSymbol[7];
public:
}
const string Operator:OperatorSymbol[]={"+","-","*","/","^","??"};
gooderfeng 发表于 2007-06-25 13:00
静态数据在c++中只有 static const int t = 0;
可以初始化。
其他都要在类的外面。
2011年3月29日 星期二
2011年3月27日 星期日
2011年3月19日 星期六
[新聞] 你還在捐款給中華民國紅十字嗎? 請複習新聞
作者: JupIte (調色盤) 看板: Gossiping
標題: [新聞] 你還在捐款給中華民國紅十字嗎? 請複習新聞
時間: Fri Mar 18 11:20:34 2011
TVBS 〈獨家〉離職員工爆料:紅十字會A錢
http://www.tvbs.com.tw/news/news_list.asp?no=lili20050823175717
TVBS〈短訊〉綠委:紅十字會補助 挪用薪資浮報
http://www.tvbs.com.tw/news/news_list.asp?no=sunkiss20070615101734
TVBS 綠委爆:紅十字會濫用補助款20年
http://www.tvbs.com.tw/news/news_list.asp?no=yu20070615125545
蘋果日報 紅十字會 8高幹年合領千萬薪
http://tw.nextmedia.com/applenews/article/art_id/1809137/IssueID/20050529
GOOGLE 搜尋 紅十字 921 善款 挪用
http://lmgtfy.com/?q=%E7%B4%85%E5%8D%81%E5%AD%97+921+%E5%96%84%E6%AC%BE+%E6%8C%AA%E7%94%A8
原來陳長文的中華民國紅十字總會是冒牌山寨的?
http://blog.kaishao.idv.tw/?p=2899
你跟你的親人朋友還在捐款給中華民國紅十字會??????
『 大家的愛心直接送到日本紅十字會,應該是比較能放心的途徑。』
1.
以下是透過日本gogole捐款給日本紅十字會的連結(捐款單位是日圓)
請先登入您的google帳號,便可進行捐款
http://ppt.cc/e~K1
2.
以下是透過paypal捐款,有組織可以捐款(捐款單位是美金)
http://ppt.cc/vKjZ
最右邊是日本紅十字會,可用paypal點數捐款
3.
以下是透過美國紅十字會捐款給日本(單位為美金)
http://ppt.cc/EmJt
會損失匯差,不建議台灣人使用
推文被誤刪的抱歉了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
推 kaga3:幫lae陳貼連結http://0rz.tw/Zza5Q 我腿了十幾年 要哭了QwQ 03/18 11:41
九二一善款竟然郝龍斌轉捐中國!災民不敵官僚
http://www.youtube.com/watch?v=B90Dgmy49RQ&feature=related
標題: [新聞] 你還在捐款給中華民國紅十字嗎? 請複習新聞
時間: Fri Mar 18 11:20:34 2011
TVBS 〈獨家〉離職員工爆料:紅十字會A錢
http://www.tvbs.com.tw/news/news_list.asp?no=lili20050823175717
TVBS〈短訊〉綠委:紅十字會補助 挪用薪資浮報
http://www.tvbs.com.tw/news/news_list.asp?no=sunkiss20070615101734
TVBS 綠委爆:紅十字會濫用補助款20年
http://www.tvbs.com.tw/news/news_list.asp?no=yu20070615125545
蘋果日報 紅十字會 8高幹年合領千萬薪
http://tw.nextmedia.com/applenews/article/art_id/1809137/IssueID/20050529
GOOGLE 搜尋 紅十字 921 善款 挪用
http://lmgtfy.com/?q=%E7%B4%85%E5%8D%81%E5%AD%97+921+%E5%96%84%E6%AC%BE+%E6%8C%AA%E7%94%A8
原來陳長文的中華民國紅十字總會是冒牌山寨的?
http://blog.kaishao.idv.tw/?p=2899
你跟你的親人朋友還在捐款給中華民國紅十字會??????
『 大家的愛心直接送到日本紅十字會,應該是比較能放心的途徑。』
1.
以下是透過日本gogole捐款給日本紅十字會的連結(捐款單位是日圓)
請先登入您的google帳號,便可進行捐款
http://ppt.cc/e~K1
2.
以下是透過paypal捐款,有組織可以捐款(捐款單位是美金)
http://ppt.cc/vKjZ
最右邊是日本紅十字會,可用paypal點數捐款
3.
以下是透過美國紅十字會捐款給日本(單位為美金)
http://ppt.cc/EmJt
會損失匯差,不建議台灣人使用
推文被誤刪的抱歉了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
推 kaga3:幫lae陳貼連結http://0rz.tw/Zza5Q 我腿了十幾年 要哭了QwQ 03/18 11:41
九二一善款竟然郝龍斌轉捐中國!災民不敵官僚
http://www.youtube.com/watch?v=B90Dgmy49RQ&feature=related
2011年3月12日 星期六
2011年3月11日 星期五
命名方針
Guidelines for Names
命名方針
http://msdn.microsoft.com/en-us/library/ms229002.aspx
http://msdn.microsoft.com/zh-tw/library/ms229002.aspx
命名方針
http://msdn.microsoft.com/en-us/library/ms229002.aspx
http://msdn.microsoft.com/zh-tw/library/ms229002.aspx
C 語言模組化編程指南
http://godspeedlee.myweb.hinet.net/c_guide.html
1. 使用巨集避免重複宣告或定義
2. 將全域變數的宣告集中放到 .h
3. 使用 static 分離私有與公開介面
4. 請使用易於了解的變數名稱
1. 使用巨集避免重複宣告或定義
2. 將全域變數的宣告集中放到 .h
3. 使用 static 分離私有與公開介面
4. 請使用易於了解的變數名稱
標籤:
C,
C++,
Coding Style
2011年3月10日 星期四
2011年3月7日 星期一
2011年3月6日 星期日
2011年3月5日 星期六
Makefile 教學
建議第一次學先看第一個網址
第二個較詳細
第一章 如何寫一個簡單的Makefile
http://www.cmlab.csie.ntu.edu.tw/~chenhsiu/docs/makefile-ch1.html
Makefile 語法簡介
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=185
===========================================================
個人想到一個比喻
化學式:
反應物----------->生成物
催化劑
test.c---------------->test.o
gcc -c test.c
Makefile:
生成物:反應物
<tab>催化劑
test.o:test.c
<tab>gcc -c test.c
第二個較詳細
第一章 如何寫一個簡單的Makefile
http://www.cmlab.csie.ntu.edu.tw/~chenhsiu/docs/makefile-ch1.html
Makefile 語法簡介
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=185
===========================================================
個人想到一個比喻
化學式:
反應物----------->生成物
催化劑
test.c---------------->test.o
gcc -c test.c
Makefile:
生成物:反應物
<tab>催化劑
test.o:test.c
<tab>gcc -c test.c
java String深入constant pool
聲明 來源於:http://hi.baidu.com/boywell/blog/item/a069bccbc45e7c4cf31fe758.html
Constant Pool常量池的概念:
在講到String的一些特殊情況時,總會提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是個怎麼樣的東西,運行的時候存儲在哪裡,所以在這裡先說一下Constant Pool的內容.
String Pool是對應於在Constant Pool中存儲String常量的區域.習慣稱為String Pool,也有人稱為
String Constant Pool.好像沒有正式的命名??
在java編譯好的class文件中,有個區域稱為Constant Pool,他是一個由數組組成的表,類型
為cp_info constant_pool[],用來存儲程序中使用的各種常量,包括Class/String/Integer等各
種基本Java數據類型,詳情參見The Java Virtual Machine Specification 4.4章節.
關於String類的說明
1.String使用private final char value[]來實現字符串的存儲,也就是說String對象創建之後,就不能
再修改此對象中存儲的字符串內容,就是因為如此,才說String類型是不可變的(immutable).
2.String類有一個特殊的創建方法,就是使用""雙引號來創建.例如new String("i am")實際創建了2個
String對象,一個是"i am"通過""雙引號創建的,另一個是通過new創建的.只不過他們創建的時期不同,
一個是編譯期,一個是運行期!
3.java對String類型重載了+操作符,可以直接使用+對兩個字符串進行連接.
4.運行期調用String類的intern()方法可以向String Pool中動態添加對象.
String的創建方法一般有如下幾種
1.直接使用""引號創建.
2.使用new String()創建.
3.使用new String("someString")創建以及其他的一些重載構造函數創建.
4.使用重載的字符串連接操作符+創建.
例1
/*
* "sss111"是編譯期常量,編譯時已經能確定它的值,在編譯
* 好的class文件中它已經在String Pool中了,此語句會在
* String Pool中查找等於"sss111"的字符串(用equals(Object)方法確定),
* 如果存在就把引用返回,付值給s1.不存在就會創建一個"sss111"放在
* String Pool中,然後把引用返回,付值給s1.
*
*/
String s1 = "sss111";
//此語句同上
String s2 = "sss111";
/*
* 由於String Pool只會維護一個值相同的String對象
* 上面2句得到的引用是String Pool中同一個對象,所以
* 他們引用相等
*/
System.out.println(s1 == s2); //結果為true
例2
/*
* 在java中,使用new關鍵字會創建一個新對象,在本例中,不管在
* String Pool中是否已經有值相同的對象,都會創建了一個新的
* String對象存儲在heap中,然後把引用返回賦給s1.
* 本例中使用了String的public String(String original)構造函數.
*/
String s1 = new String("sss111");
/*
* 此句會按照例1中所述在String Pool中查找
*/
String s2 = "sss111";
/*
* 由於s1是new出的新對象,存儲在heap中,s2指向的對象
* 存儲在String Pool中,他們肯定不是同一個對象,只是
* 存儲的字符串值相同,所以返回false.
*/
System.out.println(s1 == s2); //結果為false
例3
String s1 = new String("sss111");
/*
* 當調用intern方法時,如果String Pool中已經包含一個等於此String對象
* 的字符串(用 equals(Object)方法確定),則返回池中的字符串.否則,將此
* String對象添加到池中,並返回此String對象在String Pool中的引用.
*/
s1 = s1.intern();
String s2 = "sss111";
/*
* 由於執行了s1 = s1.intern(),會使s1指向String Pool中值為"sss111"
* 的字符串對象,s2也指向了同樣的對象,所以結果為true
*/
System.out.println(s1 == s2);
例4
String s1 = new String("111");
String s2 = "sss111";
/*
* 由於進行連接的2個字符串都是常量,編譯期就能確定連接後的值了,
* 編譯器會進行優化直接把他們表示成"sss111"存儲到String Pool中,
* 由於上邊的s2="sss111"已經在String Pool中加入了"sss111",
* 此句會把s3指向和s2相同的對象,所以他們引用相同.此時"sss"和"111"
* 兩個常量不會再創建.
*/
String s3 = "sss" + "111";
/*
* 由於s1是個變量,在編譯期不能確定它的值是多少,所以
* 會在執行的時候創建一個新的String對象存儲到heap中,
* 然後賦值給s4.
*/
String s4 = "sss" + s1;
System.out.println(s2 == s3); //true
System.out.println(s2 == s4); //false
System.out.println(s2 == s4.intern()); //true
例5
這個是The Java Language Specification中3.10.5節的例子,有了上面的說明,這個應該不難理解了
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " "); //lo在runtime會創建一個新的對象
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
package other;
public class Other { static String hello = "Hello"; }
輸出結果為true true true true false true,請自行分析!
結果上面分析,總結如下:
1.單獨使用""引號創建的字符串都是常量,編譯期就已經確定存儲到String Pool中.
2.使用new String("")創建的對象會存儲到heap中,是運行期新創建的.
3.使用只包含常量的字符串連接符如"aa" + "aa"創建的也是常量,編譯期就能確定,已經確定存儲到String Pool中.(編譯時會直接優化成"aaaa",如果String Pool 中沒有"aaaa",就用""號創建一個String,直接放到Pool中,比如:String t = "a"+ "b" +"c"; 會優化成"abc",然後放入Pool中;又比如String s = "x"+"y"+ref;在編譯時有部分的優化:"xy",而ref + "x" +"y"就不會有部分的優化,"+"從左到右執行,ref是變量,編譯時期無法確定)
4.使用包含變量的字符串連接符如"aa" + s1創建的對象是運行期才創建的,存儲在heap中.
(根據java api文檔中String類所講,會在內部使用stringbuffer及其append方法來實現連接,然後執行toString(),這樣就會在運行時又創建一個新對象)
還有幾個經常考的面試題:
1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面創建了幾個String對象?
答案:3個 ,編譯期Constant Pool中創建1個,運行期heap中創建2個.
發現有空還要看看基礎了.+.jvm
Constant Pool常量池的概念:
在講到String的一些特殊情況時,總會提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是個怎麼樣的東西,運行的時候存儲在哪裡,所以在這裡先說一下Constant Pool的內容.
String Pool是對應於在Constant Pool中存儲String常量的區域.習慣稱為String Pool,也有人稱為
String Constant Pool.好像沒有正式的命名??
在java編譯好的class文件中,有個區域稱為Constant Pool,他是一個由數組組成的表,類型
為cp_info constant_pool[],用來存儲程序中使用的各種常量,包括Class/String/Integer等各
種基本Java數據類型,詳情參見The Java Virtual Machine Specification 4.4章節.
關於String類的說明
1.String使用private final char value[]來實現字符串的存儲,也就是說String對象創建之後,就不能
再修改此對象中存儲的字符串內容,就是因為如此,才說String類型是不可變的(immutable).
2.String類有一個特殊的創建方法,就是使用""雙引號來創建.例如new String("i am")實際創建了2個
String對象,一個是"i am"通過""雙引號創建的,另一個是通過new創建的.只不過他們創建的時期不同,
一個是編譯期,一個是運行期!
3.java對String類型重載了+操作符,可以直接使用+對兩個字符串進行連接.
4.運行期調用String類的intern()方法可以向String Pool中動態添加對象.
String的創建方法一般有如下幾種
1.直接使用""引號創建.
2.使用new String()創建.
3.使用new String("someString")創建以及其他的一些重載構造函數創建.
4.使用重載的字符串連接操作符+創建.
例1
/*
* "sss111"是編譯期常量,編譯時已經能確定它的值,在編譯
* 好的class文件中它已經在String Pool中了,此語句會在
* String Pool中查找等於"sss111"的字符串(用equals(Object)方法確定),
* 如果存在就把引用返回,付值給s1.不存在就會創建一個"sss111"放在
* String Pool中,然後把引用返回,付值給s1.
*
*/
String s1 = "sss111";
//此語句同上
String s2 = "sss111";
/*
* 由於String Pool只會維護一個值相同的String對象
* 上面2句得到的引用是String Pool中同一個對象,所以
* 他們引用相等
*/
System.out.println(s1 == s2); //結果為true
例2
/*
* 在java中,使用new關鍵字會創建一個新對象,在本例中,不管在
* String Pool中是否已經有值相同的對象,都會創建了一個新的
* String對象存儲在heap中,然後把引用返回賦給s1.
* 本例中使用了String的public String(String original)構造函數.
*/
String s1 = new String("sss111");
/*
* 此句會按照例1中所述在String Pool中查找
*/
String s2 = "sss111";
/*
* 由於s1是new出的新對象,存儲在heap中,s2指向的對象
* 存儲在String Pool中,他們肯定不是同一個對象,只是
* 存儲的字符串值相同,所以返回false.
*/
System.out.println(s1 == s2); //結果為false
例3
String s1 = new String("sss111");
/*
* 當調用intern方法時,如果String Pool中已經包含一個等於此String對象
* 的字符串(用 equals(Object)方法確定),則返回池中的字符串.否則,將此
* String對象添加到池中,並返回此String對象在String Pool中的引用.
*/
s1 = s1.intern();
String s2 = "sss111";
/*
* 由於執行了s1 = s1.intern(),會使s1指向String Pool中值為"sss111"
* 的字符串對象,s2也指向了同樣的對象,所以結果為true
*/
System.out.println(s1 == s2);
例4
String s1 = new String("111");
String s2 = "sss111";
/*
* 由於進行連接的2個字符串都是常量,編譯期就能確定連接後的值了,
* 編譯器會進行優化直接把他們表示成"sss111"存儲到String Pool中,
* 由於上邊的s2="sss111"已經在String Pool中加入了"sss111",
* 此句會把s3指向和s2相同的對象,所以他們引用相同.此時"sss"和"111"
* 兩個常量不會再創建.
*/
String s3 = "sss" + "111";
/*
* 由於s1是個變量,在編譯期不能確定它的值是多少,所以
* 會在執行的時候創建一個新的String對象存儲到heap中,
* 然後賦值給s4.
*/
String s4 = "sss" + s1;
System.out.println(s2 == s3); //true
System.out.println(s2 == s4); //false
System.out.println(s2 == s4.intern()); //true
例5
這個是The Java Language Specification中3.10.5節的例子,有了上面的說明,這個應該不難理解了
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " "); //lo在runtime會創建一個新的對象
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
package other;
public class Other { static String hello = "Hello"; }
輸出結果為true true true true false true,請自行分析!
結果上面分析,總結如下:
1.單獨使用""引號創建的字符串都是常量,編譯期就已經確定存儲到String Pool中.
2.使用new String("")創建的對象會存儲到heap中,是運行期新創建的.
3.使用只包含常量的字符串連接符如"aa" + "aa"創建的也是常量,編譯期就能確定,已經確定存儲到String Pool中.(編譯時會直接優化成"aaaa",如果String Pool 中沒有"aaaa",就用""號創建一個String,直接放到Pool中,比如:String t = "a"+ "b" +"c"; 會優化成"abc",然後放入Pool中;又比如String s = "x"+"y"+ref;在編譯時有部分的優化:"xy",而ref + "x" +"y"就不會有部分的優化,"+"從左到右執行,ref是變量,編譯時期無法確定)
4.使用包含變量的字符串連接符如"aa" + s1創建的對象是運行期才創建的,存儲在heap中.
(根據java api文檔中String類所講,會在內部使用stringbuffer及其append方法來實現連接,然後執行toString(),這樣就會在運行時又創建一個新對象)
還有幾個經常考的面試題:
1.
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面創建了幾個String對象?
答案:3個 ,編譯期Constant Pool中創建1個,運行期heap中創建2個.
發現有空還要看看基礎了.+.jvm
2011年3月3日 星期四
2011年3月2日 星期三
About cygwin
下載與安裝
連至 www.cygwin.com 下載 setup.exe
選取所需套件 // 建議全選devel, lib等分類的所有套件
===============================================
===========================================================
Package: quilt
quilt.sh exit code 1
/var/log/setup.log.full
=========================================================================
Copying skeleton files.
These files are for the user to personalise their cygwin experience.
They will never be overwritten nor automatically updated.
`./.bashrc' -> `/home/Owner//.bashrc'
`./.bash_profile' -> `/home/Owner//.bash_profile'
`./.inputrc' -> `/home/Owner//.inputrc'
Owner@your-1d3dfaa9ab ~
$
==================================================================
#後為註解
ls #列出目錄,檔案
cp #拷貝檔案
mkdir dddd #建立目錄 建立名稱為dddd的資料夾
rmdir #刪除資料夾 例: rmdirdddd
cd ???? #進入該目錄
要回到一開始的目錄 cd ~/
whoami #顯示名稱
cat >bbbb.txt #建立檔案
wtestwwww #輸入內容
wwtestwww #輸入內容 ctrl+d 編輯結束
cat bbbb.txt #開啟檔案
g77 goooo.f #編譯檔案(限副檔名.f使用)
g77 xxxx -o yyyy #用 g77 編譯 xxxx ,輸出 檔名yyyy的檔案
mv ????.??? ????.??? #變更檔名 搬移/改名目錄
./gooo.exe #執行檔案 ./表示該目錄下的某檔案
man 說明 例: man mkdir
=======================================================
想知道一開始的根目錄在哪嗎?
先用cygwin在根目錄建一個名稱奇怪的檔案
cat > 123456789.123 #建立檔案
# ctrl+d 編輯結束
用Windows的檔案搜尋123456789.123
找到根目錄後
以後就可以用Windows來管理檔案(建立 刪除 複製 編輯...)
要編譯時再開cygwin就好
==================================================================
不透過Shell來,直接在Windows上執行,會遇到下面的問題:
cygwin1.dll找不到元件
1.請至C:\cygwin\bin 資料夾內 找到cygwin.dll 檔案並複製 (不可剪下)
2.請至C:\WINDOWS\system32 資料夾內,貼上cygwin.dll 檔案
3.OK!
NOTE:
沒看到cygwin.dll的話就找cygwin1.dll
====================================================================
目前看來 cygwin的指令與FreeBSD一樣
下面網址的指令說明比較完整
FreeBSD command
http://code10111.blogspot.com/2011/04/freebsd-command-reference.html
連至 www.cygwin.com 下載 setup.exe
選取所需套件 // 建議全選devel, lib等分類的所有套件
===============================================
某些載點不太穩,東西會沒載到 若是某些操作有問題 ,建議換個載點再載沒載到的部份 |
Package: quilt
quilt.sh exit code 1
/var/log/setup.log.full
=========================================================================
Copying skeleton files.
These files are for the user to personalise their cygwin experience.
They will never be overwritten nor automatically updated.
`./.bashrc' -> `/home/Owner//.bashrc'
`./.bash_profile' -> `/home/Owner//.bash_profile'
`./.inputrc' -> `/home/Owner//.inputrc'
Owner@your-1d3dfaa9ab ~
$
==================================================================
#後為註解
ls #列出目錄,檔案
cp #拷貝檔案
mkdir dddd #建立目錄 建立名稱為dddd的資料夾
rmdir #刪除資料夾 例: rmdirdddd
cd ???? #進入該目錄
要回到一開始的目錄 cd ~/
whoami #顯示名稱
cat >bbbb.txt #建立檔案
wtestwwww #輸入內容
wwtestwww #輸入內容 ctrl+d 編輯結束
cat bbbb.txt #開啟檔案
g77 goooo.f #編譯檔案(限副檔名.f使用)
g77 xxxx -o yyyy #用 g77 編譯 xxxx ,輸出 檔名yyyy的檔案
mv ????.??? ????.??? #變更檔名 搬移/改名目錄
./gooo.exe #執行檔案 ./表示該目錄下的某檔案
man 說明 例: man mkdir
=======================================================
想知道一開始的根目錄在哪嗎?
先用cygwin在根目錄建一個名稱奇怪的檔案
cat > 123456789.123 #建立檔案
# ctrl+d 編輯結束
用Windows的檔案搜尋123456789.123
找到根目錄後
以後就可以用Windows來管理檔案(建立 刪除 複製 編輯...)
要編譯時再開cygwin就好
==================================================================
不透過Shell來,直接在Windows上執行,會遇到下面的問題:
cygwin1.dll找不到元件
1.請至C:\cygwin\bin 資料夾內 找到cygwin.dll 檔案並複製 (不可剪下)
2.請至C:\WINDOWS\system32 資料夾內,貼上cygwin.dll 檔案
3.OK!
NOTE:
沒看到cygwin.dll的話就找cygwin1.dll
====================================================================
目前看來 cygwin的指令與FreeBSD一樣
下面網址的指令說明比較完整
FreeBSD command
http://code10111.blogspot.com/2011/04/freebsd-command-reference.html
訂閱:
文章 (Atom)