久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java基礎(chǔ)知識大全

 123xyz123 2021-05-22

 

JVM

W3C JAVA教程

JAVA考古學(xué)

Java代碼  收藏代碼
  1. String tmpImgPath = ProPertiesUtil.getValue('/abc.properties', 'tmp_img_path');    
  2. String path = ServletActionContext.getServletContext().getRealPath(tmpImgPath);    
  3. imgFilePath = path + File.separator + fileName;// 新生成的圖片   
Java代碼  收藏代碼
  1. BigDecimal discountAmount = new BigDecimal(vou.getStringValue('nAmount'));  
  2.   
  3.   
  4. 相減:  
  5. totalAmount = totalAmount.subtract(new BigDecimal(vou.getStringValue('nAmount')));  
  6.   
  7.   
  8. 相加:  
  9. tmpTotalAmount = shoppingCartAmount.add(new BigDecimal('10'));  
  10.   
  11.   
  12. 相乘后保留2位小數(shù):  
  13. BigDecimal mallPriceDecimal = new BigDecimal(NumUtil.doubleOutPut(nMallPrice * cdoGood.getIntegerValue('lNum'), 2));  
  14.   
  15. public static  String  doubleOutPut(double  v,Integer num){  
  16.     if ( v == Double.valueOf(v).intValue()){  
  17.         return  Double.valueOf(v).intValue() +  '' ;  
  18.     }else {  
  19.         BigDecimal b =  new  BigDecimal(Double.toString(v));  
  20.         return  b.setScale(num,BigDecimal.ROUND_HALF_UP ).toString();  
  21.     }  
  22. }  
  23.   
  24. 比較大?。?nbsp; 
  25.   
  26. BigDecimal tmpTotalAmount = shoppingCartAmount;  
  27. //與商品未使用任何優(yōu)惠時(shí)金額比較  
  28. if(tmpTotalAmount.compareTo(currentAvailableAmount) > 0){  
  29.     //需支付剩余金額  
  30.     totalAmount = tmpTotalAmount.subtract(currentAvailableAmount);  
  31.     discountAmount = currentAvailableAmount;  
  32. }else if(tmpTotalAmount.compareTo(currentAvailableAmount) == 0){  
  33.     //支付金額為0  
  34.     totalAmount = tmpTotalAmount.subtract(currentAvailableAmount);  
  35.     discountAmount = currentAvailableAmount;  
  36. }else{  
  37.     //支付金額為0  
  38.     //支付后購物卡還剩余  
  39.     totalAmount = new BigDecimal('0.00');  
  40.     discountAmount = tmpTotalAmount;  
  41. }  
Java代碼  收藏代碼
  1. public static int getRandom(int num) {  
  2.         return (int) Math.round(Math.random() * num);  
  3.     }  
Java代碼  收藏代碼
  1. encrypt = encrypt.replaceAll('\\s|\\r|\\n|\\t', '');  
  2.   
  3.   
  4. public class StringUtils {  
  5.    
  6.     public static String replaceBlank(String str) {  
  7.         String dest = '';  
  8.         if (str!=null) {  
  9.             Pattern p = Pattern.compile('\\s*|\t|\r|\n');  
  10.             Matcher m = p.matcher(str);  
  11.             dest = m.replaceAll('');  
  12.         }  
  13.         return dest;  
  14.     }  
  15.     public static void main(String[] args) {  
  16.         System.out.println(StringUtils.replaceBlank('just do it!'));  
  17.     }  
  18.     /*----------------------------------- 
  19.   
  20.     笨方法:String s = '你要去除的字符串'; 
  21.   
  22.             1.去除空格:s = s.replace('\\s',''); 
  23.   
  24.             2.去除回車:s = s.replace('\n',''); 
  25.   
  26.     這樣也可以把空格和回車去掉,,其他也可以照這樣做。 
  27.   
  28.     注:\n 回車(\u000a)  
  29.     \t 水平制表符(\u0009)  
  30.     \s 空格(\u0008)  
  31.     \r 換行(\u000d)*/  
  32. }  

StringBuffer 和StringBuilder中的兩個(gè)函數(shù):

Java代碼  收藏代碼
  1. //int indexOf(String str) :返回當(dāng)前StringBuffer對象中,,第一個(gè)滿足str子串的位置,。  
  2. //int indexOf(String str, int fromIndex) :從fromIndex開始查找,返回第一個(gè)滿足str子串的位置。  
  3.           
  4. StringBuffer sb = new StringBuffer('This is a StringBuffer!');  
  5. System.out.println('sb.indexOf(\'is\') = ' + sb.indexOf('is'));  //2  
  6. System.out.println('sb.indexOf(\'is\', 4) = ' + sb.indexOf('is', 4));   //5  
  7. System.out.println('sb.indexOf(\'is\', 4) = ' + sb.indexOf('is', 7));   // -1  
  8.           
  9. //StringBuffer insert(int offset, String str)  
  10. //在當(dāng)前StringBuffer對象中插入一個(gè)元素,,在索引號offset處插入相應(yīng)的值,。    
  11.         
  12. StringBuffer sf = new StringBuffer('..{..}) public class ESBYSYSInquiryMachineInfoSrvRequest {');  
  13. int classIdx = sf.indexOf('public class ');  
  14. if(classIdx > 0){  
  15.       sf.insert(sf.indexOf('{', classIdx), ' implements java.io.Serializable');  
  16. }  
  17. System.out.println(sf.toString());  
  18. //..{..}) public class ESBYSYSInquiryMachineInfoSrvRequest  implements java.io.Serializable{  

 2.保留2位小數(shù):

Java代碼  收藏代碼
  1. import java.text.DecimalFormat;  
  2. DecimalFormat df=new DecimalFormat('0.00');  
  3. Double x = 83.3333333333;  
  4. x=Double.parseDouble(df.format(x));   

 3.group by 和 order by

Java代碼  收藏代碼
  1. ORDER BY 用于對數(shù)據(jù)按指定的列和方法排序。  
  2.   
  3. select * from syscolumns order by id asc, colorder desc;  
  4. 指示查詢出的結(jié)果 按 id 正序排列,, colOrder 逆序排列,。  
  5.   
  6. GROUP BY 用于匯總統(tǒng)計(jì)。 HAVING 用途和 WHERE類似,,但用于對 GROUP BY 的結(jié)果進(jìn)行過濾,。  
  7. select id, count(id) from syscolumns group by id;  
  8. 這條語句以 id 進(jìn)行匯總,統(tǒng)計(jì)出每個(gè)不同的 id 出現(xiàn)的個(gè)數(shù),。  
  9.   
  10. select id, count(id) from syscolumns group by id having count(1) > 10;  
  11. 這條語句以 id 進(jìn)行匯總,,統(tǒng)計(jì)出每個(gè)不同的 id 出現(xiàn)的個(gè)數(shù),但 having 后的條件指定了只顯示 count(id) 大于 10 的數(shù)據(jù),。,。  
  12.   
  13. 先Group by ,后 Order by  

 4.日期

獲取當(dāng)前時(shí)間:

Java代碼  收藏代碼
  1. 1.  
  2. SimpleDateFormat tempDate = new SimpleDateFormat('yyyy-MM-dd' + ' ' + 'hh:mm:ss');  
  3. String datetime = tempDate.format(new java.util.Date());  
  4.   
  5. 2.  
  6. Calendar now=Calendar.getInstance();  
  7. String time=now.get(Calendar.YEAR)+'-'+(now.get(Calendar.MONTH)+1)+'-'+now.get(Calendar.DAY_OF_MONTH)+' '+now.get(Calendar.HOUR_OF_DAY)+':'+now.get(Calendar.MINUTE)+':'+now.get(Calendar.SECOND);  
  8.    
  9.   
  10. 3.Date curDate= new Date(System.currentTimeMillis());  
  1. SimpleDateFormat format = new  SimpleDateFormat( 'yyyy-MM-dd HH:mm:ss' ); //24小時(shí)制   
  2. SimpleDateFormat format = new SimpleDateFormat('yyyy-MM-dd hh:mm:ss');//12小時(shí)制   

  a.獲取年,、月,、日:

