Sunspl

          Hello,everyone,i am sun. 天道酬勤,笨鳥先飛.
          隨筆 - 47, 文章 - 0, 評(píng)論 - 24, 引用 - 0
          數(shù)據(jù)加載中……

          2008年6月25日

          JAVA架構(gòu)師學(xué)習(xí)方向

          請(qǐng)點(diǎn)我查閱:JAVA架構(gòu)師

          posted @ 2018-10-26 14:12 JavaSuns 閱讀(182) | 評(píng)論 (0)編輯 收藏

          POI操作

          package cc.dynasoft.struts.action;

          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.util.Iterator;
          import java.util.List;
          import java.util.Vector;

          import org.apache.poi.hssf.usermodel.HSSFCell;
          import org.apache.poi.hssf.usermodel.HSSFCellStyle;
          import org.apache.poi.hssf.usermodel.HSSFFont;
          import org.apache.poi.hssf.usermodel.HSSFFooter;
          import org.apache.poi.hssf.usermodel.HSSFHeader;
          import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
          import org.apache.poi.hssf.usermodel.HSSFRow;
          import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.hssf.util.HSSFColor;
          import org.apache.poi.hssf.util.Region;

          import cc.dynasoft.bean.Department;

          ///import org.apache.poi.hssf.record.HeaderRecorder;

          public class OutputExcel {

          public static boolean outputExcel(ExcelArgs args, List title, List list) {
           try {
            int cellNum = args.getCellNum(); // workbook
            int rowNum = args.getRowNum();
            /**
             * 建立表格設(shè)置。
             */
            HSSFWorkbook wb = new HSSFWorkbook(); // create the new Workbook
            HSSFSheet sheet = wb.createSheet(args.getSheetName()); // create
            /**
             * 打印設(shè)置
             */
            HSSFPrintSetup hps = sheet.getPrintSetup();
            hps.setPaperSize((short) 9); // 設(shè)置A4紙
            // hps.setLandscape(true); // 將頁(yè)面設(shè)置為橫向打印模式
            sheet.setHorizontallyCenter(true); // 設(shè)置打印頁(yè)面為水平居中
            // sheet.setVerticallyCenter(true); // 設(shè)置打印頁(yè)面為垂直居中
            wb.setPrintArea(0, "$A$2:$e$" + rowNum + 2);// 打印區(qū)域設(shè)置.
            /**
             * 設(shè)置表的Footer
             */
            HSSFFooter footer = sheet.getFooter();
            // 設(shè)置footer的位置和顯示的內(nèi)容
            footer.setCenter("Time:" + HSSFFooter.date());
            footer.setRight("Page " + HSSFFooter.page() + " of "
              + HSSFFooter.numPages());
            /**
             * 設(shè)置表的Header
             */
            // 設(shè)置header的位置,共有三種位置和相應(yīng)的顯示設(shè)置
            HSSFHeader header = sheet.getHeader();
            // header.setRight("Center Header");
            // header.setLeft("Left Header");
            header.setCenter(HSSFHeader.font("Stencil-Normal", "Italic")
              + HSSFHeader.fontSize((short) 30) + args.getHeaderTitle());
            // header.endDoubleUnderline();
            header.startUnderline();
            /**
             * 設(shè)置列的寬度
             */
            sheet.setColumnWidth((short) 2,
              (short) ((30 * 8) / ((double) 1 / 10)));
            sheet.setColumnWidth((short) 3,
              (short) ((40 * 8) / ((double) 1 / 10)));
            sheet.setColumnWidth((short) 4,
              (short) ((50 * 8) / ((double) 1 / 20)));
            /**
             * 創(chuàng)建第一行,也就是顯示的標(biāo)題, 可以高置的高度,單元格的格式,顏色,字體等設(shè)置. 同時(shí)可以合并單元格.
             */
            HSSFRow row0 = sheet.createRow(0); // 創(chuàng)建0行
            row0.setHeight((short) 0x300); // 設(shè)直行的高度.
            HSSFFont font2 = wb.createFont(); // 創(chuàng)建字體格式
            font2.setColor(HSSFFont.SS_NONE); // 設(shè)置單元格字體的顏色.
            font2.setFontHeight((short) 700); // 設(shè)置字體大小
            font2.setFontName("Courier New"); // 設(shè)置單元格字體
            HSSFCell cell0 = row0.createCell((short) 0); // 創(chuàng)建0行0列.
            HSSFCellStyle style3 = wb.createCellStyle(); // 創(chuàng)建單元格風(fēng)格.
            style3.setAlignment(HSSFCellStyle.VERTICAL_CENTER); // 垂直居中
            style3.setAlignment(HSSFCellStyle.ALIGN_CENTER); // /水平居中
            style3.setFont(font2); // 將字體格式加入到單元格風(fēng)格當(dāng)中
            // cell0.setCellType()
            cell0.setCellStyle(style3); // 設(shè)置單元格的風(fēng)格.
            cell0.setCellValue(args.getHeaderTitle()); // 設(shè)置單元的內(nèi)容.
            sheet.addMergedRegion(new Region(0, (short) 0, 0,
              (short) (cellNum - 1)));// 指定合并區(qū)域,前二個(gè)參數(shù)為開始處X,Y坐標(biāo).后二個(gè)為結(jié)束的坐標(biāo).
            /**
             * 設(shè)置其它數(shù)據(jù) 設(shè)置風(fēng)格
             */
            HSSFCellStyle style = wb.createCellStyle();
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設(shè)置單無格的邊框?yàn)榇煮w
            style.setBottomBorderColor(HSSFColor.BLACK.index); // 設(shè)置單元格的邊框顏色.
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setRightBorderColor(HSSFColor.BLACK.index);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // style.setWrapText(true);//文本區(qū)域隨內(nèi)容多少自動(dòng)調(diào)整

            // style.setFillForegroundColor(HSSFColor.LIME.index);
            // style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            /**
             * 設(shè)置風(fēng)格1
             */
            HSSFCellStyle style1 = wb.createCellStyle();
            style1.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設(shè)置單無格的邊框?yàn)榇煮w
            style1.setBottomBorderColor(HSSFColor.BLACK.index); // 設(shè)置單元格的邊框顏色.
            style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style1.setLeftBorderColor(HSSFColor.BLACK.index);
            style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style1.setRightBorderColor(HSSFColor.BLACK.index);
            style1.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
            style1.setTopBorderColor(HSSFColor.BLACK.index);
            style1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 最好的設(shè)置Pattern
            // 單元格背景的顯示模式.
            style1.setFillForegroundColor(new HSSFColor.RED().getIndex()); // 設(shè)置單元格背景色;
            style1.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平對(duì)齊方式
            // style1.setWrapText(true);//文本區(qū)域隨內(nèi)容多少自動(dòng)調(diào)整
            // style.setFillPattern(HSSFCellStyle.//);
            // 設(shè)置字體Color,首先創(chuàng)建Font對(duì)象,后對(duì)font設(shè)置,然后做為參數(shù)傳給style
            HSSFFont font = wb.createFont();
            font.setColor(HSSFFont.SS_NONE);
            // font.setFontHeightInPoints((short)24);
            font.setFontName("Courier New");
            // font.setItalic(true);
            // font.setStrikeout(true);//給字體加上刪除線
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            style1.setFont(font);
            /**
             *
             * 設(shè)置第零行表格說明行
             *
             *
             *
             */
            HSSFRow row1 = sheet.createRow((short) 1);
            for (int j = 0; j < cellNum; j++) {
             HSSFCell cell = row1.createCell((short) j);
             cell.setCellValue((String) title.get(j));
             cell.setCellStyle(style1);
            }
            // style.setFillPattern(HSSFCellStyle.NO_FILL);

            /**
             * 設(shè)置表的內(nèi)容主體
             */

            Iterator iter = list.iterator();
            for (int i = 2; iter.hasNext(); i++) {
             Department dep = (Department) iter.next();
             HSSFRow row = sheet.createRow((short) i);
             HSSFCell cell5 = row.createCell((short) 0);
             HSSFCell cell1 = row.createCell((short) 1);
             HSSFCell cell2 = row.createCell((short) 2);
             HSSFCell cell3 = row.createCell((short) 3);
             HSSFCell cell4 = row.createCell((short) 4);
             cell5.setCellValue(dep.getId());
             cell5.setCellStyle(style);
             cell1.setCellValue(dep.getParentId());
             cell1.setCellStyle(style);
             cell2.setCellValue(dep.getName());
             cell2.setCellStyle(style);
             cell3.setCellValue(dep.getDescription());
             cell3.setCellStyle(style);
             cell4.setCellValue(dep.getImagePath());
             cell4.setCellStyle(style);
            }
            // Write the output to a file}
            // FileOutputStream fileOut = new
            // FileOutputStream(args.getPath()+args.getFileName());
            /**
             * 對(duì)文件進(jìn)行輸出操作。
             */
            FileOutputStream fileOut = new FileOutputStream(args
              .getPathAndName());
            wb.write(fileOut);
            // fileOut.close();
           } catch (IOException ex) {
            ex.printStackTrace();
           } catch (Exception ex) {
            ex.printStackTrace();
           }
           return true;
          }

          }

          posted @ 2009-06-13 19:52 JavaSuns 閱讀(612) | 評(píng)論 (0)編輯 收藏

          linux創(chuàng)建文件夾命令

          mkdir /home/u1 創(chuàng)建文件夾/home/u1
          chown oracle /home/u1 表示改變目錄所有者為oracle賬戶;
          chgrp dba /home/u1 改變/home/u1目錄為dba所有;
          chmod 755 /home/u1 表示oracle賬戶對(duì)/home/u1目錄有755權(quán)限;
          rmdir /home/u1 表示刪除/home/u1目錄

          hostname可以查看linux的計(jì)算機(jī)名;
          whoami可以查看當(dāng)前用戶;
          pwd顯示當(dāng)前路徑;
          df查看系統(tǒng)的硬件信息
          ls -lrt l表示顯示詳細(xì)列表,-t表示按時(shí)間排序,-r反向排序

          cat orcl_ora_3436.trc|grep bucket

          以下查看相關(guān)文件內(nèi)容:
          more /etc/oratab
          cat /etc/passwd
          cat /etc/group

          posted @ 2008-07-28 09:01 JavaSuns 閱讀(38656) | 評(píng)論 (4)編輯 收藏

          Linux中復(fù)制文件或目錄的命令(為了響應(yīng)新工作,要學(xué)習(xí)一下LINUX)

          copy命令  

          該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的copy命令一樣,功能十分強(qiáng)大。  

          語(yǔ)法: cp [選項(xiàng)] 源文件或目錄 目標(biāo)文件或目錄  

          說明:該命令把指定的源文件復(fù)制到目標(biāo)文件或把多個(gè)源文件復(fù)制到目標(biāo)目錄中。  

          該命令的各選項(xiàng)含義如下:

          - a 該選項(xiàng)通常在拷貝目錄時(shí)使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項(xiàng)的組合。 

          - d 拷貝時(shí)保留鏈接。  

          - f 刪除已經(jīng)存在的目標(biāo)文件而不提示。  

          - i 和f選項(xiàng)相反,在覆蓋目標(biāo)文件之前將給出提示要求用戶確認(rèn)。回答y時(shí)目標(biāo)文件將被覆蓋,是交互式拷貝。  

          - p 此時(shí)cp除復(fù)制源文件的內(nèi)容外,還將把其修改時(shí)間和訪問權(quán)限也復(fù)制到新文件中。  

          - r 若給出的源文件是一目錄文件,此時(shí)cp將遞歸復(fù)制該目錄下所有的子目錄和文件。此時(shí)目標(biāo)文件必須為一個(gè)目錄名。 

          - l 不作拷貝,只是鏈接文件。  

          需要說明的是,為防止用戶在不經(jīng)意的情況下用cp命令破壞另一個(gè)文件,如用戶指定的目標(biāo)文件名已存在,用cp命令拷貝文件后,這個(gè)文件就會(huì)被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時(shí),最好使用i選項(xiàng)。

          posted @ 2008-07-28 08:59 JavaSuns 閱讀(2325) | 評(píng)論 (0)編輯 收藏

          解析oracle的rownum(學(xué)習(xí))

          對(duì)于rownum來說它是oracle系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是1,第二行是2,依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù),而且rownum不能以任何表的名稱作為前綴。
           舉例說明:
          例如表:student(學(xué)生)表,表結(jié)構(gòu)為:
          ID       char(6)      --學(xué)號(hào)
          name    VARCHAR2(10)   --姓名
          create table student (ID char(6), name VARCHAR2(100));
          insert into sale values('200001',‘張一’);
          insert into sale values('200002',‘王二’);
          insert into sale values('200003',‘李三’);
          insert into sale values('200004',‘趙四’);
          commit;
          (1) rownum 對(duì)于等于某值的查詢條件
          如 果希望找到學(xué)生表中第一條學(xué)生的信息,可以使用rownum=1作為條件。但是想找到學(xué)生表中第二條學(xué)生的信息,使用rownum=2結(jié)果查不到數(shù)據(jù)。因 為rownum都是從1開始,但是1以上的自然數(shù)在rownum做等于判斷是時(shí)認(rèn)為都是false條件,所以無法查到rownum = n(n>1的自然數(shù))。
          SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回記錄條數(shù)的地方,保證不出錯(cuò),如:隱式游標(biāo))
          SQL> select rownum,id,name from student where rownum=1;
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
                   1 200001 張一
          SQL> select rownum,id,name from student where rownum =2;
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
          (2)rownum對(duì)于大于某值的查詢條件
             如果想找到從第二行記錄以后的記錄,當(dāng)使用rownum>2是查不出記錄的,原因是由于rownum是一個(gè)總是從1開始的偽列,Oracle 認(rèn)為rownum> n(n>1的自然數(shù))這種條件依舊不成立,所以查不到記錄
          SQL> select rownum,id,name from student where rownum >2;
          ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
          那如何才能找到第二行以后的記錄呀。可以使用以下的子查詢方法來解決。注意子查詢中的rownum必須要有別名,否則還是不會(huì)查出記錄來,這是因?yàn)閞ownum不是某個(gè)表的列,如果不起別名的話,無法知道rownum是子查詢的列還是主查詢的列。
          SQL>select * from(select rownum no ,id,name from student) where no>2;
                  NO ID     NAME
          ---------- ------ ---------------------------------------------------
                   3 200003 李三
                   4 200004 趙四
          SQL> select * from(select rownum,id,name from student)where rownum>2;
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
          (3)rownum對(duì)于小于某值的查詢條件
          如果想找到第三條記錄以前的記錄,當(dāng)使用rownum<3是能得到兩條記錄的。顯然rownum對(duì)于rownum<n((n>1的自然數(shù))的條件認(rèn)為是成立的,所以可以找到記錄。
          SQL> select rownum,id,name from student where rownum <3;
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
                  1 200001 張一
                  2 200002 王二
          綜 上幾種情況,可能有時(shí)候需要查詢r(jià)ownum在某區(qū)間的數(shù)據(jù),那怎么辦呀從上可以看出rownum對(duì)小于某值的查詢條件是人為true的,rownum對(duì) 于大于某值的查詢條件直接認(rèn)為是false的,但是可以間接的讓它轉(zhuǎn)為認(rèn)為是true的。那就必須使用子查詢。例如要查詢r(jià)ownum在第二行到第三行之 間的數(shù)據(jù),包括第二行和第三行數(shù)據(jù),那么我們只能寫以下語(yǔ)句,先讓它返回小于等于三的記錄行,然后在主查詢中判斷新的rownum的別名列大于等于二的記 錄行。但是這樣的操作會(huì)在大數(shù)據(jù)集中影響速度。
          SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
                  NO ID     NAME
          ---------- ------ ---------------------------------------------------
                   2 200002 王二
                   3 200003 李三
          (4)rownum和排序
          Oracle中的rownum的是在取數(shù)據(jù)的時(shí)候產(chǎn)生的序號(hào),所以想對(duì)指定排序的數(shù)據(jù)去指定的rowmun行數(shù)據(jù)就必須注意了。
          SQL> select rownum ,id,name from student order by name;
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
                   3 200003 李三
                   2 200002 王二
                   1 200001 張一
                   4 200004 趙四
          可以看出,rownum并不是按照name列來生成的序號(hào)。系統(tǒng)是按照記錄插入時(shí)的順序給記錄排的號(hào),rowid也是順序分配的。為了解決這個(gè)問題,必須使用子查詢
          SQL> select rownum ,id,name from (select * from student order by name);
              ROWNUM ID     NAME
          ---------- ------ ---------------------------------------------------
                   1 200003 李三
                   2 200002 王二
                   3 200001 張一
                   4 200004 趙四
          這樣就成了按name排序,并且用rownum標(biāo)出正確序號(hào)(有小到大)

          posted @ 2008-06-26 10:23 JavaSuns 閱讀(434) | 評(píng)論 (0)編輯 收藏

          Java里的list,set,map操作方法(練習(xí))

          //ArrayList
          {
          ArrayList arraylist=new ArrayList();
          arraylist.add(0,"end");//指定索引加入值
          //需注意的是,如果現(xiàn)有2個(gè)值,我加入索引為5的那么就會(huì)出現(xiàn)異常
          for(int i=0;i<2;i++){
          arraylist.add(i,String.valueOf(i));
          }
          System.out.println("ArrayList:");
          for(int i=0;i<arraylist.size();i++){
          System.out.print(arraylist.get(i)+";");
          }
          arraylist.add("0");//直接加入值到ArrayList的最后
          arraylist.add("0");
          System.out.print("\nArrayList\'s lastIndexOf(\"0\") is "+arraylist.lastIndexOf("0"));
          }
          //Arrays
          {
          String []array=new String[]{"a","b","c"};
          List list=Arrays.asList(array);
          System.out.println("\nArrays:");
          for(int i=0;i<list.size();i++){
          System.out.print(list.get(i)+";");
          }
          System.out.print("\nArrays\'s length is "+array.length);//打印數(shù)組的長(zhǎng)度
          }
          //Collections
          {
          String []array=new String[]{"a","b","c"};
          List list=Arrays.asList(array);
          Collections.fill(list,"Fill");//用Fill填充全部元素
          System.out.println("\nCollections:");
          for(int i=0;i<list.size();i++){
          System.out.print(list.get(i)+";");
          }
          array=new String[]{"1","2","3"};
          List list2=Arrays.asList(array);
          Collections.copy(list,list2);//拷貝list2的數(shù)據(jù)進(jìn)list
          System.out.println("\n"+list);
          Collections.swap(list,2,1);//調(diào)換索引為1和2的元素的位置
          System.out.println(list);
          }
          //EventObject
          {
          String s="hello";
          String s2=s;
          EventObject eventobject=new EventObject(s);//一個(gè)準(zhǔn)容器類型,確切的歸類它不是容器
          System.out.println("EventObject:");
          System.out.println(eventobject.getSource());
          System.out.println(eventobject.equals(s2));
          }
          //HashMap
          {
          HashMap hashmap=new HashMap();//一個(gè)速度最快的容器
          hashmap.put("0","c");
          hashmap.put("1","a");
          hashmap.put("2","b");
          hashmap.put("3","a");
          System.out.println("HashMap:");
          System.out.println(hashmap);//該容器有其內(nèi)部的排序方式
          Set set=hashmap.keySet();//獲取全部鍵
          Iterator iterator=set.iterator();
          while(iterator.hasNext()){
          System.out.print(hashmap.get(iterator.next())+";");
          }
          }
          //HashSet
          {
          HashSet hashset=new HashSet();//一個(gè)絕對(duì)不能重復(fù)的類型
          hashset.add("c");
          hashset.add("b");
          hashset.add("a");
          hashset.add("a");
          hashset.add("b");
          System.out.println("\nHashSet:");
          System.out.println(hashset);
          Iterator iterator=hashset.iterator();//取出元素
          while(iterator.hasNext()){
          System.out.print(iterator.next()+";");
          }
          }
          //Hashtable
          {
          Hashtable hashtable=new Hashtable();//一個(gè)完全可以由其他容器替換的老容器類型
          hashtable.put("0","c");
          hashtable.put("1","a");
          hashtable.put("3","c");
          hashtable.put("2","b");
          System.out.println("\nHashtable:");
          Enumeration enumeration=hashtable.elements();//獲取元素,Enumeration已經(jīng)不是主流,Iterator是它的下一代替代品
          while(enumeration.hasMoreElements()){
          System.out.print(enumeration.nextElement()+";");
          }
          }
          //IdentityHashMap
          {
          IdentityHashMap identityhashmap=new IdentityHashMap();
          identityhashmap.put("0","c");
          identityhashmap.put("1","a");
          identityhashmap.put("3","b");
          identityhashmap.put("2","a");
          System.out.println("\nIdentityHashMap:");
          System.out.println(identityhashmap);
          System.out.println(identityhashmap.containsKey("3"));//是否包含這個(gè)鍵
          System.out.println(identityhashmap.containsValue("a"));//是否包含值
          Set set=identityhashmap.entrySet();//傳為Set類型
          System.out.println(set);
          set=identityhashmap.keySet();//全部鍵
          System.out.println(set);
          }
          //LinkedHashMap
          {
          LinkedHashMap linkedhashmap=new LinkedHashMap();
          linkedhashmap.put("0","b");
          linkedhashmap.put("2","a");
          linkedhashmap.put("1","c");
          linkedhashmap.put("3","b");
          System.out.println("LinkedHashMap:");
          System.out.println(linkedhashmap);
          System.out.println(linkedhashmap.containsKey("2"));//是否包含這個(gè)鍵
          System.out.println(linkedhashmap.containsValue("c"));//是否包含值
          Set set=linkedhashmap.keySet();
          Iterator iterator=set.iterator();
          while(iterator.hasNext()){
          System.out.print(linkedhashmap.get(iterator.next())+";");
          }
          }
          //LinkedHashSet
          {
          LinkedHashSet linkedhashset=new LinkedHashSet();//它包含了幾種Set的屬性但卻沒有自己的特色
          linkedhashset.add("c");
          linkedhashset.add("a");
          linkedhashset.add("a");
          linkedhashset.add("b");
          System.out.println("\nLinkedHashSet:");
          System.out.println(linkedhashset);
          System.out.println(linkedhashset.contains("a"));//是否包含對(duì)象
          Iterator iterator=linkedhashset.iterator();
          while(iterator.hasNext()){
          System.out.print(iterator.next()+";");
          }
          }
          //LinkedList
          {
          LinkedList linkedlist=new LinkedList();//自由使用是它的特色
          linkedlist.add("a");
          linkedlist.add(1,"c");
          linkedlist.addLast("b");
          linkedlist.addFirst("d");
          System.out.println("\nLinkedList:");
          System.out.println(linkedlist);
          //linkedlist.clear();//該方法清空容器
          //linkedlist.remove(0);//刪除索引為0的元素
          //linkedlist.remove("d");//刪除值為d的元素
          //linkedlist.removeFirst();//刪除第一個(gè)元素
          //linkedlist.removeLast();//刪除最后一個(gè)元素
          for(int i=0;i<linkedlist.size();i++){
          System.out.print(linkedlist.get(i)+";");
          }
          }
          //Stack
          {
          Stack stack=new Stack();//堆棧
          stack.add("b");
          stack.add(0,"c");
          stack.push("d");
          stack.add("e");
          stack.push("a");
          Enumeration enumeration=stack.elements();
          System.out.println("\nStack:");
          while(enumeration.hasMoreElements()){
          System.out.print(enumeration.nextElement()+";");
          }
          //后進(jìn)先出
          System.out.println("\n"+stack.peek());
          System.out.println(stack.pop());
          System.out.println(stack.contains("d")+";"+stack.contains("a"));//是否包含該元素,有趣的事情發(fā)生了
          System.out.println(stack.search("c"));//非常有用的屬性,檢索,但是由后向前的排列
          }
          //TreeMap
          {
          TreeMap treemap=new TreeMap();
          treemap.put("0","d");
          treemap.put("2","a");
          treemap.put("1","b");
          treemap.put("3","c");
          System.out.println("\nTreeMap:");//可以對(duì)鍵排序
          System.out.println(treemap);
          System.out.println(treemap.firstKey());//返回第一個(gè)鍵
          Set set=treemap.keySet();
          Iterator iterator=set.iterator();
          while(iterator.hasNext()){
          System.out.print(treemap.get(iterator.next())+";");
          }
          }
          //TreeSet
          {
          TreeSet treeset=new TreeSet();//自動(dòng)排序內(nèi)容
          treeset.add("b");
          treeset.add("a");
          treeset.add("c");
          treeset.add("d");
          System.out.println("\nTreeSet:");
          System.out.println(treeset);
          System.out.println(treeset.first());//返回第一個(gè)元素
          Iterator iterator=treeset.iterator();
          while(iterator.hasNext()){
          System.out.print(iterator.next()+";");
          }
          }
          //Vector
          {
          Vector vector=new Vector();
          vector.add(0,"b");
          vector.add("a");
          vector.addElement("d");
          vector.add("c");
          System.out.println("\nVector:");
          System.out.println(vector);
          vector.set(2,"h");//替換掉指定索引的元素
          System.out.println(vector);
          Object []str=vector.toArray();
          for(int i=0;i<str.length;i++){
          System.out.print(str[i]+";");
          }
          vector.setSize(2);//重新設(shè)置大小為2
          System.out.println("\n"+vector);
          }
          //WeakHashMap
          {
          WeakHashMap weakhashmap=new WeakHashMap();
          weakhashmap.put("1","b");
          weakhashmap.put("2","c");
          weakhashmap.put("0","d");
          weakhashmap.put("3","a");
          System.out.println("\nWeakHashMap:");
          System.out.println(weakhashmap);
          System.out.println(weakhashmap.containsKey("3"));//是否包含鍵
          System.out.println(weakhashmap.containsValue("d"));//是否包含值
          Set set=weakhashmap.entrySet();
          Iterator iterator=set.iterator();
          while(iterator.hasNext()){
          System.out.print(iterator.next()+";");
          }
          //weakhashmap.remove("2");//刪除該鍵對(duì)應(yīng)的值
          //weakhashmap.get("1");//獲取指定鍵的值
          }
          }

          posted @ 2008-06-25 17:33 JavaSuns 閱讀(3885) | 評(píng)論 (0)編輯 收藏

          map,set,list,等JAVA中集合解析(了解)

          在JAVA的util包中有兩個(gè)所有集合的父接口Collection和Map,它們的父子關(guān)系:

                     java.util
                  +Collection 這個(gè)接口extends自 --java.lang.Iterable接口
                     +List 接口
                        -ArrayList 類
                        -LinkedList 類
                        -Vector 類     此類是實(shí)現(xiàn)同步的

                     +Queue 接口
                        +不常用,在此不表.

                     +Set 接口
                        +SortedSet 接口
                           -TreeSet 類
                        -HashSet

                  +Map 接口
                    -HashMap 類 (除了不同步和允許使用 null 鍵/值之外,與 Hashtable 大致相同.)
                    -Hashtable 類 此類是實(shí)現(xiàn)同步的,不允許使用 null 鍵值
                    +SortedMap 接口
                       -TreeMap 類

                    以下對(duì)眾多接口和類的簡(jiǎn)單說明:首先不能不先說一下數(shù)組(Array)
                 
          一、Array , Arrays

          Java所有“存儲(chǔ)及隨機(jī)訪問一連串對(duì)象”的做法,array是最有效率的一種。

          1、
          效率高,但容量固定且無法動(dòng)態(tài)改變。
          array還有一個(gè)缺點(diǎn)是,無法判斷其中實(shí)際存有多少元素,length只是告訴我們array的容量。

          2、Java中有一個(gè)Arrays類,專門用來操作array。
                 arrays中擁有一組static函數(shù),
          equals():比較兩個(gè)array是否相等。array擁有相同元素個(gè)數(shù),且所有對(duì)應(yīng)元素兩兩相等。
          fill():將值填入array中。
          sort():用來對(duì)array進(jìn)行排序。
          binarySearch():在排好序的array中尋找元素。
          System.arraycopy():array的復(fù)制。


          二、Collection , Map

          若撰寫程序時(shí)不知道究竟需要多少對(duì)象,需要在空間不足時(shí)自動(dòng)擴(kuò)增容量,則需要使用容器類庫(kù),array不適用。

          1、Collection 和 Map 的區(qū)別

          容器內(nèi)每個(gè)為之所存儲(chǔ)的元素個(gè)數(shù)不同。
          Collection類型者,每個(gè)位置只有一個(gè)元素。
          Map類型者,持有 key-value pair,像個(gè)小型數(shù)據(jù)庫(kù)。

          2、Java2容器類類庫(kù)的用途是“保存對(duì)象”,它分為兩類,各自旗下的子類關(guān)系

          Collection
                 --List:將以特定次序存儲(chǔ)元素。所以取出來的順序可能和放入順序不同。
                       --ArrayList / LinkedList / Vector
                 --Set : 不能含有重復(fù)的元素
                       --HashSet /TreeSet
          Map
                 --HashMap
              --HashTable
              --TreeMap

           Map----一組成對(duì)的“鍵值對(duì)”對(duì)象,即其元素是成對(duì)的對(duì)象,最典型的應(yīng)用就是數(shù)據(jù)字典,并且還有其它廣泛的應(yīng)用。另外,Map可以返回其所有鍵組成的Set和其所有值組成的Collection,或其鍵值對(duì)組成的Set,并且還可以像數(shù)組一樣擴(kuò)展多維Map,只要讓Map中鍵值對(duì)的每個(gè)“值”是一個(gè)Map即可。

           Collection下 1.迭代器

            迭代器是一種設(shè)計(jì)模式,它是一個(gè)對(duì)象,它可以遍歷并選擇序列中的對(duì)象,而開發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為“輕量級(jí)”對(duì)象,因?yàn)閯?chuàng)建它的代價(jià)小。

            Java中的Iterator功能比較簡(jiǎn)單,并且只能單向移動(dòng):

            (1) 使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí),它返回序列的第一個(gè)元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。


            (2) 使用next()獲得序列中的下一個(gè)元素。

            (3) 使用hasNext()檢查序列中是否還有元素。

            (4) 使用remove()將迭代器新返回的元素刪除。

            Iterator是Java迭代器最簡(jiǎn)單的實(shí)現(xiàn),為L(zhǎng)ist設(shè)計(jì)的ListIterator具有更多的功能,它可以從兩個(gè)方向遍歷List,也可以從List中插入和刪除元素。

            2.List的功能方法

            List(interface): 次序是List最重要的特點(diǎn);它確保維護(hù)元素特定的順序。List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(只推薦LinkedList使用)。一個(gè)List可以生成ListIterator,使用它可以從兩個(gè)方向遍歷List,也可以從List中間插入和刪除元素。

            ArrayList: 由數(shù)組實(shí)現(xiàn)的List。它允許對(duì)元素進(jìn)行快速隨機(jī)訪問,但是向List中間插入與移除元素的速度很慢。ListIterator只應(yīng)該用來由后向前遍歷ArrayList,而不是用來插入和刪除元素,因?yàn)檫@比LinkedList開銷要大很多。

            LinkedList: 由列表實(shí)現(xiàn)的List。對(duì)順序訪問進(jìn)行了優(yōu)化,向List中間插入與刪除得開銷不大,隨機(jī)訪問則相對(duì)較慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),這些方法(沒有在任何接口或基類中定義過)使得LinkedList可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。

            3.Set的功能方法

            Set(interface): 存入Set的每個(gè)元素必須是唯一的,這也是與List不同的,因?yàn)镾et不保存重復(fù)元素。加入Set的Object必須定義equals()方法以確保對(duì)象的唯一性。Set與Collection有完全一樣的接口。Set接口不保證維護(hù)元素的次序。

            HashSet: HashSet能快速定位一個(gè)元素,存入HashSet的對(duì)象必須定義hashCode()。

            TreeSet: 保持次序的Set,底層為樹結(jié)構(gòu)。使用它可以從Set中提取有序的序列。

            LinkedHashSet: 具有HashSet的查詢速度,且內(nèi)部使用鏈表維護(hù)元素的順序(插入的次序)。于是在使用迭代器遍歷Set時(shí),結(jié)果會(huì)按元素插入的次序顯示。

            HashSet采用散列函數(shù)對(duì)元素進(jìn)行排序,這是專門為快速查詢而設(shè)計(jì)的;TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)進(jìn)行排序元素;LinkedHashSet內(nèi)部使用散列以加快查詢速度,同時(shí)使用鏈表維護(hù)元素的次序,使得看起來元素是以插入的順序保存的。需要注意的是,生成自己的類時(shí),Set需要維護(hù)元素的存儲(chǔ)順序,因此要實(shí)現(xiàn)Comparable接口并定義compareTo()方法。

          3、其他特征

          *     List,Set,Map將持有對(duì)象一律視為Object型別。
          *     Collection、List、Set、Map都是接口,不能實(shí)例化。
                繼承自它們的 ArrayList, Vector, HashTable, HashMap是具象class,這些才可被實(shí)例化。
          *     vector容器確切知道它所持有的對(duì)象隸屬什么型別。vector不進(jìn)行邊界檢查。


          三、Collections

          Collections是針對(duì)集合類的一個(gè)幫助類。提供了一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程完全化等操作。
          相當(dāng)于對(duì)Array進(jìn)行類似操作的類——Arrays。
          如,Collections.max(Collection coll); 取coll中最大的元素。
                 Collections.sort(List list); 對(duì)list中元素排序

          四、如何選擇?

          1、容器類和Array的區(qū)別、擇取
                *     容器類僅能持有對(duì)象引用(指向?qū)ο蟮闹羔槪皇菍?duì)象信息copy一份至數(shù)列某位置。
                *     一旦將對(duì)象置入容器內(nèi),便損失了該對(duì)象的型別信息。

          2、
               *     在各種Lists中,最好的做法是以ArrayList作為缺省選擇。當(dāng)插入、刪除頻繁時(shí),使用LinkedList();
                  Vector總是比ArrayList慢,所以要盡量避免使用。
               *     在各種Sets中,HashSet通常優(yōu)于HashTree(插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過排序的序列,才用TreeSet。
                  HashTree存在的唯一理由:能夠維護(hù)其內(nèi)元素的排序狀態(tài)。
               *     在各種Maps中
                  HashMap用于快速查找。
               *     當(dāng)元素個(gè)數(shù)固定,用Array,因?yàn)锳rray效率是最高的。

          結(jié)論:最常用的是ArrayList,HashSet,HashMap,Array。而且,我們也會(huì)發(fā)現(xiàn)一個(gè)規(guī)律,用TreeXXX都是排序的。


          注意:

          1、Collection沒有g(shù)et()方法來取得某個(gè)元素。只能通過iterator()遍歷元素。
          2、Set和Collection擁有一模一樣的接口。
          3、List可以通過get()方法來一次取出一個(gè)元素。使用數(shù)字來選擇一堆對(duì)象中的一個(gè),get(0)...。(add/get)
          4、一般使用ArrayList。用LinkedList構(gòu)造堆棧stack、隊(duì)列queue

          5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個(gè)key/value。
                HashMap會(huì)利用對(duì)象的hashCode來快速找到key。
              *     hashing
                    哈希碼就是將對(duì)象的信息經(jīng)過一些轉(zhuǎn)變形成一個(gè)獨(dú)一無二的int值,這個(gè)值存儲(chǔ)在一個(gè)array中。
                    我們都知道所有存儲(chǔ)結(jié)構(gòu)中,array查找速度是最快的。所以,可以加速查找。
                
                    發(fā)生碰撞時(shí),讓array指向多個(gè)values。即,數(shù)組每個(gè)位置上又生成一個(gè)梿表。

          6、Map中元素,可以將key序列、value序列單獨(dú)抽取出來。
          使用keySet()抽取key序列,將map中的所有keys生成一個(gè)Set。
          使用values()抽取value序列,將map中的所有values生成一個(gè)Collection。

          為什么一個(gè)生成Set,一個(gè)生成Collection?那是因?yàn)椋琸ey總是獨(dú)一無二的,value允許重復(fù)。

          posted @ 2008-06-25 17:32 JavaSuns 閱讀(11793) | 評(píng)論 (1)編輯 收藏

          主站蜘蛛池模板: 乌拉特前旗| 米林县| 永济市| 麻栗坡县| 容城县| 和政县| 奉新县| 五台县| 剑河县| 巴林左旗| 仪陇县| 永康市| 永靖县| 吉木乃县| 仙游县| 芦溪县| 宜兰市| 邯郸县| 凌源市| 太仆寺旗| 富民县| 开江县| 衡东县| 成武县| 平阳县| 集安市| 视频| 习水县| 千阳县| 新宁县| 威宁| 米易县| 鲜城| 临清市| 民丰县| 烟台市| 焉耆| 富平县| 栖霞市| 德格县| 泰宁县|