第一組:姚成棟 折線圖
由于無法上傳文件
相關(guān)文件見群文件
第二組:趙彩鳳 成員變量和類變量的區(qū)別
由static修飾的變量稱為靜態(tài)變量,其實質(zhì)上就是一個全局變量弧岳。如果某個內(nèi)容是被所有對象所共享凳忙,那么該內(nèi)容就應(yīng)該用靜態(tài)修飾;沒有被靜態(tài)修飾的內(nèi)容禽炬,其實是屬于對象的特殊描述涧卵。
不同的對象的實例變量將被分配不同的內(nèi)存空間, 如果類中的成員變量有類變量腹尖,那么所有對象的這個類變量都分配給相同的一處內(nèi)存柳恐,改變其中一個對象的這個類變量會影響其他對象的這個類變量,也就是說對象共享類變量热幔。
成員變量和類變量的區(qū)別:
1. 兩個變量的生命周期不同
成員變量隨著對象的創(chuàng)建而存在乐设,隨著對象的回收而釋放。
靜態(tài)變量隨著類的加載而存在绎巨,隨著類的消失而消失近尚。
2. 調(diào)用方式不同
成員變量只能被對象調(diào)用。
靜態(tài)變量可以被對象調(diào)用场勤,還可以被類名調(diào)用戈锻。
3. 別名不同
成員變量也稱為實例變量。
靜態(tài)變量也稱為類變量和媳。
4. 數(shù)據(jù)存儲位置不同
成員變量存儲在堆內(nèi)存的對象中格遭,所以也叫對象的特有數(shù)據(jù)。
靜態(tài)變量數(shù)據(jù)存儲在方法區(qū)(共享數(shù)據(jù)區(qū))的靜態(tài)區(qū)留瞳,所以也叫對象的共享數(shù)據(jù)拒迅。
static 關(guān)鍵字,是一個修飾符,用于修飾成員(成員變量和成員函數(shù))坪它。
特點:
想要實現(xiàn)對象中的共性數(shù)據(jù)的對象共享骤竹。可以將這個數(shù)據(jù)進(jìn)行靜態(tài)修飾往毡。
被靜態(tài)修飾的成員,可以直接被類名所調(diào)用靶溜。也就是說开瞭,靜態(tài)的成員多了一種調(diào)用方式。類名.靜態(tài)方式罩息。
靜態(tài)隨著類的加載而加載嗤详。而且優(yōu)先于對象存在。
弊端:
有些數(shù)據(jù)是對象特有的數(shù)據(jù)瓷炮,是不可以被靜態(tài)修飾的葱色。因為那樣的話,特有數(shù)據(jù)會變成對象的共享數(shù)據(jù)娘香。這樣對事物的描述就出了問題苍狰。所以,在定義靜態(tài)時烘绽,必須要明確,這個數(shù)據(jù)是否是被對象所共享的。
-
靜態(tài)方法只能訪問靜態(tài)成員澈蟆,不可以訪問非靜態(tài)成員雾家。
因為靜態(tài)方法加載時,優(yōu)先于對象存在盏檐,所以沒有辦法訪問對象中的成員歇式。
-
靜態(tài)方法中不能使用this,super關(guān)鍵字胡野。
因為this代表對象材失,而靜態(tài)在時,有可能沒有對象给涕,所以this無法使用豺憔。
轉(zhuǎn)自http://www.runoob.com/java
第三組:蔡永堅 C#性能優(yōu)化總結(jié)- String 操作
1.2.1 使用 StringBuilder 做字符串連接
String 是不變類,使用 + 操作連接字符串將會導(dǎo)致創(chuàng)建一個新的字符串够庙。如果字符串連接次數(shù)不是固定的恭应,例如在一個循環(huán)中,則應(yīng)該使用 StringBuilder 類來做字符串連接工作耘眨。因為 StringBuilder 內(nèi)部有一個 StringBuffer 昼榛,連接操作不會每次分配新的字符串空間。只有當(dāng)連接后的字符串超出 Buffer 大小時,才會申請新的 Buffer 空間胆屿。典型代碼如下:
StringBuilder sb = new StringBuilder( 256 );
for ( int i = 0 ; i < Results.Count; i ++ )
{
sb.Append (Results[i]);
}
如果連接次數(shù)是固定的并且只有幾次奥喻,此時應(yīng)該直接用 + 號連接,保持程序簡潔易讀非迹。實際上环鲤,編譯器已經(jīng)做了優(yōu)化,會依據(jù)加號次數(shù)調(diào)用不同參數(shù)個數(shù)的 String.Concat 方法憎兽。例如:
String str = str1 + str2 + str3 + str4;
會被編譯為 String.Concat(str1, str2, str3, str4)冷离。該方法內(nèi)部會計算總的 String 長度,僅分配一次纯命,并不會如通常想象的那樣分配三次西剥。作為一個經(jīng)驗值,當(dāng)字符串連接操作達(dá)到 10 次以上時亿汞,則應(yīng)該使用 StringBuilder瞭空。
這里有一個細(xì)節(jié)應(yīng)注意:StringBuilder 內(nèi)部 Buffer 的缺省值為 16 ,這個值實在太小疗我。按 StringBuilder 的使用場景咆畏,Buffer 肯定得重新分配。經(jīng)驗值一般用 256 作為 Buffer 的初值碍粥。當(dāng)然鳖眼,如果能計算出最終生成字符串長度的話,則應(yīng)該按這個值來設(shè)定 Buffer 的初值嚼摩。使用 new StringBuilder(256) 就將 Buffer 的初始長度設(shè)為了256钦讳。
1.2.2 避免不必要的調(diào)用 ToUpper 或 ToLower 方法
String是不變類,調(diào)用ToUpper或ToLower方法都會導(dǎo)致創(chuàng)建一個新的字符串枕面。如果被頻繁調(diào)用愿卒,將導(dǎo)致頻繁創(chuàng)建字符串對象。這違背了前面講到的“避免頻繁創(chuàng)建對象”這一基本原則潮秘。
例如琼开,bool.Parse方法本身已經(jīng)是忽略大小寫的,調(diào)用時不要調(diào)用ToLower方法枕荞。
另一個非常普遍的場景是字符串比較柜候。高效的做法是使用 Compare 方法,這個方法可以做大小寫忽略的比較躏精,并且不會創(chuàng)建新字符串渣刷。
還有一種情況是使用 HashTable 的時候,有時候無法保證傳遞 key 的大小寫是否符合預(yù)期矗烛,往往會把 key 強(qiáng)制轉(zhuǎn)換到大寫或小寫方法辅柴。實際上 HashTable 有不同的構(gòu)造形式,完全支持采用忽略大小寫的 key: new HashTable(StringComparer.OrdinalIgnoreCase)。
1.2.3 最快的空串比較方法
將String對象的Length屬性與0比較是最快的方法:if (str.Length == 0)
其次是與String.Empty常量或空串比較:if (str == String.Empty)或if (str == "")
注:C#在編譯時會將程序集中聲明的所有字符串常量放到保留池中(intern pool)碌嘀,相同常量不會重復(fù)分配涣旨。
第四組:張元一 iOS 輸入框高度隨輸入實時變化效果
本效果實現(xiàn)可分為兩步:
- 根據(jù)文本長度和字體計算TextView高度
- 根據(jù)TextView高度實時改變TableViewCell高度
計算textview高度:
(float) heightForTextView: (UITextView *)textView WithText: (NSString *) strText{
CGSize constraint = CGSizeMake(textView.contentSize.width , CGFLOAT_MAX);
CGRect size = [strText boundingRectWithSize:constraint
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14]}
context:nil];
float textHeight = size.size.height+22;
return textHeight;
}
設(shè)置代理,監(jiān)聽textview高度:
cell.textview.delegate = self;
Cell高度設(shè)置為自適應(yīng):
(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
改變Cell的frame及后面Cell的坐標(biāo)整體下移:
[UIView animateWithDuration:0.5 animations:^{
for (MyTableViewCell *ce in array) {
CGRect frame1 = ce.frame;
frame1.origin.y += fl;
ce.frame = frame1;
}
} completion:nil];
[UIView animateWithDuration:0.5 animations:^{
textView.frame = frame;
cell.frame = framex;
} completion:nil];
具體實現(xiàn)代碼在GitHub上:
https://github.com/Frued/CustomTableView
第五組:陳孚楠 前端框架與庫的區(qū)別
框架就是提供了前端項目整體解決方案股冗。庫就是自己組合來實現(xiàn)項目霹陡。
某種層面上來說,前端庫就像我平時家里的工具箱魁瞪,里面有起子穆律、錘子,我們可以通過這個工具箱來給小孩子創(chuàng)造玩具导俘,我們甚至可以自己創(chuàng)造一些工具,方便我們?nèi)蘸髣?chuàng)造玩具剔蹋。而框架旅薄,更像是我們在淘寶上買好了車的骨架,回來后拼裝好了泣崩,可以根據(jù)自己的需要少梁,貼上不同的貼紙,噴上不同的顏色矫付,我們跟其他使用框架的人凯沪,拿到手上的玩具骨架都是一樣的,我們很難自己去改變买优。
前端基于JS的框架(frameworks)/庫(librarys)更是層出不窮妨马,且各自都有其自身的優(yōu)勢以及劣勢,有些是向開發(fā)使用者提供整套的服務(wù)杀赢,比如MVC一整套烘跺,有些則是專注于某一個點,比如專注于dom操作或異步請求脂崔;
框架與庫之間最本質(zhì)區(qū)別在于控制權(quán):you call libs, frameworks call you(控制反轉(zhuǎn))
庫:庫是更多是一個封裝好的特定的集合滤淳,提供給開發(fā)者使用,而且是特定于某一方面的集合(方法和函數(shù))砌左,庫沒有控制權(quán)脖咐,控制權(quán)在使用者手中,在庫中查詢需要的功能在自己的應(yīng)用中使用汇歹,我們可以從封裝的角度理解庫屁擅;
框架:框架顧名思義就是一套架構(gòu),會基于自身的特點向用戶提供一套相當(dāng)于叫完整的解決方案秤朗,而且控制權(quán)的在框架本身煤蹭,使用者要找框架所規(guī)定的某種規(guī)范進(jìn)行開發(fā)。
在實際中,像angular硝皂、backbone常挚、vue就屬于框架,而jQuery稽物、react奄毡、underscore就是庫,在前者中我們完全可以自由的使用后者贝或,同時也可以沒有前者的基礎(chǔ)之上使用后者吼过,都是很自由,控制權(quán)始終在我們的手中咪奖,但是使用框架時候就必須按照它的規(guī)范來進(jìn)行模塊化的開發(fā)盗忱;
庫、插件羊赵、組件趟佃、控件、擴(kuò)展
組件本質(zhì):封裝昧捷。一定程度上可以約等于模塊化闲昭,調(diào)用者只需關(guān)注輸入和輸出,總思想就是分而治之靡挥、重復(fù)利用序矩。低耦合;
組件解決資源整合問題跋破、增強(qiáng)功能促進(jìn)開發(fā)效率簸淀。提高可維護(hù)性,便于協(xié)同開發(fā)幔烛,每個模塊都可以分拆為一個組件啃擦,例如異步請求組件,路由組件饿悬,各個視圖組件令蛉。
庫:為解決某種特定需求的程序功能集合;即library狡恬,如jQuery珠叔,常用于方便dom操作、解決瀏覽器兼容等問題弟劲。
插件:參與程序內(nèi)部運行環(huán)節(jié)的一段或多段代碼集合祷安;即Plugin,遵循一定規(guī)范寫出來方便程序展示效果兔乞,擁有特定功能且方便調(diào)用汇鞭。如輪播圖和瀑布流插件凉唐,
擴(kuò)展:使用程序API擴(kuò)展程序適用面的一段或多段代碼集合;即Extension霍骄,
組件:可重復(fù)使用并且可以和其他對象進(jìn)行交互的對象台囱;即Component,能復(fù)用的js代碼其實跟插件差不多读整,區(qū)別可能就是插件專注于特定功能而組件更專注于復(fù)用吧簿训。
控件:提供或?qū)崿F(xiàn)用戶界面功能的組件,控件即組件米间,反之不一定强品。即Control,
組件(Component)是是一個含義很大的概念屈糊,一般是指軟件系統(tǒng)的一部分的榛,承擔(dān)了特定的職責(zé),可以獨立于整個系統(tǒng)進(jìn)行開發(fā)和測試逻锐,一個良好設(shè)計的組件應(yīng)該可以在不同的軟件系統(tǒng)中被使用(可復(fù)用)困曙。例如V8引擎是Chrome瀏覽器的一部分,負(fù)責(zé)運行javascript代碼谦去,這里V8引擎就可以視為一個組件。V8引擎同時也是Node.js的javascript解釋器蹦哼,這體現(xiàn)了組件的可復(fù)用性鳄哭。
庫(Library)是一系列預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)和函數(shù)(對于面向?qū)ο笳Z言來說,是類)的集合纲熏,程序員通過使用這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)實現(xiàn)功能妆丘。例如Moment.js是一個javascript庫,提供了處理時間的一些函數(shù)局劲。
框架(Framework)也是一系列預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)和函數(shù)勺拣,一般用于作為一個軟件的骨架,但程序真正的功能還需要由開發(fā)者實現(xiàn)鱼填∫┯校框架和庫的最大區(qū)別在于“控制反轉(zhuǎn)”,當(dāng)你使用一個庫苹丸,你會調(diào)用庫中的代碼愤惰,而當(dāng)你使用一個框架,框架會調(diào)用你的代碼赘理』卵裕框架和庫是一個有交叉的概念,很多框架都是以庫的形式發(fā)布的商模,例如Java的Spring MVC框架奠旺,其發(fā)布的jar包本身就是一個庫蜘澜。而一個庫如果也能通過依賴反轉(zhuǎn)的方式進(jìn)行擴(kuò)展,那也可以視為一個框架响疚,例如Python的markdonw解析庫Python Markdown鄙信,可以添加自定義的解析擴(kuò)展,那么可以被視為一個markdonw解析框架稽寒。
插件(Plugin)和擴(kuò)展(extension)是兩個很相似的概念扮碧,我沒有辦法在軟件系統(tǒng)的角度給出這二者的區(qū)別。插件(或擴(kuò)展)是對已有應(yīng)用程序或者庫的功能補(bǔ)充杏糙,一個軟件的插件(或擴(kuò)展)是實現(xiàn)了該軟件預(yù)定義接口的組件慎王,用來向已有的軟件添加功能。插件在目標(biāo)軟件發(fā)布時可以不預(yù)先包含宏侍,而是在運行時被使用者注冊赖淤,然后再被目標(biāo)軟件調(diào)用。另一個很接近的概念是加載項(Add-on)谅河,可以認(rèn)為加載項是插件(或擴(kuò)展)的子集咱旱,是僅針對應(yīng)用程序來說的功能補(bǔ)充。一個插件的例子是Flash的瀏覽器插件绷耍,為瀏覽器實現(xiàn)了運行Flash程序的功能吐限。
控件(Control)是gui編程的一個概念,一般來說一個最終用戶可以看到的褂始、可交互的組件诸典,被稱為一個控件。例如.NET編程中的System.Windows.Controls.Button是一個控件崎苗。