Java代碼  收藏代碼
  1. String year=String.valueOf(c.get(Calendar.YEAR));  
  2. String month=String.valueOf(c.get(Calendar.MONTH)+1);             
  3. String day=String.valueOf(c.get(Calendar.DAY_OF_MONTH));  

b.Calendar和Date的轉(zhuǎn)化

(1) Calendar轉(zhuǎn)化為Date

Java代碼  收藏代碼
  1. Calendar cal=Calendar.getInstance();  
  2. Date date=cal.getTime();   

 
(2) Date轉(zhuǎn)化為Calendar

Java代碼  收藏代碼
  1. Date date=new Date();  
  2. Calendar cal=Calendar.getInstance();  
  3. cal.setTime(date);   

c.計(jì)算一年中的第幾星期

(1)計(jì)算某一天是一年中的第幾星期

Java代碼  收藏代碼
  1. Calendar cal=Calendar.getInstance();  
  2. cal.set(Calendar.YEAR, 2006);  
  3. cal.set(Calendar.MONTH,1);  
  4. cal.set(Calendar.DAY_OF_MONTH, 3);  
  5. int weekno=cal.get(Calendar.WEEK_OF_YEAR);  

(2)計(jì)算一年中的第幾星期是幾號

Java代碼  收藏代碼
  1. SimpleDateFormat df=new SimpleDateFormat('yyyy-MM-dd');  
  2. Calendar cal=Calendar.getInstance();  
  3. cal.set(Calendar.YEAR, 2006);  
  4. cal.set(Calendar.WEEK_OF_YEAR, 1);  
  5. cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  
  6. System.out.println(df.format(cal.getTime()));  
  7. 輸出:  
  8. 2006-01-02   

 d:

  1天內(nèi)(注意為add ):

Java代碼  收藏代碼
  1. Calendar c=Calendar.getInstance();            
  2. c.add(Calendar.DAY_OF_MONTH, -1);  //得到前一天的時(shí)間  
  3. startDateStr=sf.format(c.getTime());  
  4.   
  5. endDateStr=sf.format(java.util.Calendar.getInstance().getTime()); 推薦使用這種方法獲取當(dāng)前時(shí)間,不推薦使用new Date()  

  3天內(nèi):

Java代碼  收藏代碼
  1. Calendar c=Calendar.getInstance();            
  2. c.add(Calendar.DAY_OF_MONTH, -3);  //得到前3天的時(shí)間  
  3. startDateStr=sf.format(c.getTime());  

  近1月:

Java代碼  收藏代碼
  1. Calendar c=Calendar.getInstance();  
  2. c.add(Calendar.MONTH, -1);  
  3. startDateStr=sf.format(c.getTime());          

 到當(dāng)前時(shí)間的前幾年的時(shí)間:

Java代碼  收藏代碼
  1. Calendar   c   =   Calendar.getInstance();     
  2.  c.add(Calendar.YEAR, -5);//得到前5年    
  3.  SimpleDateFormat formatter = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');    
  4.  String mDateTime=formatter.format(c.getTime());    
  5.  String strStart=mDateTime.substring(0, 16);//2002-10-24 09:30   

本月(注意為set ):

Java代碼  收藏代碼
  1. Calendar c=Calendar.getInstance();  
  2. c.set(Calendar.DATE,1); //把日期設(shè)為當(dāng)月第一天                  
  3. startDateStr=sf.format(c.getTime());          

 上月:

Java代碼  收藏代碼
  1. Calendar c2=Calendar.getInstance();  
  2.  c2.add(Calendar.MONTH,-1);  
  3.  c2.set(Calendar.DATE,1);             
  4.  startDateStr=sf.format(c2.getTime());  

5.文本域input的不可編輯屬性 disabled 和  readonly  區(qū)別

都可以實(shí)現(xiàn)都可以實(shí)現(xiàn)input的不可編輯,,但有區(qū)別...


disable 屬性 -- 表示已經(jīng)失效的輸入域

readonly 屬性 -- 表示只讀(只能看到,不能修改)的輸入域(框)
Java代碼  收藏代碼
  1. <input type='checkbox' value='2'  name='fav' disabled='disabled' />  
  2.   
  3. <input type='text'  name='notinput' readonly='readonly' />   
Java代碼  收藏代碼
  1.  /**是否閏年   
  2.   */    
  3. public boolean isLeapYear(int year) {  
  4.     return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);     }  

 具體日期操作:

http://bbzoh.cn/content/09/0820/17/236102_5085810.shtml

可將選中的代碼拖動(dòng)到QQ聊天窗口中復(fù)制

6.File協(xié)議

   表示本地文件傳輸協(xié)議,,F(xiàn)ile協(xié)議主要用于訪問本地計(jì)算機(jī)中的文件 ,就如同在Windows資源管理器中打開文件一樣,。
   應(yīng)用:要使用File協(xié)議,,基本的格式如下:file:///文件路徑,比如要打開F:盤flash文件夾中的1.swf文件,,那么可以在資源管理器或IE地址欄中鍵入:file:///f:/flash/1.swf并回車,。

3個(gè)斜杠代表本地

8.substring(int beginIndex, int endIndex)

該子字符串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字符,。因此,,該子字符串的長度為 endIndex-beginIndex。
    示例:
         'hamburger'.substring(4, 8) returns 'urge'
         'smiles'.substring(1, 5) returns 'mile
    參數(shù):
        beginIndex - 起始索引(包括),。
        endIndex - 結(jié)束索引(不包括) ,。

9.什么時(shí)候用Thread.getContextClassLoader()

     需要?jiǎng)討B(tài)加載很多類和資源的時(shí)候 .

       通常當(dāng)你需要?jiǎng)討B(tài)加載資源的時(shí)候 , 你至少有三個(gè) ClassLoader 可以選擇 :

2        系統(tǒng)類加載器或叫作應(yīng)用類加載器 (system classloader or application classloader)

2        當(dāng)前類加載器

2        當(dāng)前線程類加載器

10.instanceof 運(yùn)算符
指出對象是否是特定類的一個(gè)實(shí)例。

Java代碼  收藏代碼
  1. String s = 'I AM an Object!';  
  2. boolean isObject = s instanceof Object;  
  3.   
  4. public double calculate(Bill bill) {  
  5.   if (bill instanceof PhoneBill) {  
  6.   //計(jì)算電話賬單  
  7.   }  
  8. }  

 11,、java環(huán)境配置(都放下面):

CLASSPATH   .;%JAVA_HOME%\lib

JAVA_HOME   C:\Program Files\Java\jdk1.6.0_22

Path  .;%JAVA_HOME%\bin

13.JDK1.5的新特性

“JDK1.5”(開發(fā)代號猛虎)的一個(gè)重要主題就是通過新增一些特性來簡化開發(fā) ,,這些特性包括泛型,for-each循環(huán),,自動(dòng)裝包/拆包,,枚舉,,可變參數(shù), 靜態(tài)導(dǎo)入 。使用這些特性有助于我們編寫更加清晰,,精悍,,安全的代碼。

自動(dòng)裝包/拆包

自動(dòng)裝包/拆包大大方便了基本類型數(shù)據(jù)和它們包裝類地使用,。
自動(dòng)裝包:基本類型自動(dòng)轉(zhuǎn)為包裝類.(int >> Integer)
自動(dòng)拆包:包裝類自動(dòng)轉(zhuǎn)為基本類型.(Integer >> int)
在JDK1.5之前,,我們總是對集合不能存放基本類型而耿耿于懷,現(xiàn)在自動(dòng)轉(zhuǎn)換機(jī)制解決了我們的問題,。

在實(shí)際開發(fā)過程中,,我們經(jīng)常會遇到需要使用對象,而不是內(nèi)置數(shù)據(jù)類型的情形,。為了解決這個(gè)問題,,Java語言為每一個(gè)內(nèi)置數(shù)據(jù)類型提供了對應(yīng)的包裝類。

