ArrayList 和Vector是采用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,都允許直接序號索引元素,但是插入數據要設計到數組元素移動等內存操作,所以索引數據快插入數據慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行向前或向后遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入數度較快!
java為數據結構中的映射定義了一個接口java.util.Map;它有四個實現類,分別是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存儲健值對,根據鍵得到值,因此不允許鍵重復(重復了覆蓋了),但允許值重復。 Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。 LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構造時用帶參數,按照應用次數排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。 TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。 一般情況下,我們用的最多的是HashMap,HashMap里面存入的鍵值對在取出的時候是隨機的,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。 TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。 LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現,它還可以按讀取順序來排列,像連接池中可以應用。 String 字符串常量 StringBuffer 字符串變量(線程安全) StringBuilder 字符串變量(非線程安全) 簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在于 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。 而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度并不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優勢。其實這是 JVM 的一個把戲,在 JVM 眼里,這個 String S1 = “This is only a” + “ simple” + “test”; 其實就是: String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 這時候 JVM 會規規矩矩的按照原來的方式去做 在大部分情況下 StringBuffer > String StringBuffer Java.lang.StringBuffer線程安全的可變字符序列。一個類似于 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。 可將字符串緩沖區安全地用于多個線程??梢栽诒匾獣r對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。 StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。 例如,如果 z 引用一個當前內容是“start”的字符串緩沖區對象,則此方法調用 z.append("le") 會使字符串緩沖區包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區,使之包含“starlet”。 在大部分情況下 StringBuilder > StringBuffer java.lang.StringBuilde java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。 根據《佛山市公安局交警支隊汽車駕駛培訓考試質量監督管理考評辦法》的有關規定,佛山市交警支隊近日對全市15家汽車駕駛人培訓機構1-3月份的考試質量進行綜合考評。 佛山市2013 年 3 月份駕駛培訓機構汽車類的考試合格率、培訓質量排名 駕校學員在訓練中適應了自己教練車的離合高低,等考試時一換車就容易出現不適應的現象,這很正常的,老司機也會出現這種現象。那么,如何做才能快速適應考試車離合的高低呢?對此,資深教練為我們支招。 教練介紹,想要在短時間內快速適應考試車的離合高低,就用掛上一檔,松抬離合的方法,來適應踏板的高低不同,同時保證不熄火不溜車。這種方法我和學員在考試中反復的試驗過多次,比較可靠,所以推薦給大家。 上車前看看考試車,沒有什么特殊的地方,和我們平時訓練是一模一樣的車型。 打開車門,看看也是與教練車一樣的布置,轉向盤、離合器。剎車和儀表,一樣的操作部件,沒有什么不同的。 上車準備好后,開始適應離合踏板高低,將離合踩到底,掛一檔后,松開離合,看轉速表明顯的上下舞動,這就是準確的離合半聯動位置,然后馬上踩下離合,再次試驗,反復幾次,就明確離合高低了。 左邊是發動機轉速表,這是發動機沒啟動時的狀況。 看左側就是發動機轉速表,看紅色表針在這個位置就是啟動了。 汽車起步熄火是許多車友常見的問題,尤其是對于新手來說,了解起步熄火的原因并學習掌握怎樣起步不易熄火對于許多車友來說都是必要的。 一、汽車起步熄火的原因: 1、油箱沒油了; 2、蓄電池電壓過低導致啟動馬達無法啟動或達不到啟動轉速; 3、怠速馬達故障,特征是啟動如果不給油后立即熄火; 4、油路堵塞(常見于日常使用較差汽油的車輛上),特征同上; 5、車載控制系統故障,此故障極少見,但也不能排除,控制系統故障故障會導致車輛所有功能都失靈; 6、進氣管路堵塞(可能有異物進入),查一查從進氣口、空氣濾清到節氣門的管道; 7、火花塞、高壓線故障。 了解了日常汽車起步熄火的常見原因,現在我們來看看在實操中如何起步才不易熄火。 二、怎樣起步不熄火 不同情況用不同方法: 1、平地起步 確保車停在不拉手剎也不會溜后的路面。操作:踩盡離合,掛一檔,先加油(加油),使轉速達1500轉以上,穩住油門;快放至總行程的三分之一,(快放) 慢慢放離合,同時感覺車是否向前動(慢放);當車慢慢向前動時,左腳踩住離合保持不動,右腳加些油(停放-加油),慢放盡離合(慢放)(剛好配合油門滯后性),起步成功!總結:加油--快放--慢放--車動停放-加油--慢放 2、小斜坡起步 操作:右腳踩剎車,用一點力就可,但確保車不會溜后;(剎車) 踩盡離合,掛一檔,快放離合至總行程三分之一后,慢慢放離合;(快放--慢放), 注意:當轉速表一出現下降時,左腳踩住離合保持不動;(停放)抬頭看前面,同時右腳迅速從腳剎踏板移到加速踏板加些油(加油),左腳慢慢放離合,當車慢慢向前動時,可以使離合保持一下,再慢慢放離合。(慢放)總結:剎車--快放--慢放--表降停放-加油--慢放 3、大斜坡起步 由于坡度較大,需借助手剎起步。操作:拉起手剎;(手剎),踩盡離合,掛一檔,右腳加些油,使轉速達1500 轉,穩住油門;(加油)快放至總行程的三分之一后,慢慢放離合;(快放--慢放)注意:當轉速表一出現下降時,發動機聲音會變沉;左腳踩住離合保持不動(停放),右腳再加些油(再加油),抬頭看前面;左腳再慢放一點離合后保持不動,松手剎,起步成功!(再慢放--松手剎)總結:手剎--加油--快放--慢放--表降停放-再加油--再慢放--松手剎 起步方法的掌握是:熟能生巧。 三、起步時機的掌握 起步時機的掌握就是有預見性的駕駛,這里是其中的技巧之一。不同情況,有不同的參照物,多總結,要點就是:提前預測! 1、紅綠燈口排首位起步時機: 注意垂直方向的交通指示燈,當垂直方向的交 通指示燈變成橙色時,就可作起步準備了,如果看不到垂直方向的交通指示燈,可留意行人道的交通指示燈,以此作參照物。 2、雙車道在其他車后面的起步時機:透過前車的玻璃,看再前面的車,當再前面的車起動時,就可作起步準備了,借助其他方法,能判斷再前面的車的狀態,如 果實在沒有方法找到參照物,就只好等到你前面的車的剎車燈亮起時,你就要注 意作起步準備了。 3、四車道在其他車后面的起步時機:首先可用雙車道在其他車后面的起步時機,看旁邊車道的同排車的前一輛車,如果它起步,你就可作起步準備了。 新手起步如何防止死火? Q:新手起步容易死火,怎么辦? A :起步時的正確操作是在離合踏板抬起開始時快抬,當發動機的聲音有變化,踏板抬起的速度稍慢。在離合器踏板抬起的同時,根據發動機阻力大小逐漸踩下油門踏板,使汽車平穩起步。 半離合狀態能防死火嗎? Q:新手開手動擋車老擔心死火,在左右有車時會下意識地踩離合器,或長時間把腳放在離合器上,半離合狀態能防死火嗎? A:新手無事不要踩離合,在開車時除汽車起步、換擋和低速剎車需要踩下離合器踏板外,其他時間都不要沒事踩離合,或把腳放在離合器踏板上,否則很容易造成離合器打滑等現象,同時還會費油。 什么時候該離合和剎車一起踩? Q:什么時候該離合和剎車一起踩,什么時候又不用呢? A:在駕駛中,除低速踩剎車停車,需要踩下離合器踏板外,其他情況下的踩剎車都盡量不要踩下離合器踏板。 盡管我所知道的瀏覽器都支持cookie的設置,不過用戶可以有意識的將它關閉,或者無意識的將它關閉。當你在你的servlets/JSP頁面中使用cookie時,你不能保證用戶的瀏覽器是否可以接受cookie--你需要先檢查一下。這兒有一個檢查用戶的瀏覽器的cookie是否有效的小技巧。 這個技巧很簡單。你從servlet或JSP向用戶的瀏覽器發出一個HTTP回應,強行使瀏覽器在第二次返回。在第一次的響應中,你發出一個cookie。當瀏覽器第二次返回的時候,檢查上一次發出的cookie。如果cookie存在,說明瀏覽器的cookie功能可用。否則說明用戶的瀏覽器太老,不支持cookie,或者瀏覽器的cookie功能被關閉。 JSP頁面用下面這段代碼檢查cookie是否有效。如果有效,那么頁面的返回字符串為“Cookie is on”.若無效則為“Cookie is off”:
import java.io.BufferedReader;
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class TestNio { public static void main(String args[]) throws Exception{ //String infile = "D:\\workspace\\test\\usagetracking.log"; //FileInputStream fin= new FileInputStream(infile); //FileChannel fcin = fin.getChannel(); int bufSize = 100; File fin = new File("D:\\workspace\\test\\usagetracking.log"); File fout = new File("D:\\workspace\\test\\usagetracking2.log"); FileChannel fcin = new RandomAccessFile(fin, "r").getChannel(); ByteBuffer rBuffer = ByteBuffer.allocate(bufSize); FileChannel fcout = new RandomAccessFile(fout, "rws").getChannel(); ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize); readFileByLine(bufSize, fcin, rBuffer, fcout, wBuffer); System.out.print("OK!!!"); } public static void readFileByLine(int bufSize, FileChannel fcin, ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer){ String enterStr = "\n"; try{ byte[] bs = new byte[bufSize]; int size = 0; StringBuffer strBuf = new StringBuffer(""); //while((size = fcin.read(buffer)) != -1){ while(fcin.read(rBuffer) != -1){ int rSize = rBuffer.position(); rBuffer.rewind(); rBuffer.get(bs); rBuffer.clear(); String tempString = new String(bs, 0, rSize); //System.out.print(tempString); //System.out.print("<200>"); int fromIndex = 0; int endIndex = 0; while((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1){ String line = tempString.substring(fromIndex, endIndex); line = new String(strBuf.toString() + line); //System.out.print(line); //System.out.print("</over/>"); //write to anthone file writeFileByLine(fcout, wBuffer, line); strBuf.delete(0, strBuf.length()); fromIndex = endIndex + 1; } if(rSize > tempString.length()){ strBuf.append(tempString.substring(fromIndex, tempString.length())); }else{ strBuf.append(tempString.substring(fromIndex, rSize)); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer, String line){ try { //write on file head //fcout.write(wBuffer.wrap(line.getBytes())); //wirte append file on foot fcout.write(wBuffer.wrap(line.getBytes()), fcout.size()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 離合器運用不當是汽車起步最大的障礙,特別是在上坡起步時。要正確運用離合器,必須學會體會離合器半聯動位置。當離合器松抬到某一位置(也可以是某一點),發動機的動力開始傳遞給傳動機構,這個傳力的開始點稱為半聯動。如果在半聯動位置上油門、離合器、手制動三者的聯合動作配合得當,就能使汽車平穩起步。 ● 如何體會半聯動的位置呢?可以根據三種現象作出判斷。 (1)聽發動機聲音的變化。當發動機在沒有負荷時,發動機的聲音比較輕松,如果加上負荷,即抬離合器達到傳力的開始點時,發動機的聲音就開始低沉下來,尤其是在汽車負荷較大的情況下反應更加明顯。 (2)發動機抖動的感覺。在離合器抬到半聯動位里時,汽車由靜到動會先有一股抖動的感覺,如果將雙手輕輕地浮擱在方向盤上,那么就很容易感覺到這種抖動的現象。這時離合器就恰在半聯動狀態。 (3)憑腳感。當發動機的聲音開始變化,車輛發生輕徽震動的同時,離合器踏板即會有頂腳的感覺產生,這時的離合器正處在半聯動狀態。 利用聽覺和觸覺來尋找半聯動位置是一種十分有效的辦法。 ● 松抬離合器的過程常常歸納為: 一快:當開始松抬離合器,消除其自由行程時,動作要快。 一慢:當離合器松抬到即將要進入接力狀態時(初聯動),動作要慢。 一停頓:當離合器松抬到剛進入接力狀態時(半聯動),動作稍有停頓。 二慢:當離合器松抬至離開半聯動位里(全聯動狀態)時,動作要慢。 二快:當離合器松抬至完全結合時(進入離合器的自由行程).動作要快。 掌握好離合器的兩快、兩慢、一停頓的操作要領,是做到汽車平穩起步的關健。 |