少年阿賓那些青春的歲月 |
數據類型 大小(二進制位數) 范圍 默認值 boolean(布爾型) 1 true/false false JAVA基本數據類型所占字節數是多少?byte short int long char float double boolean
其中一個字節由8個二進制位組成 Java一共有8種基本數據類型(原始數據類型): 在移動開發中由于移動設備內存的局限性,往往需要考慮使用的數據類型所占用的字節數。下面簡單介紹下Java中幾種基本數據類型,以加深記憶。 在Java中一共有8種基本數據類型,其中有4種整型,2種浮點類型,1種用于表示Unicode編碼的字符單元的字符類型和1種用于表示真值的boolean類型。(一個字節等于8個bit) 1.整型 類型 存儲需求 bit數 取值范圍 備注 int 4字節 4*8 short 2字節 2*8 -32768~32767 long 8字節 8*8 byte 1字節 1*8 -128~127 2.浮點型 類型 存儲需求 bit數 取值范圍 備注 float 4字節 4*8 float類型的數值有一個后綴F(例如:3.14F) double 8字節 8*8 沒有后綴F的浮點數值(如3.14)默認為double類型 3.char類型 類型 存儲需求 bit數 取值范圍 備注 char 2字節 2*8 4.boolean類型 類型 存儲需求 bit數 取值范圍 備注 boolean 1字節 1*8 false、true 補充:Java有一個能夠表示任意精度的算書包,通常稱為“大數值”(big number)。雖然被稱為大數值,但它并不是一種Java類型,而是一個Java對象。 如果基本的整數和浮點數精度不能夠滿足需求,那么可以使用java.math包中的兩個很有用的類:BigIntegerBigDecimal(Android SDK中也包含了java.math包以及這兩個類)這兩個類可以處理包含任意長度數字序列的數值。BigInteger類實現了任意精度的整數運算,BigDecimal實現了任意精度的浮點數運算。具體的用法可以參見Java API。 http://blog.csdn.net/witsmakemen/article/details/8974200 int常見為4個字節,跟操作系統有關系。操作系統16位的時候,int 2字節,操作系統32位的時候,int 4字節,由于32位系統之前占主流地位,實際現在就算是64位系統,出于兼容性考慮,int也是4字節的
文件上傳方面的: plupload+fastdfs plupload負責上傳,fastdfs 負責存儲
二叉樹相關的問的比較多
二分查找 treemap和某些數據庫索引的的底層是紅黑樹 鏈表的相交和閉環 針對二叉樹,比如分層遍歷,找最近父節點 在字符串中找回文串,數組中尋找重復的數字或相鄰之和的最大串 紅黑樹不就是B樹么 如果沒有遇到專業考算法的公司,只能說還沒面試過牛公司,就相當于編程感覺不到數據結構,相當于編程還沒入門 是對稱二叉B樹 還是有點不一樣,是其子集,誤導你了 try { response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=" +teamQuery.getTeamId()+ new String(" 項目銷量.xls".getBytes("gbk"), "iso8859-1")); Boolean flag = manteamService.downFile(teamQuery,response.getOutputStream()); if (flag) { resutMap.put("success", true); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } 一定要有response.getOutputStream() 百度 T2:7k~10k T3:11k~13k T4:14k~16k T5:16k~20k T6:20k~25k
年青代=新生代(eden space)+2個survivor
年青代用來存放新近創建的對象,尺寸隨堆大小的增大和減小而相應的變化,默認值是保持為堆大小的1/15,可以通過-Xmn參數設置年青代為固定大小,也可以通過-XX:NewRatio來設置年青代與年老代的大小比例,年青代的特點是對象更新速度快,在短時間內產生大量的“死亡對象”。 年輕代的特點是產生大量的死亡對象,并且要是產生連續可用的空間, 所以使用復制清除算法和并行收集器進行垃圾回收. 對年輕代的垃圾回收稱作初級回收 (minor gc) 初級回收將年輕代分為三個區域, 一個新生代 , 2個大小相同的復活代, 應用程序只能使用一個新生代和一個復活代, 當發生初級垃圾回收的時候,gc掛起程序, 然后將新生代和復活代中的存活對象復制到另外一個非活動的復活代中,然后一次性清除新生代和復活代,將原來的非復活代標記成為活動復活代. 將在指定次數回收后仍然存在的對象移動到年老代中, 初級回收后,得到一個空的可用的新生代. 昨天,看一個build Standalone中databrusher的一個腳本,發現一個Java類似乎沒有在classpath中,好像也可一直運行了。很疑惑,問了對應的開發同學,然后自己好好看了下它的代碼,才知道了原理。 命令是:$JAVA_HOME/bin/java $JAVA_OPTS com.alibaba.standalone.AppStartor com.alibaba.intl.standalone.databrusher.Startor "$main_class" "$signal_file" "$recivers" 原理是:Java根據classpath找到,com.alibaba.standalone.AppStartor這個class,運行這個class,會啟動一個classloader來加載com.alibaba.intl.standalone.databrusher.Startor(在里面會指定到WORLDS-INF目錄下加載類),然后com.alibaba.intl.standalone.databrusher.Startor會啟動對應的"$main_class". 然后,花了挺多時間好好看了一下Java的classloader,了解一下其中的原理和看了下代碼。下面也簡單總結一下吧。 java虛擬機是由sun.misc.Launcher來初始化的,也就是java(或java.exe)這個程序來做的.虛擬機按以下順序搜索并裝載所有需要的類: 1,引導類:組成java平臺的類,包含rt.jar和i18n.jar等基礎jar包中的類. 2,擴展類:使用java擴展機制的類,都是位于擴展目錄($JAVA_HOME/jre/lib/ext)中的.jar檔案包. 3,用戶類:開發者定義的類或者沒有使用java擴展機制的第三方產品.你必須在命令行中使用-classpath選項或者使用CLASSPATH環境變量來確定這些類的位,或者自己寫ClassLoader加載。 Java的class loader的大致情況如下圖所示: http://renyongjie668.blog.163.com/prevPhDownload.do?host=renyongjie668&albumId=197449439&photoId=6568564371 bootstrap classloader -->extension classloader-->system classloader 虛擬機一啟動,會先做一些初始化的動作。一旦初始化動作完成之后,就會 產生第一個類別加載器,即所謂的Bootstrap Loader,Bootstrap Loader 是由C++ 所撰寫而成,這個Bootstrap Loader所做的初始工作中,除了也做一些基本的初始化動作之外,最重要的就是加載定義在sun.misc 命名空間底下的Launcher.java 之中的ExtClassLoader( 因為是inner class ,所以編譯之后會變成Launcher$ExtClassLoader.class) ,并設定其Parent 為null,代表其父加載器為Bootstrap Loader 。然后Bootstrap Loader ,再要求加載定義于sun.misc 命名空間底下的Launcher.java 之中的AppClassLoader( 因為是inner class,所以編譯之后會變成Launcher$AppClassLoader.class) ,并設定其Parent 為之前產生的ExtClassLoader 實例。 a. Bootstrap ClassLoader/啟動類加載器 主要負責java_home/jre/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作. b. Extension ClassLoader/擴展類加載器 主要負責java_home/jre/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作 c. System ClassLoader/系統類加載器 主要負責java -classpath/-Djava.class.path或$CLASSPATH變量所指的目錄下的類與jar包裝入工作.(這里需要說明的是,如果$CLASSPATH為空,jdk會默認將被運行的Java類的當前路徑作為一個默認的$CLASSPATH,一但設置了$CLASSPATH變量,則會到$CLASSPATH對應的路徑下去尋找相應的類,找不到就會報錯。這個結論,我已經經過測試,并且看了下類加載器中源代碼) d. User Custom ClassLoader/用戶自定義類加載類(java.lang.ClassLoader的子類)在程序運行期間, 通過java.lang.ClassLoader的子類動態加載class文件, 體現java動態實時類裝入特性. 為了有更多的了解,寫了個簡單的Java程序對前面三種classloader能加載類的路徑及其parent類進行了測試。代碼如下:
import java.net.URL; import java.net.URLClassLoader; /** * @className: IClassLoader * @description: 測試三種classloader加載類的路徑,及其parent * @author: 笑遍世界 * @createTime: 2010-11-17 下午07:33:40 */ public class IClassLoader { public static void main(String[] args) { // 測試bootstrap classloader 的類加載路徑 URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(urls[i].toExternalForm()); } // 測試extension classloader 的類加載路徑,先打印一個路徑,再打印出其parent,然后再打印出類加載路徑中的所有jar包 System.out.println("-------------------------------------"); System.out.println(System.getProperty("java.ext.dirs")); ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent(); System.out.println("the parent of extension classloader : "+extensionClassloader.getParent()); System.out.println("extension classloader can use thess jars:"); URL[] extURLs = ((URLClassLoader)ClassLoader.getSystemClassLoader().getParent()).getURLs(); for (int i = 0; i < extURLs.length; i++) { System.out.println(extURLs[i]); } // 測試system classloader 的類加載路徑,其實也就時classpath的路徑,并打印出它的parent System.out.println("-------------------------------------"); System.out.println(System.getProperty("java.class.path")); System.out.println(ClassLoader.getSystemResource("")); ClassLoader systemClassloader=ClassLoader.getSystemClassLoader(); System.out.println("the parent of system classloader : "+systemClassloader.getParent()); } } 本機(linux+jdk1.5)運行結果如下: file:/usr/ali/java/jre/lib/rt.jar file:/usr/ali/java/jre/lib/i18n.jar file:/usr/ali/java/jre/lib/sunrsasign.jar file:/usr/ali/java/jre/lib/jsse.jar file:/usr/ali/java/jre/lib/jce.jar file:/usr/ali/java/jre/lib/charsets.jar file:/usr/ali/java/jre/classes ------------------------------------- /usr/ali/java/jre/lib/ext the parent of extension classloader : null extension classloader can use thess jars: file:/usr/ali/java/jre/lib/ext/emma.jar file:/usr/ali/java/jre/lib/ext/localedata.jar file:/usr/ali/java/jre/lib/ext/dnsns.jar file:/usr/ali/java/jre/lib/ext/sunpkcs11.jar file:/usr/ali/java/jre/lib/ext/sunjce_provider.jar ------------------------------------- .:/usr/ali/java/lib/dt.jar:/usr/ali/java/lib/tools.jar file:/home/master/workspace/2010_11/bin/ the parent of system classloader : sun.misc.Launcher$ExtClassLoader@1a5ab41 //ps:當前路徑.即是/home/master/workspace/2010_11/bin/ 關于Java的classloader其原理還是需要好好理解才能清楚的,僅通過一天的了解,記錄為上面那么多吧。更多詳細信息,可以參考如下資料: http://snandy.javaeye.com/blog/307083 http://haofenglemon.javaeye.com/blog/426382 http://blog.csdn.net/zdwzzu2006/archive/2008/04/05/2253982.aspx http://wuquanyin1011.javaeye.com/blog/703842 http://hi.baidu.com/yangzhibin_bai/blog/item/78846cce1cb86b0992457ead.html http://www.aygfsteel.com/clraychen/archive/2008/02/20/180868.html 第一種:最基本的作為一個本本分分的函數聲明使用。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Validate Page</title> </head> <script type="text/javascript"> function validate(abin){ var lee=function(parameter){ return 'hello,'+abin; }(abin); document.getElementById("spanId").innerHTML=lee; } </script> <body> <div id="divId" class="divs"> <input id="button" type="button" value="請猛擊" onclick="validate('varyall')"/> </div> <br/> <span id="spanId" class="spans"></span> </body> </html> 第二種: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<html> <head> <title>Validate Page</title> </head> <script type="text/javascript"> var validate=function(abin){ var lee=function(parameter){ return 'hello,'+parameter; }(abin); document.getElementById("spanId").innerHTML=lee; }; </script> <body> <div id="divId" class="divs"> <input id="button" type="button" value="請猛擊" onclick="validate('varyall')"/> </div> <br/> <span id="spanId" class="spans"></span> </body> </html> 第三種: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<html> <head> <title>Validate Page</title> </head> <script type="text/javascript"> var validate=new Function("abin", "var lee=function(parameter){return 'hello,'+parameter;}(abin);document.getElementById('spanId').innerHTML=lee;"); </script> <body> <div id="divId" class="divs"> <input id="button" type="button" value="請猛擊" onclick="validate('who')"/> </div> <br/> <span id="spanId" class="spans"></span> </body> </html>
語言只是把具體的算法實現出來而已。據我了解的排序算法11-13種。排序算法嘛 主要就是個思想而已。不同的算法時間復雜度不一樣,空間復雜度也不一樣,當然執行的效率也不一樣。當然采用哪種算法還取決于你要實現什么樣的功能。就好比說:要同時盡快的找出最大最小,或者盡快的找出最值的位置等等。
冒泡排序(bubble sort) — O(n2) 雞尾酒排序 (Cocktail sort, 雙向的冒泡排序) — O(n2) 插入排序 (insertion sort)— O(n2) 桶排序 (bucket sort)— O(n); 需要 O(k) 額外 記憶體 計數排序 (counting sort) — O(n+k); 需要 O(n+k) 額外 記憶體 歸并排序 (merge sort)— O(n log n); 需要 O(n) 額外記憶體 原地歸并排序 — O(n2) 二叉樹排序 (Binary tree sort) — O(n log n); 需要 O(n) 額外記憶體 鴿巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 額外記憶體 基數排序 (radix sort)— O(n·k); 需要 O(n) 額外記憶體 Gnome sort — O(n2) Library sort — O(n log n) with high probability, 需要 (1+ε)n 額外記憶體不穩定 選擇排序 (selection sort)— O(n2) 希爾排序 (shell sort)— O(n log n) 如果使用最佳的現在版本 Comb sort — O(n log n) 堆排序 (heapsort)— O(n log n) Smoothsort — O(n log n) 快速排序 (quicksort)— O(n log n) 期望時間, O(n2) 最壞情況; 對於大的、亂數串列一般相信是最快的已知排序 |