所有的包裝類(Integer,、Long,、Byte、Double,、Float,、Short)都是抽象類Number的子類。


 

這里Integer先自動(dòng)轉(zhuǎn)換為int進(jìn)行加法運(yùn)算,,然后int再次轉(zhuǎn)換為Integer.

Java代碼  收藏代碼
  1. int a = 3;  
  2. Collection c = new ArrayList();  
  3. c.add(a);//自動(dòng)轉(zhuǎn)換成Integer.  
  4.   
  5. Integer b = new Integer(2);  
  6. c.add(b + 2);  

 枚舉:

Java代碼  收藏代碼
  1. public enum Color  
  2. {  
  3.    Red,  
  4.    White,  
  5.    Blue  
  6. }  

 然后可以這樣來使用Color myColor = Color.Red.
枚舉類型還提供了兩個(gè)有用的靜態(tài)方法values()和valueOf(). 我們可以很方便地使用它們,,例如

Java代碼  收藏代碼
  1. for (Color c : Color.values())  
  2.    System.out.println(c);  

帶構(gòu)造函數(shù)的枚舉:

Java代碼  收藏代碼
  1. public enum Color {  
  2.   
  3.     RED('紅色'),BLUE('藍(lán)色'),GREEN('綠色');  
  4.       
  5.     private final String name;  
  6.   
  7.     public  String getName() {  
  8.         return name;  
  9.     }  
  10.     private Color(String name){  
  11.         this.name=name;  
  12.     }  
  13. }  
Java代碼  收藏代碼
  1. System.out.println('Color.RED.name():'+Color.RED.name());         //RED  
  2. System.out.println('Color.RED.toString():'+Color.RED.toString()); //RED  
  3. System.out.println(Color.RED.getName());    //紅色  

 Color.RED.name()

 Color.RED.toString(); 得到的都是RED

1、Color枚舉類是特殊的class,,其枚舉值(RED,BLUE...)是Color的類對象(類實(shí)例):Color c=Color.RED ;
而且這些枚舉值都是public static final的,,也就是我們經(jīng)常所定義的常量,,因此枚舉類中的枚舉值最好全部大寫 ,。
2、即然枚舉類是class,,當(dāng)然在枚舉類型中有構(gòu)造器,,方法和數(shù)據(jù)域。但是,,枚舉類的構(gòu)造器有很大的不同:
(1) 構(gòu)造函數(shù)只是在構(gòu)造枚舉值的時(shí)候被調(diào)用,。
(2) 枚舉構(gòu)造函數(shù)只能私有private ,絕對不允許有public構(gòu)造器,。這樣可以保證外部代碼無法新構(gòu)造枚舉類的實(shí)例,。因?yàn)槲覀冎烂杜e值是public static final的常量而已 但枚舉類的方法和數(shù)據(jù)域可以允許外部訪問。
Java代碼  收藏代碼
  1. /** 
  2.  *  
  3.  * 服務(wù)器類型 
  4.  *  
  5.  */  
  6. public enum ServerType {  
  7.       
  8.     JBoss('server/default/deploy','client,common'), WebLogic('',''), GlassFish('','');  
  9.       
  10.     private String deployPath;  
  11.       
  12.     private String libClassPath;  
  13.       
  14.     private ServerType(String deployPath, String libClassPath){  
  15.         this.deployPath = deployPath;  
  16.         this.libClassPath = libClassPath;  
  17.     }  
  18.       
  19.     public String getDeployPath(){  
  20.         return this.deployPath;  
  21.     }  
  22.       
  23.     public String getLibClassPath(){  
  24.         return this.libClassPath;  
  25.     }  
  26. }  

 ServerType serverType = ServerType.JBoss;

String deployPath = serverType.getDeployPath();
String libClassPath = serverType.getLibClassPath();

可變參數(shù):

當(dāng)不能確定一個(gè)方法的入口參數(shù)的個(gè)數(shù)時(shí),,以往版本的Java中,,通常的做法是將多個(gè)參數(shù)放在一個(gè)數(shù)組或者對象集合中作為參數(shù)來傳遞,,1.5版本以前的寫法是:

Java代碼  收藏代碼
  1. int sum(Integer[] numbers)    
  2. {    
  3.   int nSum = 0;    
  4.   for(int i: numbers)    
  5.   nSum += i;    
  6.   return nSum;    
  7. }  

 在別處調(diào)用該方法  
sum(new Integer[] {12,13,20});

而在1.5版本中可以寫為:

Java代碼  收藏代碼
  1. public static int sum(Integer... number){  
  2.     int nSum=0;  
  3.     for(int i : number){  
  4.         nSum+=i;  
  5.     }         
  6.     return nSum;          
  7. }  

 在別處調(diào)用該方法

Java代碼  收藏代碼
  1. System.out.println('sum():'+sum(12,13,14));  
  2. System.out.println('sum():'+sum(12,13));  

靜態(tài)導(dǎo)入

要使用靜態(tài)成員(方法和變量)我們必須給出提供這個(gè)方法的類。使用靜態(tài)導(dǎo)入可以使被導(dǎo)入類的所有靜態(tài)變量和靜態(tài)方法在當(dāng)前類直接可見,,使用這些靜態(tài)成員無需再給出他們的類名,。
不過,過度使用這個(gè)特性也會一定程度上降低代碼地可讀性,。

Java代碼  收藏代碼
  1. import static java.lang.Math.*;  
  2. …….  
  3. r = sin(PI * 2); //無需再寫r = Math.sin(Math.PI);  

14.o1.CompareTo(o2);

整形間比較會返回1,、-1、0

如:

Java代碼  收藏代碼
  1.     public static void main(String[] args) {  
  2.         //Integer num1;  
  3.         //num1 = new Integer('24');  
  4.         //Integer num2;  
  5.         //num2 = new Integer('34');  
  6.         Integer num2=12; //不可使用 int num2=12;因compareTo(T t)中的T是類,,所以必須用包裝類  
  7.         Integer num1=11;  
  8.         System.out.println(num2.compareTo(num1));  
  9. //1         System.out.println('------------------');  
  10.         System.out.println(num1.compareTo(num2));  
  11. //-1    }  

 字符串間比較:

       'abcd' .compareTo( 'adef' )== -2

       'abc' .compareTo( 'abcdef' )== -3

       'abc' .compareTo( 'abc' ) == 0

簡單 字符串的排序 ,。(例如使用 compareTo 進(jìn)行姓名的排序)

Java代碼  收藏代碼
  1. //需要進(jìn)行排序的字符串  
  2. String[] array = new String[] { 'lilei', 'libai', 'james', 'poly',  
  3.                 'wobfei' };  
  4. //使用簡單的循環(huán)排序  
  5.         for (int i = 0; i < array.length ; i++) {  
  6.             for (int j = i + 1; j < array.length-1; j++) {  
  7.                 if (array[i].compareTo(array[j]) > 0) {  
  8.                     String temp = array[i];  
  9.                     array[i] = array[j];  
  10.                     array[j] = temp;  
  11.                 }  
  12.             }  
  13.         }  

使用上面針對 String 的排序以后,字符串的內(nèi)容將會是:

james  libai  lilei  poly  wobfei

該例子來源(稍作了修改):http://wobfei./blog/743123

15.編碼習(xí)慣

add,、saveAdd

edit,、saveEdit

16、Math.round();

Math.round(m) = (int)Math.floor(a + 0.5f)

Math.ceil(x):比x大的最小值,。
Math.round(x):四舍五入,。
Math.floor(x):比x小的最大值。

jdk說得很明白了,,
-11.5+0.5=-11   Math.floor(-11)=-11
-11.3+0.5=-10.8   Math.floor(-10.8)=   -11
-11.8+0.5=-11.3   Math.floor(-11.3)=   -12

17,、重寫

關(guān)于重寫,遵循以下的規(guī)則:

(1)重寫方法必須和被重寫方法具有相同的參數(shù)列表,, 返回類型必須和被重寫方法的返回類型相同或者是返回類型的子類型 ,。

(2)重寫方法的訪問控制修飾符不能比被重寫方法更嚴(yán)格(比如一個(gè)在父類中聲明為public的方法重寫成一個(gè)protected的方法)。

18.

Java代碼  收藏代碼
  1. class Test {  
  2.     void test(int i) {  
  3.         System.out.println('I am an int.' + i);  
  4.     }  
  5.   
  6.     void test(String s) {  
  7.         System.out.println('I am a string.');  
  8.     }  
  9.   
  10.     public static void main(String args[]) {  
  11.         Test t = new Test();  
  12.         char ch = 'y';  
  13.         t.test(ch);  
  14.     }  
  15.     //結(jié)果為:I am an int.121  
  16. }  

19.JDBC的主要任務(wù)是什么,?(三個(gè))

1,、建立與數(shù)據(jù)庫的連接。
2,、向數(shù)據(jù)庫發(fā)起查詢請求,。
3、處理數(shù)據(jù)庫返回結(jié)果,。

20.TreeSet的構(gòu)造函數(shù)

TreeSet();

TreeSet(Collection c);//構(gòu)造一個(gè)包含指定 collection 元素的新 TreeSet,,它按照其元素的自然順序 進(jìn)行排序。

TreeSet(Comparator comparator);//構(gòu)造一個(gè)新的空 TreeSet,,它根據(jù)指定比較器進(jìn)行排序,。

Java代碼  收藏代碼
  1. public class NameComparator implements Comparator<Name>{  
  2.       
  3.     public int compare(Name n1,Name n2){  
  4.         if(n1.getName().compareTo(n2.getName())>0) return -1;  
  5.         if(n1.getName().compareTo(n2.getName())<0) return 1;  
  6.           
  7.         return 0;  
  8.     }  
  9.       
  10.     public static void main(String[] args) {  
  11.         Set<Name> set = new TreeSet<Name>(new NameComparator());  
  12.           
  13.         Name n1 = new Name('ray');  
  14.         Name n2 = new Name('tom');  
  15.         Name n3 = new Name('jame');  
  16.         set.add(n1);  
  17.         set.add(n2);  
  18.         set.add(n3);  
  19.           
  20.         Iterator it = set.iterator();  
  21.         while(it.hasNext()){  
  22.             Name s = (Name)it.next();  
  23.             System.out.print(s.getName()+',');  
  24.         }  
  25.         System.out.println('一共有對象:'+set.size()+'個(gè)');  
  26.     }  
  27. }//打印結(jié)果是:tom,ray,jame,一共有對象:3個(gè)  

 客戶端排序時(shí)因?yàn)閖ava.util.Comparator<Type>接口提供了具體的排序方式,<Type>指定了被比較對象的類型,,Comparator有個(gè)compare(Type x,Type y)的方法,,用于比較兩個(gè)對象的大小。

21.Object中的hashcode()和equals()

   在Java中任何一個(gè)對象都具備equals(Object obj)和hashcode()這兩個(gè)方法,,因?yàn)樗麄兪窃贠bject類中定義的,。
equals(Object obj)方法用來判斷兩個(gè)對象是否“相同”,,如果“相同”則返回true,否則返回false,。
hashcode()方法返回一個(gè)int數(shù),,在Object類中的默認(rèn)實(shí)現(xiàn)是“將該對象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)返回”。
    接下來有兩個(gè)個(gè)關(guān)于這兩個(gè)方法的重要規(guī)范(我只是抽取了最重要的兩個(gè),其實(shí)不止兩個(gè)):
規(guī)范1: 若重寫equals(Object obj)方法,,有必要重寫hashcode()方法,,確保通過equals(Object obj)方法判斷結(jié)果為true的兩個(gè)對象具備相等的hashcode()返回值。說得簡單點(diǎn)就是:“如果兩個(gè)對象相同,,那么他們的hashcode應(yīng)該 相等”,。不過請注意:這個(gè)只是規(guī)范,如果你非要寫一個(gè)類讓equals(Object obj)返回true而hashcode()返回兩個(gè)不相等的值,,編譯和運(yùn)行都是不會報(bào)錯(cuò)的,。不過這樣違反了Java規(guī)范,程序也就埋下了BUG,。
規(guī)范2: 如果equals(Object obj)返回false,,即兩個(gè)對象“不相同”,并不要求對這兩個(gè)對象調(diào)用hashcode()方法得到兩個(gè)不相同的數(shù),。說的簡單點(diǎn)就是:“如果兩個(gè)對象不相同,,他們的hashcode可能相同”。
     根據(jù)這兩個(gè)規(guī)范,,可以得到如下推論:
1,、如果兩個(gè)對象equals,Java運(yùn)行時(shí)環(huán)境會認(rèn)為他們的hashcode一定相等 ,。
2,、如果兩個(gè)對象不equals,他們的hashcode有可能 相等,。
3,、如果兩個(gè)對象hashcode相等,他們不一定 equals,。
4,、如果兩個(gè)對象hashcode不相等,他們一定不 equals,。

http://www./topic/800929

22.序列化

序列化的對象要實(shí)現(xiàn)Serializable接口,
Serializable接口沒有需要實(shí)現(xiàn)的方法,
implements Serializable只是為了標(biāo)注該對象是可被序列化的,,
然后
使用一個(gè)輸出流(如:FileOutputStream)來構(gòu)造一個(gè)ObjectOutputStream(對象流)對象 ,,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),,要恢復(fù)的話則用輸入流,。

實(shí)現(xiàn)序列化(保存到一個(gè)文件)的步驟
a)Make a FileOutputStream            
      FileOutputStream fs = new FileOutputStream('foo.ser');    
b)Make a ObjectOutputStream          
      ObjectOutputStream os =  new ObjectOutputStream(fs);   
c)write the object
     os.writeObject(myObject1);  
     o s.writeObject(myObject2);  
     os.writeObject(myObject3);  
d) close the ObjectOutputStream
     os.close();  

23,、計(jì)劃任務(wù):

java.util.Timer

timer.schedule(...);

http://www./georgehill/archive/2005/06/09/5793.aspx

http://www./post/187.html

24.Split

在java.lang包中有String.split()方法,返回是一個(gè)數(shù)組
我在應(yīng)用中用到一些,,給大家總結(jié)一下,,僅供大家參考:
1、如果用“.”作為分隔的話,,必須是如下寫法:String.split('\\.'),這樣才能正確的分隔開,,不能用String.split('.');
2、如果用“|”作為分隔的話,,必須是如下寫法:String.split('\\|'),這樣才能正確的分隔開,,不能用String.split('|');
“.”和“|”都是轉(zhuǎn)義字符,必須得加'\\';
3,、如果在一個(gè)字符串中有多個(gè)分隔符,,可以用“|”作為連字符,比如:“acount=? and uu =? or n=?”,把三個(gè)都分隔出來,,可以用String.split('and|or');

java轉(zhuǎn)義字符

     \':雙引號 
     \':單引號 
     \\:反斜線

25.作用范圍:

this.context.setAttribute(MyConstants.CONTINENTS_KEY, continentlist);
public static final String CONTINENTS_KEY='CONTINENTS';
jsp頁面中可以直接使用 CONTINENTS(${CONTINENTS }) ,,而無需context.getAttribute('');

Java代碼  收藏代碼
  1. <body>  
  2.   <% request.setAttribute('name','xiaoming') ;%>      
  3.   <input type='text' value='${name}'/>  
  4. </body>  

26.數(shù)組轉(zhuǎn)為list

Java代碼  收藏代碼
  1. List stooges = Arrays.asList('Larry', 'Moe', 'Curly');    

  此時(shí)stooges中有有三個(gè)元素。注意:此時(shí)的list不能進(jìn)行add操作,,否則會報(bào) “java.lang.UnsupportedOperationException”,,Arrays.asList()返回的是List,而且是一個(gè)定長的List,所以不能轉(zhuǎn)換為ArrayList,,只能轉(zhuǎn)換為AbstractList
 原因在于asList()方法返回的是某個(gè)數(shù)組的列表形式,返回的列表只是數(shù)組的另一個(gè)視圖,而數(shù)組本身并沒有消失,對列表的任何操作最終都反映在數(shù)組上. 所以不支持remove,add方法的

Java代碼  收藏代碼
  1. String[] arr = {'1', '2'};    
  2. List list = Arrays.asList(arr);    

其他方式:

Java代碼  收藏代碼
  1. String[] strArray = new String[] { 'aa', 'bb' };  
  2.         List<String> list = new ArrayList<String>(Arrays.asList(strArray));  
  3.         list.add('cc');  
  4.         System.out.println(list);  

 結(jié)果:[aa, bb, cc]

27,、使用ResourceBundle讀取properties文件

有時(shí)候有些簡單的配置文件可以沒必要使用xml,其實(shí)ResourceBundle類就已經(jīng)做的很好的,。它甚至可以搜索到classpath里的jar文件中一些properties文件,。

例如在jar文件中的根目錄放置一個(gè)文件:test.properties,然后只要這個(gè)jar文件在classpath里,。就可以使用這樣的語句來獲得一些屬性:

Java代碼  收藏代碼
  1. ResourceBundle rb = ResourceBundle.getBundle('test');  
  2.   String s = rb.getString('FirstKey');  
  3.   System.out.println(s);  

  28,、HttpClient學(xué)習(xí)

Java代碼  收藏代碼
  1. public class TestHttpClient {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String url = 'http://images./HH/Images/HX/HKGA/HKGA-REG-1.jpg|http://images./HH/Images/HX/HKGA/HKGA-REG-2.jpg';  
  5.         String[] urlArr = url.split('\\|');  
  6.         String fileName = 'D:\\httpClient';       
  7.           
  8.         HttpClient client = new HttpClient();        
  9.         GetMethod method = new GetMethod(urlArr[1]);          
  10.             // 使用 GET 方法 ,如果服務(wù)器需要通過 HTTPS 連接,,那只需要將下面 URL 中的 http 換成 https   
  11.           
  12.         FileOutputStream output = null;  
  13.         try {  
  14.             client.executeMethod(method);  
  15.             File showFile = new File(fileName + '.jpg');              
  16.               
  17.             output = new FileOutputStream(showFile);  
  18.             output.write(method.getResponseBody()); //method.getResponseBody()為byte[]類型  
  19.             output.flush();  
  20.         } catch (HttpException e) {           
  21.         } catch (IOException e) {             
  22.         } finally {           
  23.             if (output != null) {  
  24.                 try {  
  25.                     output.close();  
  26.                     output = null;  
  27.                 } catch (IOException e) {                     
  28.                 }  
  29.             }  
  30.         }  
  31.     }  
  32. }  

http://www./Alpha/archive/2007/01/22/95216.html

29,、棧、堆

1.寄存器:最快的存儲區(qū), 由編譯器根據(jù)需求進(jìn)行分配,我們在程序中無法控制.
2. 棧:存放基本類型的變量數(shù)據(jù)和對象的引用,,但對象本身不存放在棧中,,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)
3. 堆:存放所有new出來的對象,。
4.
靜態(tài)域 :存放靜態(tài)成員(static定義的)
5.
常量池 :存放字符串常量基本類型常量(public static final),。
6. 非RAM存儲:硬盤等永久存儲空間
這里我們主要關(guān)心棧,堆和常量池,,對于
棧和常量池中的對象可以共享,,對于堆中的對象不可以共享,。棧中的數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),,這個(gè)數(shù)據(jù)就會消失,。堆中的對象的由垃圾回收器負(fù)責(zé)回收,因此大小和生命周期不需要確定 ,,具有很大的靈活性,。
對于字符串:其對象的引用都是存儲在棧中的,如果是
編譯期已經(jīng)創(chuàng)建好(直接用雙引號定義的)的就存儲在常量池中,,如果是運(yùn)行期(new出來的)才能確定的就存儲在堆中 ,。對于equals相等的字符串,在常量池中永遠(yuǎn)只有一份,,在堆中有多份,。

new String('China');
對于通過new產(chǎn)生一個(gè)字符串(假設(shè)為”china”)時(shí),會先去常量池中查找是否已經(jīng)有了”china”對象,,如果沒有則在常量池中創(chuàng)建一個(gè)此字符串對象,,然后堆中再創(chuàng)建一個(gè)常量池中此”china”對象的拷貝對象。這也就是有道面試題:String s = new String(“xyz”);產(chǎn)生幾個(gè)對象,?一個(gè)或兩個(gè),,如果常量池中原來沒有”xyz”,就是兩個(gè)。

對于成員變量和局部變量:成員變量就是方法外部,,類的內(nèi)部定義的變量,;局部變量就是方法或語句塊內(nèi)部定義的變量。局部變量必須初始化,。
形式參數(shù)是局部變量,,局部變量的數(shù)據(jù)存在于棧內(nèi)存中 。棧內(nèi)存中的局部變量隨著方法的消失而消失,。
成員變量存儲在堆中的對象里面 ,,由垃圾回收器負(fù)責(zé)回收

http://www./topic/634530

30.try-catch

Java代碼  收藏代碼
  1. public class Test {    
  2.     
  3.     public static void main(String[] args) {     
  4.         System.out.println('return value of getValue(): ' + getValue());     
  5.     }     
  6.     
  7.        public static int getValue() {     
  8.         int i = 1;     
  9.         try {     
  10.                  return i;     
  11.         } finally {     
  12.             System.out.println('i :  finally');    
  13.             ++i;     
  14.         }     
  15.     }     
  16.     
  17. }  
Java代碼  收藏代碼
  1. public static boolean get() {    
  2.      try {    
  3.             return  false;    
  4.      } finally {    
  5.             return  true;    
  6.      }    
  7.  }   

 在try中的return真正返回之前 ,會將false保存到一個(gè)臨時(shí)變量(假設(shè)為var)中 ,,然后執(zhí)行finally,,在執(zhí)行finally子句的任何語句之前,會將var中的值取出,,如果finally中沒有拋出異?;騬eturn、break,、continue等語句,,則在finally執(zhí)行完后返回var (相當(dāng)于返回去完成try中return的執(zhí)行),如果finally中有return,,var值會被覆蓋 ,,返回結(jié)果是finllay子句中 return的值,如果是異?;騜reak,、continue等則執(zhí)行相應(yīng)的操作而不是返回。更詳細(xì)解釋參考JVM規(guī)范或《深入理解JAVA虛擬機(jī)(第二版)》,。

其實(shí)相當(dāng)于值傳遞

結(jié)果:1    true

31,、返回一個(gè)n位隨機(jī)數(shù)

random.nextInt(n)

返回0~n 間的整數(shù),包括0,不包括n

Java代碼  收藏代碼
  1. public static String getRandStr(int n){    
  2.         Random random = new Random();    
  3.         String sRand = '';    
  4.         for (int i = 0; i < n; i++) {    
  5.             String rand = String.valueOf(random.nextInt(10));    
  6.             sRand += rand;    
  7.         }    
  8.         return sRand;     
  9.     }   

 getRandStr(4)可返回一個(gè)4為數(shù)

32,、java中的main方法

String args[]保存的是 JAVA運(yùn)行時(shí)傳遞給所運(yùn)行類的參數(shù),你這個(gè)類需要參數(shù)就傳,不需要就不傳.

Java代碼  收藏代碼
  1. public class TestMain{  
  2.     public static void main(String args[]){  
  3.         for(int i=0;i<args.length;i++){  
  4.             System.out.println(args[i]);  
  5.         }  
  6.     }  
  7. }  

 
接著用java TestMain first second運(yùn)行
結(jié)果:
first
second

args實(shí)際上是個(gè)變量,。它用來存儲你用命令后執(zhí)行.class文件時(shí)后面跟的參數(shù)。args是可以變的,,你可以變?yōu)槟阆矚g的任意標(biāo)識符,。
普通方法其實(shí)可以不給,只是你在設(shè)計(jì)方法的時(shí)候要給一個(gè)不傳參數(shù)的方法,。

注意:

1,、其返回類型應(yīng)該為void

2、必須為公共方法

寫道
6. 哪一個(gè)對單機(jī)程序中的main()方法的聲明是錯(cuò)誤的,?(多選)DE

a. public static void main()
b. public static void main(String[] string)
c. public static void main(string args)
d. static public int main(String[] args)
e.static void main(String[] args)

33,、Map遍歷

Java代碼  收藏代碼
  1. for(Map.Entry<String, String>  entry : map.entrySet()){       
  2.     System.out.println(entry.getKey()+'--->'+entry.getValue());       
  3. }    

34、for循環(huán)

for語句的格式為:

  for (初始化語句; 條件語句; 控制語句)
  {
    語句1 ;
    語句2 ;
    ....

    語句n ;
  }

   for 語句的執(zhí)行順序是:首先執(zhí)行“初始化語句”,;然后測試“條件語句”,;若條件成立,則執(zhí)行語句1到語句n,;然后執(zhí)行“控制”語句,;接著再測試條件語句是否成立,如果成立則重復(fù)執(zhí)行以上過程,,直至條件不成立時(shí)才結(jié)束for循環(huán),。

35、 Java 內(nèi)存模型

2.1 Java 內(nèi)存模型的基本原理

Java 內(nèi)存模型,,由于 Java 被設(shè)計(jì)為跨平臺的語言,,在內(nèi)存管理上,顯然也要有一個(gè)統(tǒng)一的 模型,。系統(tǒng)存在一個(gè)主內(nèi)存 (Main Memory) ,, Java 中所有變量都儲存在主存中,對于所有線程都是共享的,。每條線程都有自己的工作內(nèi)存 (Working Memory) ,,工作內(nèi)存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內(nèi)存中進(jìn)行,線程之間無法相互直接訪問,,變量傳遞均需要通過主存完成,。

因?yàn)楫?dāng)線程處于不同的cpu中時(shí),它各自的變量保存在各自cpu的寄存器或者高速緩存中,,這樣回事的變量對于其它線程暫時(shí)不可見,。

2.2 Volatile 的內(nèi)存工作原理

Volatile 是保證多個(gè)線程之間變量可見性的,也就是說一個(gè)線程對變量進(jìn)行了寫操作,,另外一個(gè)線程能夠獲取它最新的值,。

它的工作原理是,它對寫和讀都是直接操作工作主存的,。(這個(gè)可以通過操作字節(jié)碼看到)

2.3 Synchronized 的內(nèi)存操作模型 :

Synchronized, 有兩層語義,,一個(gè)是互斥,一個(gè)是可見性,。在可見性上面,,它的工作原理有點(diǎn)不同:當(dāng)線程進(jìn)入同步塊時(shí),會從主存里面獲取最新值,,然后當(dāng)線程離開同步塊時(shí),,再把變量的值更新到主存。

http://tomyz0223./blog/1001778

36.刪除一個(gè)文件夾內(nèi)的所有文件和文件夾

Java代碼  收藏代碼
  1. File file = new File(imgPath);  
  2. if (!file.exists()) return;  
  3. deleteDirectory(file);  
  4.   
  5.   
  6. public void deleteDirectory(File path) {  
  7.             if( path.exists() ) {  
  8.                   File[] files = path.listFiles();  
  9.                   for(int i=0; i<files.length; i++) {  
  10.                          if(files[i].isDirectory()) {  
  11.                            deleteDirectory(files[i]);  
  12.                          }  
  13.                          else {  
  14.                            files[i].delete();  
  15.                          }  
  16.                   }  
  17.             }  
  18.       }  

37,、關(guān)于JSP中的pageContext:

使用pageContext所設(shè)定的屬性對象,,其共享范圍限于同一個(gè)JSP頁面

使用request所設(shè)定的屬性對象,,其在同一個(gè)request處理期間可以共享(包括forward給其它JSP頁面),,

session對象所設(shè)定的屬性對象則限于同一個(gè)進(jìn)程作用期間可以共享,

而application對象所設(shè)定的屬性,,則在整個(gè)Web應(yīng)用程序中的JSP頁面都可以共享,。

 38,F(xiàn)inal的初始化

 1.  final修飾的成員變量沒有默認(rèn)值
2.  final初始化可以在三個(gè)地方
    (1)聲明的時(shí)候初始化
    (2)構(gòu)造函數(shù)里初始化
    (3)要是沒有static修飾的話可以在非靜態(tài)塊里初始化,要是有static修飾的話可以在靜態(tài)塊里初始化
3.  使用final成員前要確保已經(jīng)初始化,,如果沒初始化,,或者初始化多次,則無法通過編譯,。

 39,、一些轉(zhuǎn)換技巧

Java代碼  收藏代碼
  1. Map<String, HandlerMapping> matchingBeans =  
  2.                 BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);  
  3.   
  4.     //map轉(zhuǎn)換list  
  5.     List<HandlerMapping> handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());  
  6.       
  7.     //map判斷空  
  8.     if (!matchingBeans.isEmpty())  
  9.       
  10.     //數(shù)組轉(zhuǎn)List (interceptors 數(shù)組)  
  11.     interceptorList.addAll(Arrays.asList(this.interceptors));  
  12.       
  13.     //List轉(zhuǎn)指定對象數(shù)組  
  14.     interceptors = this.interceptorList.toArray(new HandlerInterceptor[this.interceptorList.size()]);  

40、java.lang.Number是所有基礎(chǔ)類型的父類

Java代碼  收藏代碼
  1. public abstract class Number implements java.io.Serializable {  
  2.       
  3.     public abstract int intValue();  
  4.       
  5.     public abstract long longValue();  
  6.       
  7.     public abstract float floatValue();  
  8.       
  9.     public abstract double doubleValue();  
  10.       
  11.     public byte byteValue() {  
  12.     return (byte)intValue();  
  13.     }  
  14.       
  15.     public short shortValue() {  
  16.     return (short)intValue();  
  17.     }  
  18. }  
Java代碼  收藏代碼
  1. public final class Long extends Number implements Comparable<Long>   
  2.   
  3. public final class Integer extends Number implements Comparable<Integer>   

 41,、JDK,、JRE、JVM

JDK:Java Development ToolKit

Java開發(fā)工具包

JRE:Java Runtime Environment

Java運(yùn)行環(huán)境

JVM:Java Virtual Machine

Java虛擬機(jī)

JDK是SUN公司發(fā)布的用于開發(fā)Java程序的工具包

在它的bin目錄下有很多工具,,常見的包括:javac.exe,java.exe,javadoc.exe等(其中有很多都是用Java編寫的)各種版本的IDE工具也是需要使用JDK來完成編譯,,打包,運(yùn)行等各種功能的。

JRE顧名思義,,java的運(yùn)行環(huán)境

JDK是開發(fā)工具,,在它的安裝目錄下包含了JRE目錄,其實(shí)在安裝JDK時(shí)(1.4版本以上),,有一個(gè)安裝選項(xiàng),,如果勾上時(shí),,在Java的安裝目錄下會多一個(gè)JRE目錄,,這里的JRE與JDK下的JRE目錄基本上是完全一致的,那么為什么需要兩個(gè)JRE呢,?

前 面已經(jīng)提到 過,,JDK的bin目錄下的很多工具都是用Java編寫的,使用這些工具的時(shí)候也是需要運(yùn)行環(huán)境的,,通過這些.exe包裝器(這些包裝器提供了尋找 tools.jar中的一些java類的快捷方法,,不需要輸入一長串的包名和類名)來使用那些工具時(shí),java會自動(dòng)尋找父目錄下的JRE,,所以在這里放 置了JRE,。

JVM:Java虛擬機(jī),在window下作為動(dòng)態(tài)連接庫(jvm.dll)存在,,用于解釋執(zhí)行Java字節(jié)碼,。

可以把它理解成是專門用來執(zhí)行Java程序的一臺機(jī)器。也就是說JVM提供了Java執(zhí)行的硬件平臺,。JVM上執(zhí)行的代碼都存放在.CLASS文件中,。JVM只執(zhí)行字節(jié)碼文件。

 42,、finalize()

Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作,。

這個(gè)方法是由垃圾收集器在確定這個(gè)對象沒有被引用時(shí)對這個(gè)對象調(diào)用的。它是在 Object 類中定義的,,因此所有的類都繼承了它,。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。

finalize() 方法是在垃圾收集器刪除對象之前對這個(gè)對象調(diào)用的,。

垃圾收集器只知道釋放那些由new分配的內(nèi)存,,所以不知道如何釋放對象的“特殊”內(nèi)存。為解決這個(gè)問題

Java提供了一個(gè)名為finalize()的方法,,它的工作原理應(yīng)該是這樣的:一旦垃圾收集器準(zhǔn)備好釋放對象占用的存儲空間,,它首先調(diào)用finalize(),而且只有在下一次垃圾收集過程中,,才會真正回收對象的內(nèi)存,。

所以如果使用finalize(),就可以在垃圾收集期間進(jìn)行一些重要的清除或清掃工作(如關(guān)閉流等操作)。但JVM(Java虛擬機(jī))不保證此方法總被調(diào)用,。

43,、原子操作AtomicInteger

Java代碼  收藏代碼
  1. public class AtomicLong extends Number  
  2.                 implements Serializable  

API 

J2SE 5.0提供了一組atomic class來幫助我們簡化同步處理

基本工作原理是使用了同步synchronized的方法實(shí)現(xiàn)了對一個(gè)long, integer, 對象的增,、減,、賦值(更新)操作. 比如對于++運(yùn)算符, AtomicInteger可以將它持有的integer 能夠atomic 地遞增。在需要訪問兩個(gè)或兩個(gè)以上 atomic變量的程序代碼(或者是對單一的atomic變量執(zhí)行兩個(gè)或兩個(gè)以上的操作)通常都需要被synchronize以便兩者的操作能夠被當(dāng)作是 一個(gè)atomic的單元,。 

Java代碼  收藏代碼
  1. addAndGet(long delta)   
  2.     //以原子方式將給定值添加到當(dāng)前值,。  
  3.   
  4. getAndSet() :   
  5.     //設(shè)置新值,返回舊值.   
  6.   
  7. compareAndSet(expectedValue, newValue) :   
  8.     //如果當(dāng)前值 == 預(yù)期值,,則以原子方式將該值設(shè)置為給定的更新值  
  9.     //如果更新成功,,返回true, 否則返回false  
  10.     //換句話可以這樣說: 將原子變量設(shè)置為新的值, 但是如果從我上次看到的這個(gè)變量之后到現(xiàn)在被其他線程修改了(和我期望看到的值不符), 那么更新失敗   
  11.     /*  單線程下, compareAndSet返回永遠(yuǎn)為true,       
  12.      *  多線程下, 在與result進(jìn)行compare時(shí), counter可能被其他線程set了新值, 這時(shí)需要重新再取一遍再比較,       
  13.      *  如果還是沒有拿到最新的值, 則一直循環(huán)下去, 直到拿到最新的那個(gè)值  
  14.     */  

為了提高性能,AtomicLong等類在實(shí)現(xiàn)同步時(shí),沒有用synchronized關(guān)鍵字,而是直接使用了最低層(本地c語言實(shí)現(xiàn)代碼)來完成的,

因而你是看不到用synchronized關(guān)鍵字的.

比如:AtomicLong類中原子操作方法:

public final boolean compareAndSet(long expect, long update) ;

就是直接使用SUN公司低層本地代碼的原子方法(native方法):

public final native boolean compareAndSwapLong(...)來實(shí)現(xiàn)的.

44、Object,、String類中equals方法的不同

StringBuffer / StringBuilder的equals方法都是繼承的Object方法

String類中對equals方法進(jìn)行了重寫

Object類的equals方法的實(shí)現(xiàn):

Java代碼  收藏代碼
  1. public boolean equals(Object obj) {  
  2.     return (this == obj);  
  3. }  

 Object中的equals就是用==來比較當(dāng)前對象和傳入的參數(shù)的,。

再看看String的equals實(shí)現(xiàn)

Java代碼  收藏代碼
  1. public boolean equals(Object anObject) {  
  2.     if (this == anObject) {  
  3.         return true;  
  4.     }  
  5.     if (anObject instanceof String) {  
  6.         String anotherString = (String)anObject;  
  7.         int n = count;  
  8.         if (n == anotherString.count) {  
  9.         char v1[] = value;  
  10.         char v2[] = anotherString.value;  
  11.         int i = offset;  
  12.         int j = anotherString.offset;  
  13.         while (n-- != 0) {  
  14.             if (v1[i++] != v2[j++])  
  15.             return false;  
  16.         }  
  17.         return true;  
  18.         }  
  19.     }  
  20.     return false;  
  21. }  

 它去比較內(nèi)容了。

再看StringBuilder,,在其源碼里沒有發(fā)現(xiàn)equals方法,,那么它就繼承了Object的實(shí)現(xiàn),用==來比較傳進(jìn)來的參數(shù),。

我 們看到equals是個(gè)實(shí)例方法(非static),,實(shí)例方法是可以被子類重寫而去實(shí)現(xiàn)自己想要的行為的,因此,,不能輕易的說equals就是比較內(nèi)容 的,,其行為是特定于實(shí)現(xiàn)的。但==確實(shí)是比較地址的,。因?yàn)閖ava中不支持(至少現(xiàn)在不支持)運(yùn)算符重載,,我們不能改變==的含義,其行為是固定死的,。

記得下次不要說“==比較地址,,equals比較內(nèi)容”這樣的話了,如果要說,,也在前面加上特定的條件,,如“如果比較String”,勿斷章取義,。

 45,、不借助中間變量交換元素

Js代碼  收藏代碼
  1. a = a + b  
  2. b = a - b   
  3. a = a - b   

46.UUID

UUID(Universally Unique Identifier)

全局唯一標(biāo)識符

是指在一臺機(jī)器上生成的數(shù)字,是1.5中新增的一個(gè)類,,在java.util下,,用它可以產(chǎn)生一個(gè)號稱全球唯一的ID

按照開放軟件基金會(OSF)制定的標(biāo)準(zhǔn)計(jì)算,,用到了以太網(wǎng)卡地址、納秒級時(shí)間,、芯片ID碼和許多可能的數(shù)字,。

由以下幾部分的組合:當(dāng)前日期和時(shí)間(UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,,過幾秒又生成一個(gè)UUID,,則第一個(gè)部分不同,其余相同),,時(shí)鐘序列,,全局唯一的IEEE機(jī)器識別號(如果有網(wǎng)卡,從網(wǎng)卡獲得,,沒有網(wǎng)卡以其他方式獲得),,UUID的唯一缺陷在于生成的結(jié)果串會比較長。 

JDK1.5 

如果使用的JDK1.5的話,那么生成UUID變成了一件簡單的事,以為JDK實(shí)現(xiàn)了UUID: 

java.util.UUID,直接調(diào)用即可. 

String s = UUID.randomUUID().toString();  

UUID是由一個(gè)十六位的數(shù)字組成,表現(xiàn)出來的形式例如 

550E8400-E29B-11D4-A716-446655440000   

47,、獲取隨機(jī)數(shù)

法1:

Java代碼  收藏代碼
  1. int num = getRandom(1000);  
  2.     
  3. public static int getRandom(int num) {  
  4.     return (int) Math.round(Math.random() * num);  
  5. }  

 API:

double java.lang.Math.random()

//Returns a double value greater than or equal to 0.0 and less than 1.0

long java.lang.Math.round(double a)

法2:

Java代碼  收藏代碼
  1. Random random = new Random();  
  2. int num = random.nextInt(50);  

 API:

int java.util.Random.nextInt(int n)

//Returns a int value between 0 (inclusive) and the specified value (exclusive), 

公共方法:

Java代碼  收藏代碼
  1. public static final String allChar = '023456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ';  
  2.     public static final String numberChar = '023456789';  
  3.   
  4.     /* 
  5.      * 獲取隨機(jī)字符串 
  6.      */  
  7.     public static String generateString(int length){  //參數(shù)為返回隨機(jī)數(shù)的長度  
  8.         StringBuffer sb = new StringBuffer();  
  9.         Random random = new Random();  
  10.         for (int i = 0; i < length; i++) {  
  11.             sb.append(allChar.charAt(random.nextInt(allChar.length())));  
  12.         }  
  13.         return sb.toString();  
  14.     }  
  15.       
  16.     public static String generateNumber(int length){  //參數(shù)為返回隨機(jī)數(shù)的長度  
  17.         StringBuffer sb = new StringBuffer();  
  18.         Random random = new Random();  
  19.         for (int i = 0; i < length; i++) {  
  20.             sb.append(numberChar.charAt(random.nextInt(numberChar.length())));  
  21.         }  
  22.         return sb.toString();  
  23.     }  

 48、request.getParameterMap()

在servlet中GET請求可以通過HttpServletRequest的getRequestURL方法和getQueryString()得到完整的請求路徑和請求所有參數(shù)列表,,

POST的需要getParameterMap()方法遍歷得到,,

不論GET或POST都可以通過getRequestURL+getParameterMap()來得到請求完整路徑

request.getParameterMap()的返回類型是Map類型的對象,也就是符合key-value的對應(yīng)關(guān)系,,但這里要注 

意的是,,value的類型是String[],而不是String. 

得到j(luò)sp頁面提交的參數(shù)很容易,但通過它可以將request中的參數(shù)和值變成一個(gè)map,以下是將得到的參數(shù)和值 

打印出來,,形成的map結(jié)構(gòu):map(key,value[]),,即:key是String型,value是String型數(shù)組,。 

例如:request中的參數(shù)t1=1&t1=2&t2=3 

形成的map結(jié)構(gòu): 

key=t1;value[0]=1,value[1]=2 

key=t2;value[0]=3 

如果直接用map.get('t1'),得到的將是:Ljava.lang.String; value只所以是數(shù)組形式,,就是防止參數(shù)名有相同的 

情況。 

Java代碼  收藏代碼
  1. public class ParamsUitl {  
  2.   
  3.     public static Map<String, String> getParamsMap(HttpServletRequest request) {  
  4.         Map<String,String> params = new HashMap<String,String>();  
  5.         Map requestParams = request.getParameterMap();  
  6.         for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  
  7.             String name = (String) iter.next();  
  8.             String[] values = (String[]) requestParams.get(name);  
  9.             String valueStr = '';  
  10.             for (int i = 0; i < values.length; i++) {  
  11.                 valueStr = (i == values.length - 1) ? valueStr + values[i]  
  12.                         : valueStr + values[i] + ',';  
  13.             }  
  14.             valueStr = new String(valueStr);  
  15.             params.put(name, valueStr);  
  16.         }  
  17.         return params;  
  18.     }     
  19. }  

 49.特殊字符過濾

Java代碼  收藏代碼
  1. private String formatString(String oldStr){  
  2.         String regEx='[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~,!@#¥%……&*()——+|{}【】',;:”“’。,,,、?\r\n|\r|\n|\n\r]';    
  3.         Pattern   p   =   Pattern.compile(regEx);       
  4.         Matcher   m   =   p.matcher(oldStr);       
  5.         return m.replaceAll('').trim();  
  6.     }  

 50.整數(shù)相除保留小數(shù)

java中,,當(dāng)兩個(gè)整數(shù)相除時(shí),,由于小數(shù)點(diǎn)以后的數(shù)字會被截?cái)啵\(yùn)算結(jié)果將為整數(shù),,此時(shí)若希望得到運(yùn)算結(jié)果為浮點(diǎn)數(shù),,必須將兩整數(shù)其一或是兩者都強(qiáng)制轉(zhuǎn)換為浮點(diǎn)數(shù),。 
例如: 
(float)a/b // 將整數(shù)其中一個(gè)強(qiáng)制轉(zhuǎn)換為浮點(diǎn)數(shù),再與另一個(gè)整數(shù)相除 
a/(float)b 
(float)a/(float)b // 將兩個(gè)整數(shù)同時(shí)強(qiáng)制轉(zhuǎn)換為浮點(diǎn)數(shù)后再相除 

Java代碼  收藏代碼
  1. float num= (float)2/3;  
  2. DecimalFormat df = new DecimalFormat('0.00');//格式化小數(shù)  
  3. String s = df.format(num);//返回的是String類型  

51,、new File(File parent, String child)

Java代碼  收藏代碼
  1. File home = new File(getCatalinaBase());  
  2. File conf = new File(home, 'conf');  
  3. File properties = new File(conf, 'catalina.properties');  

 parent下的目錄或文件 的File對象

易錯(cuò)題:

1,、

Java代碼  收藏代碼
  1. int j = 0;  
  2.         j = j++;  
  3.         System.out.println(j);  

 沒 見過此題的人,大部分人可能得到的結(jié)果是:1,。 然而,,運(yùn)行的結(jié)果會令您徹底失望。這是什么原因呢,?原來Java編譯器處理后綴++或--時(shí)是這么處理的:java的編譯器在遇到j(luò)++和j- -的時(shí)候會重新為變量運(yùn)算分配一塊內(nèi)存空間,,以存放原始的值,而在完成了賦值運(yùn)算之后,,將這塊內(nèi)存釋放掉,。即JAVA先將j的值保存到臨時(shí)內(nèi)存空間中,然 后處理++,,即原來的j加1,,此時(shí)原來的j變成1,然后再執(zhí)行賦值,,將內(nèi)存空間中所存放的原來的值賦回給j,,所以j仍然是0。C#和Java的結(jié)果是一樣 的,。

相反,,C/C++不是這么處理的:C中是通過寄存器作中轉(zhuǎn)先把j的值賦給它本身,再執(zhí)行++的操作,,這樣結(jié)果就是1了,。

2、

Java代碼  收藏代碼
  1. String a = 'abc';     
  2.         String b = 'abc';     
  3.         System.out.println('====>'+ a==b ); //'+'的優(yōu)先級比'=='高,,實(shí)際比較的是'====>abc'與abc  false  
  4.         System.out.println('====>'+ (a==b) );                    //true  

3,、一眼能說出它的結(jié)果

Java代碼  收藏代碼
  1. public class MainTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String s = null;    
  5.         s = s+'word';    
  6.         System.out.println('hello ' +s);    
  7.     }  
  8.   
  9. }  

 結(jié)果:hello nullword

Java代碼  收藏代碼
  1. String s = null;      
  2.         //s = s+'word';      
  3.         System.out.println('hello ' +s);   
  4.   
  5. //結(jié)果:hello null  

抽象類中可以有抽象方法和非抽象方法

構(gòu)造方法可以被重載,,但不可以被重寫

數(shù)組沒有 length() 這個(gè)方法,,有 length 的屬性。 String 有有 length() 這個(gè)方法,。

Java代碼  收藏代碼
  1. Scanner scanner = new Scanner(System.in);  
  2.  String temp = scanner.nextLine();  
  3.  System.out.println('temp=='+temp);  

new String(name.getBytes('iso-8859-1'),'utf-8');

其他:

 java類成員變量在沒有賦值的時(shí)候會賦以默認(rèn)值,,其它局部變量是不能夠享受這種待遇的。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多