面試題3

ZHOU_VIP發表於2017-03-13

34.集合類
   集合類的由來:
	當物件多了,為了方便於操作,需要一個容器儲存。通常使用集合來對物件進行儲存。
	為什麼不使用陣列呢?
	陣列雖然可以儲存物件,但是長度是固定的,而集合的長度是可變的。
	陣列可以儲存基本資料型別,而集合只儲存物件。


	當容器多了以後,每一個容器因為資料結構的不同,分出了很多容器。那麼這些都具備一些共性的特點
	出現上向抽取。最終頂層類或者介面中定義的就是集合框架的共性方法。
	這個頂層介面之一就是Collection 。

35.Map:以鍵值對的形式存入,必須要保證鍵的唯一性。
    新增:put(key,value):
		如果存入已有的鍵,會發生值覆蓋的情況。
    判斷:containsKey(key),containsValue(value)
    刪除:remove(key)
    個數:size();
    取出:get(key)
	當返回為null時,對於HashMap有兩種情況,一,該鍵不存在,二,該鍵存在對應的值是null。
    取出所有元素:
	原理:將Map集合轉成Set集合。再通過迭代器取出。
	keySet():將Map集合中的所有鍵取出存入到了Set集合中,在通過迭代器遍歷,在遍歷過程中,
		 使用Map集合的get方法取出鍵所對應的值。

	entrySet():將Map集合中的鍵值對映關係取出,被封裝成了Map.Entry物件。並將Map.Entry物件存入到了Set集合中。
		   通過迭代器取出Map.Entry 物件,並通過該物件的getKey(),getValue()方法取出map集合中的鍵和值。

    取出所有值:values();
	
	|--HashMap:資料結構是雜湊表,執行緒是不安全的,可以存入null鍵null值。
	|--HashTable:資料結構是雜湊表,執行緒是安全的,不可以存入null鍵null值,被HashMap所取代。
	|--TreeMap:資料結構是二叉樹,執行緒是不安全的,可以對Map集合中的鍵進行排序。

    什麼時候使用Map集合呢?
    當分析問題時,物件間出現了對映關係時,就要先想到Map集合。

36.JDK1.5版本出現的新特性:
	可變引數。
	void show(String... arr){}
	其實arr接收就是一個String型別的陣列。但是好處在於傳遞引數的時候,可以將String型別的元素,直接作為引數傳遞,
	而不用將這些元素封裝成陣列在傳遞,簡化了引數傳遞過程。
	注意:可變引數一定要定義在引數列表的最後。

	增強型的for迴圈:
	for(Element e :集合或者陣列)
	{
	
	}
	增強for迴圈在使用時,必須有被遍歷的目標。

37.IO流和網路程式設計好像一直沒有用到
   集合經常用於處理資料,業務層常用到
   多執行緒估計以後java高階水平才會用吧

38.反射:


39.hibernate和mybatis區別
   Hibernate與Mybatis對比總結
   兩者相同點

    Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置檔案生成SessionFactory,然後由SessionFactory 生成Session,最後由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差不多的。
    Hibernate和MyBatis都支援JDBC和JTA事務處理。

   Mybatis優勢

    MyBatis可以進行更為細緻的SQL優化,可以減少查詢欄位。
    MyBatis容易掌握,而Hibernate門檻較高。

   Hibernate優勢

    Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果對映。
    Hibernate對物件的維護和快取要比MyBatis好,對增刪改查的物件的維護要方便。
    Hibernate資料庫移植性很好,MyBatis的資料庫移植性不好,不同的資料庫需要寫不同SQL。
    Hibernate有更好的二級快取機制,可以使用第三方快取。MyBatis本身提供的快取機制不佳。

   他人總結

    Hibernate功能強大,資料庫無關性好,O/R對映能力強,如果你對Hibernate相當精通,而且對Hibernate進行了適當的封裝,那麼你的專案整個持久層程式碼會相當簡單,需要寫的程式碼很少,開發速度很快,非常爽。
    Hibernate的缺點就是學習門檻不低,要精通門檻更高,而且怎麼設計O/R對映,在效能和物件模型之間如何權衡取得平衡,以及怎樣用好Hibernate方面需要你的經驗和能力都很強才行。
    iBATIS入門簡單,即學即用,提供了資料庫查詢的自動物件繫結功能,而且延續了很好的SQL使用經驗,對於沒有那麼高的物件模型要求的專案來說,相當完美。
    iBATIS的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。
 
   ---------------
   葵花寶典
   相同點: 遮蔽 jdbc api 的底層訪問細節, 使用我們不用與 jdbc api 打交道, 就可以訪問資料。
   jdbc api 程式設計流程固定,還將 sql 語句與 java 程式碼混雜在了一起,經常需要拼湊 sql 語句,
   細節很繁瑣。
   ibatis 的好處:遮蔽 jdbc api 的底層訪問細節;將 sql 語句與 java 程式碼進行分離;提供了將結
   果集自動封裝稱為實體物件和物件的集合的功能,queryForList 返回物件集合,用
   queryForObject 返回單個物件;提供了自動將實體物件的屬性傳遞給 sql 語句的引數。
   Hibernate 是一個全自動的 orm 對映工具,它可以自動生成 sql 語句,ibatis 需要我們自己在
   xml 配置檔案中寫 sql 語句,hibernate 要比 ibatis 功能負責和強大很多。因為 hibernate 自
   動生成 sql 語句,我們無法控制該語句,我們就無法去寫特定的高效率的 sql。對於一些不
   太複雜的 sql 查詢, hibernate 可以很好幫我們完成, 但是, 對於特別複雜的查詢, hibernate
   就很難適應了,這時候用 ibatis 就是不錯的選擇,因為 ibatis 還是由我們自己寫 sql 語句。

40.MVC
   M 即Model(模型層),主要負責出來業務邏輯以及資料庫的互動
   V 即View(檢視層),主要用於顯示資料和提交資料
   C 即Controller(控制器),主要是用作捕獲請求並控制請求轉發

41.面試題:請解釋字串比較之中“==”和equals()的區別?

     ==:比較的是兩個字串記憶體地址(堆記憶體)的數值是否相等,屬於數值比較;
     equals():比較的是兩個字串的內容,屬於內容比較。

   以後進行字串相等判斷的時候都使用equals()。


42.Java中的記憶體
   部落格園:
   Java把記憶體分成兩種,一種叫做棧記憶體,一種叫做堆記憶體
   在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配。
   當在一段程式碼塊中定義一個變數時,java就在棧中為這個變數分配記憶體空間,
   當超過變數的作用域後,java會自動釋放掉為該變數分配的記憶體空間,該記憶體空間可以立刻被另作他用。
   
   堆記憶體用於存放由new建立的物件和陣列。
   在堆中分配的記憶體,由java虛擬機器自動垃圾回收器來管理。
   在堆中產生了一個陣列或者物件後,還可以在棧中定義一個特殊的變數,
   這個變數的取值等於陣列或者物件在堆記憶體中的首地址,在棧中的這個特殊的變數就變成了陣列或者物件的引用變數,
   以後就可以在程式中使用棧記憶體中的引用變數來訪問堆中的陣列或者物件,引用變數相當於為陣列或者物件起的一個別名,或者代號。

   引用變數是普通變數,定義時在棧中分配記憶體,引用變數在程式執行到作用域外釋放。
   而陣列&物件本身在堆中分配,即使程式執行到使用new產生陣列和物件的語句所在地程式碼塊之外,
   陣列和物件本身佔用的堆記憶體也不會被釋放,陣列和物件在沒有引用變數指向它的時候,才變成垃圾,不能再被使用,
   但是仍然佔著記憶體,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較佔記憶體的主要原因,實際上,
   棧中的變數指向堆記憶體中的變數,這就是 Java 中的指標! 

43.求2/1+3/2+5/3+8/5+13/8+......前100項和的小程式!
    package com.tsak;
    public class Test {
         public static void main(String[] args){
             double a=2;
             double b=1;
             double t;
             double sum=0;
             for(int i=1;i<=100;i++){
                double A=a/b;
                sum=sum+A;
                t=a;
                a=a+b;
                b=t;
           }
             System.out.println("前100項和為:sum="+sum);
        }
     }
    ----------------------------------------------------------------------
   
44.如何實現字串的反轉,如:輸入abc,輸出cba  
   String str = "abc";
   String reStr = new StringBuilder(str).reverse().toString();

45.儲存過程


46.內連線(等值連線)(部落格園)
   外連線
     左外連線(左連線):是以左表為基準,將a.stuid = b.stuid的資料進行連線,然後將左表沒有的對應項顯示,右表的列為NULL
     右外連線(右連線):是以右表為基準,將a.stuid = b.stuid的資料進行連線,然以將右表沒有的對應項顯示,左表的列為NULL
     全外連線(全連線):完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。

47.建檢視語句(部落格園)
   建立檢視的語法

   CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
      VIEW view_name [(column_list)]
      AS select_statement
      [WITH [CASCADED | LOCAL] CHECK OPTION]

   其中,CREATE:表示新建檢視;

   REPLACE:表示替換已有檢視

   ALGORITHM :表示檢視選擇演算法

   view_name :檢視名

   column_list:屬性列

   select_statement:表示select語句

   [WITH [CASCADED | LOCAL] CHECK OPTION]參數列示檢視在更新時保證在檢視的許可權範圍之內
   
48.索引(部落格園)
   索引的優點:

   1、通過建立唯一索引,保證資料庫表每行資料的唯一性

   2、大大加快資料查詢速度

   3、在使用分組和排序進行資料查詢時,可以顯著減少查詢中分組和排序的時間

   索引的缺點:

   1、維護索引需要耗費資料庫資源

   2、索引需要佔用磁碟空間,索引檔案可能比資料檔案更快達到最大檔案尺寸

   3、當對錶的資料進行增刪改的時候,因為要維護索引,速度會受到影響

49.觸發器(部落格園)
   觸發器是一個特殊的儲存過程,不同的是儲存過程要用CALL來呼叫,而觸發器不需要使用CALL

   也不需要手工啟動,只要當一個預定義的事件發生的時候,就會被MYSQL自動呼叫。 

   建立觸發器

   法如下:

   CREATE TRIGGER trigger_name trigger_time trigger_event
       ON tbl_name FOR EACH ROW trigger_stmt

   觸發程式是與表有關的命名資料庫物件,當表上出現特定事件時,將啟用該物件。 

50.sql注入(程式設計師的sql經典)
   對付 SQL 注入漏洞有兩種方式:過濾敏感字元和使用引數化 SQL。

51.sql優化(部落格園)
   1.建立必要的索引
   2.使用預編譯查詢
   3.調整 WHERE 子句中的連線順序
   4. SELECT 語句中避免使用'*'
   5.儘量將多條 SQL 語句壓縮到一句 SQL 中
   6.用 Where 子句替換 HAVING 子句
   7.使用表的別名
   8.用 EXISTS 替代 IN
   9.。。。略

52.單元測試(部落格園)
   單元測試是開發者編寫的一小段程式碼,用於檢驗被測程式碼的一個很小的、很明確的功能是否正確。
   通常而言,一個單元測試是用於判斷某個特定條件(或者場景)下某個特定函式的行為。
   例如,你可能把一個很大的值放入一個有序list 中去,然後確認該值出現在list 的尾部。
   或者,你可能會從字串中刪除匹配某種模式的字元,然後確認字串確實不再包含這些字元了。

53.設計模式


54.springMVC和struts2的區別


55.SSH(部落格園)
   Struts作為系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,控制業務跳轉,利用Hibernate框架對持久層提供支援,
   Spring做管理,管理struts和hibernate。具體做法是:用物件導向的分析方法根據需求提出一些模型,
   將這些模型實現為基本的Java物件,然後編寫基本的DAO(Data Access Objects)介面,並給出Hibernate的DAO實現,
   採用Hibernate架構實現的DAO類來實現Java類與資料庫之間的轉換和訪問,最後由Spring做管理,管理struts和hibernate。

   ------------
   部落格園
   整合SSH框架的系統框架圖如圖4所示,系統從職責上分為四層:表示層、業務邏輯層、資料持久層和域模組層。
   其中使用Struts作為系統的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,利用Hibernate框架對持久層提供支援,
   業務層用Spring支援。具體做法是:用物件導向的分析方法根據需求提出一些模型,將這些模型實現為基本的Java物件,
   然後編寫基本的DAO介面,並給出Hibernate的DAO實現,
   採用Hibernate架構實現的DAO類來實現Java類與資料庫之間的轉換和訪問,最後由Spring完成業務邏輯。

   系統的基本業務流程是: 在表示層中,首先通過JSP頁面實現互動介面,負責傳送請求(Request)和接收響應(Response),
   然後Struts根據配置檔案(struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理。
   在業務層中,管理服務元件的Spring IoC容器負責向Action提供業務模型(Model)元件和該元件的協作物件資料處理(DAO)元件完成業務邏輯,
   並提供事務處理、緩衝池等容器元件以提升系統效能和保證資料的完整性。
   而在持久層中,則依賴於Hibernate的物件化對映和資料庫互動,處理DAO元件請求的資料,並返回處理結果。

56.MongoDB(部落格園)
   非關係型資料庫
   NoSQL採用的是對集合(類似"表")中的文件(類似於"行")進行動態追加,在建立集合之初不會對資料型別進行限定,
   任何文件都可以追加到任何集合中去,例如我們可以將這樣兩條文件新增到一個集合中去:
   {"name" : "John", "song" : "Come Together"}

   {"name" : "小明",  "age":"20", "email" : "xiaoming@111.com"}

   MongoDB中文件的格式類似於我們常見的JSON,由此可見,我們第一個擁有"name"、"song"兩個欄位,
   而第二個擁有"name"、"age"、"email"三個欄位,這在預設計模式中的資料庫是不可能插入成功的,
   但在MongoDB的動態模式是可以的,這樣做的優勢是我們不必為一些數量很少,
   但種類很多的欄位單獨設計一張表,可以將他們集中在單獨一張表進行儲存,
   但這樣做的弊病也是顯而易見的,我們在獲取資料時需要對同一張表的不同文件進行區分,
   增加了開發上的程式碼量。所以在設計之初需要權衡動態模式的優劣來選擇表中的資料型別。

57.mybatis和hibernate本質區別和應用場景(Springmvc+Mybatis由淺入深全套視訊教程)
   hibernate:是一個標準ORM框架(物件關係對映)。入門門檻較高的,不需要程式寫sql,sql語句自動生成了。
   對sql語句進行優化、修改比較困難的。
   應用場景:
	適用與需求變化不多的中小型專案,比如:後臺管理系統,erp、orm、oa。。

   mybatis:專注是sql本身,需要程式設計師自己編寫sql語句,sql修改、優化比較方便。mybatis是一個不完全 的ORM框架,雖然程式設計師自己寫sql,mybatis 也可以實現對映(輸入對映、輸出對映)。
   應用場景:
	適用與需求變化較多的專案,比如:網際網路專案。

   企業進行技術選型,以低成本 高回報作為技術選型的原則,根據專案組的技術力量進行選擇。


58.資料型別(掌握)
	(1)Java是一種強型別語言,針對每種資料都提供了對應的資料型別。
	(2)分類:
		A:基本資料型別:4類8種
		B:引用資料型別:類,介面,陣列。
	(3)基本資料型別
		A:整數			佔用位元組數
			byte			1
			short			2
			int 			4
			long			8
		B:浮點數
			float			4
			double			8
		C:字元
			char			2
		D:布林
			boolean			1
			
		注意:
			整數預設是int型別,浮點數預設是double。
			
			長整數要加L或者l。
			單精度的浮點數要加F或者f。
59.Java的記憶體分配
		A:棧 儲存區域性變數
		B:堆 儲存所有new出來的
		C:方法區(物件導向部分詳細講解)
		D:本地方法區(系統相關)
		E:暫存器(CPU使用)
		
		注意:
			a:區域性變數 在方法定義中或者方法宣告上定義的變數。
			b:棧記憶體和堆記憶體的區別
				棧:資料使用完畢,就消失。
				堆:每一個new出來的東西都有地址
				    每一個變數都有預設值
						byte,short,int,long 0
						float,double 0.0
						char '\u0000'
						boolean false
						引用型別 null
				    資料使用完畢後,在垃圾回收器空閒的時候回收。
   
60.Java中的引數傳遞問題
		Java中只有值傳遞。
		
		基本型別:形式引數的改變不影響實際引數
		引用型別:形式引數的改變直接影響實際引數

61.成員變數和區域性變數的區別(理解)
	(1)在類中的位置不同
		成員變數:類中方法外
		區域性變數:方法定義中或者方法宣告上
	(2)在記憶體中的位置不同
		成員變數:在堆中
		區域性變數:在棧中
	(3)生命週期不同
		成員變數:隨著物件的建立而存在,隨著物件的消失而消失
		區域性變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
	(4)初始化值不同
		成員變數:有預設值
		區域性變數:沒有預設值,必須定義,賦值,然後才能使用

62.程式碼:Student s = new Student();做了哪些事情?(理解)
	(1)把Student.class檔案載入到記憶體
	(2)在棧記憶體為s開闢空間
	(3)在堆記憶體為學生物件申請空間
	(4)給學生的成員變數進行預設初始化。null,0
	(5)給學生的成員變數進行顯示初始化。林青霞,27
	(6)通過構造方法給成員變數進行初始化。劉意,30
	(7)物件構造完畢,把地址賦值給s變數

63.static關鍵字(理解)
	(1)靜態的意思。可以修飾成員變數和成員方法。
	(2)靜態的特點:
		A:隨著類的載入而載入
		B:優先與物件存在
		C:被類的所有物件共享
			這其實也是我們判斷該不該使用靜態的依據。
			舉例:飲水機和水杯的問題思考
		D:可以通過類名呼叫
			既可以通過物件名呼叫,也可以通過類名呼叫,建議通過類名呼叫。
	(3)靜態的記憶體圖
		靜態的內容在方法區的靜態區
	(4)靜態的注意事項;
		A:在靜態方法中沒有this物件
		B:靜態只能訪問靜態(程式碼測試過)
	(5)靜態變數和成員變數的區別
		A:所屬不同
			靜態變數:屬於類,類變數
			成員變數:屬於物件,物件變數,例項變數
		B:記憶體位置不同
			靜態變數:方法區的靜態區
			成員變數:堆記憶體
		C:生命週期不同
			靜態變數:靜態變數是隨著類的載入而載入,隨著類的消失而消失
			成員變數:成員變數是隨著物件的建立而存在,隨著物件的消失而消失
		D:呼叫不同
			靜態變數:可以通過物件名呼叫,也可以通過類名呼叫
			成員變數:只能通過物件名呼叫

64.final關鍵字(掌握)
	面試:
        用final關鍵字修飾物件變數,只是不允許這個物件引用再指向其他的物件,但是這個引用所指向的物件的內容是可以改變的。!!!
	部落格園:
        需要注意的是,如果將引用型別(任何類的型別)的變數標記為 final,
        那麼該變數不能指向任何其它物件。但可以改變物件的內容,因為只有引用本身是 final 的。

	(1)是最終的意思,可以修飾類,方法,變數。
	(2)特點:
		A:它修飾的類,不能被繼承。
		B:它修飾的方法,不能被重寫。
		C:它修飾的變數,是一個常量。
	(3)面試相關:
		A:區域性變數
			a:基本型別 值不能發生改變
			b:引用型別 地址值不能發生改變,但是物件的內容是可以改變的
		B:初始化時機
			a:只能初始化一次。
			b:常見的給值
				定義的時候。(推薦)
				構造方法中。
65.形式引數和返回值的問題(理解)
	(1)形式引數:
		類名:需要該類的物件
		抽象類名:需要該類的子類物件
		介面名:需要該介面的實現類物件
	(2)返回值型別:
		類名:返回的是該類的物件
		抽象類名:返回的是該類的子類物件
		介面名:返回的是該介面的實現類的物件
	(3)鏈式程式設計
		物件.方法1().方法2().......方法n();
		
		這種用法:其實在方法1()呼叫完畢後,應該一個物件;
			      方法2()呼叫完畢後,應該返回一個物件。
				  方法n()呼叫完畢後,可能是物件,也可以不是物件。

66.許可權修飾符(掌握)
	(1)許可權修飾符
				本類	同一個包下	不同包下的子類	不同包下的無關類
		private		Y
		預設		Y	        Y
		protected	Y		Y		Y
		public		Y		Y		Y	Y
	(2)這四種許可權修飾符在任意時刻只能出現一種。
		public class Demo {}	

67.面試題 
			==和equals()的區別?
			A:==
				基本型別:比較的是值是否相同
				引用型別:比較的是地址值是否相同
			B:equals()
				只能比較引用型別。預設情況下,比較的是地址值是否相同。
				但是,我們可以根據自己的需要重寫該方法。

68.String類的概述和使用(掌握)
	(1)多個字元組成的一串資料。
		其實它可以和字元陣列進行相互轉換。
	(2)構造方法:
		A:public String()
		B:public String(byte[] bytes)
		C:public String(byte[] bytes,int offset,int length)
		D:public String(char[] value)
		E:public String(char[] value,int offset,int count)
		F:public String(String original)
		下面的這一個雖然不是構造方法,但是結果也是一個字串物件
		G:String s = "hello";
	(3)字串的特點
		A:字串一旦被賦值,就不能改變。
			注意:這裡指的是字串的內容不能改變,而不是引用不能改變。
		B:字面值作為字串物件和通過構造方法建立物件的不同
			String s = new String("hello");和String s = "hello"的區別?
			有。前者會建立2個物件,後者建立1個物件。
	(4)字串的面試題(看程式寫結果)
		A:==和equals()
			String s1 = new String("hello");
			String s2 = new String("hello");
			System.out.println(s1 == s2);// false
			System.out.println(s1.equals(s2));// true

			String s3 = new String("hello");
			String s4 = "hello";
			System.out.println(s3 == s4);// false
			System.out.println(s3.equals(s4));// true

			String s5 = "hello";
			String s6 = "hello";
			System.out.println(s5 == s6);// true
			System.out.println(s5.equals(s6));// true
		B:字串的拼接
			String s1 = "hello";
			String s2 = "world";
			String s3 = "helloworld";
			System.out.println(s3 == s1 + s2);// false
			System.out.println(s3.equals((s1 + s2)));// true

			System.out.println(s3 == "hello" + "world");// false 這個我們錯了,應該是true
			System.out.println(s3.equals("hello" + "world"));// true
	(5)字串的功能(自己補齊方法中文意思)
		A:判斷功能
			boolean equals(Object obj)
			boolean equalsIgnoreCase(String str)
			boolean contains(String str)
			boolean startsWith(String str)
			boolean endsWith(String str)
			boolean isEmpty()
		B:獲取功能
			int length()
			char charAt(int index)
			int indexOf(int ch)
			int indexOf(String str)
			int indexOf(int ch,int fromIndex)
			int indexOf(String str,int fromIndex)
			String substring(int start)
			String substring(int start,int end)
		C:轉換功能
			byte[] getBytes()
			char[] toCharArray()
			static String valueOf(char[] chs)
			static String valueOf(int i)
			String toLowerCase()
			String toUpperCase()
			String concat(String str)
		D:其他功能
			a:替換功能 
				String replace(char old,char new)
				String replace(String old,String new)
			b:去空格功能
				String trim()
			c:按字典比較功能
				int compareTo(String str)
				int compareToIgnoreCase(String str) 

69.部落格園
   什麼是JavaBean?

  JavaBean 是一種JAVA語言寫成的可重用元件,本質上是一個類,具有以下特性:

    它是一個public型別的類,屬性則為private型別的,通過public的方法暴露給其它程式
    必須具有一個無參的建構函式
    提供setXXX()方法和getXXX()方法讓外部程式設定和獲取JavaBean屬性

  一個JavaBean主要由三個部分組成:

    屬性:是JavaBean元件內部狀態的抽象表示
    方法:就是通常的Java方法,預設情況下所有的方法都可以被外部呼叫
    事件:Bean與其他軟體組織交流資訊的主要方式是傳送和接收事件

70.StringBuffer(掌握)
	(1)用字串做拼接,比較耗時並且也耗記憶體,而這種拼接操作又是比較常見的,為了解決這個問題,Java就提供了
	   一個字串緩衝區類。StringBuffer供我們使用。
	(2)StringBuffer的構造方法
		A:StringBuffer()
		B:StringBuffer(int size)
		C:StringBuffer(String str)
	(3)StringBuffer的常見功能(自己補齊方法的宣告和方法的解釋)
		A:新增功能
		B:刪除功能
		C:替換功能
		D:反轉功能
		E:擷取功能(注意這個返回值)
	(4)StringBuffer的練習(做一遍)
		A:String和StringBuffer相互轉換
			String -- StringBuffer
				構造方法
			StringBuffer -- String
				toString()方法
		B:字串的拼接
		C:把字串反轉
		D:判斷一個字串是否對稱
	(5)面試題
		小細節:
			StringBuffer:同步的,資料安全,效率低。
			StringBuilder:不同步的,資料不安全,效率高。
		A:String,StringBuffer,StringBuilder的區別
		B:StringBuffer和陣列的區別?
	(6)注意的問題:
		String作為形式引數,StringBuffer作為形式引數。

71.List集合的特有遍歷功能
		A:由size()和get()結合。
		B:程式碼演示
					//建立集合物件
					List list = new ArrayList();
					
					//建立並新增元素
					list.add("hello");
					list.add("world");
					list.add("java");
					
					//遍歷集合
					Iterator it = list.iterator();
					while(it.hasNext()) {
						String s =(String) it.next();
						System.out.println(s);
					}
					System.out.println("----------");
					
					for(int x=0; x<list.size(); x++) {
						String s =(String) list.get(x);
						System.out.println(s);
					}
   (6)常見資料結構
		A:棧 先進後出
		B:佇列 先進先出
		C:陣列 查詢快,增刪慢
		D:連結串列 查詢慢,增刪快
   (7)List的子類特點(面試題)
		ArrayList
			底層資料結構是陣列,查詢快,增刪慢。
			執行緒不安全,效率高。
		Vector
			底層資料結構是陣列,查詢快,增刪慢。
			執行緒安全,效率低。
		LinkedList
			底層資料結構是連結串列,查詢慢,增刪快。
			執行緒不安全,效率高。
72.Collection
		|--List	有序,可重複
			|--ArrayList
				底層資料結構是陣列,查詢快,增刪慢。
				執行緒不安全,效率高
			|--Vector
				底層資料結構是陣列,查詢快,增刪慢。
				執行緒安全,效率低
			|--LinkedList
				底層資料結構是連結串列,查詢慢,增刪快。
				執行緒不安全,效率高
		|--Set	無序,唯一
			|--HashSet
				底層資料結構是雜湊表。
				如何保證元素唯一性的呢?
					依賴兩個方法:hashCode()和equals()
					開發中自動生成這兩個方法即可
				|--LinkedHashSet
					底層資料結構是連結串列和雜湊表
					由連結串列保證元素有序
					由雜湊表保證元素唯一
			|--TreeSet
				底層資料結構是紅黑樹。
				如何保證元素排序的呢?
					自然排序
					比較器排序
				如何保證元素唯一性的呢?
					根據比較的返回值是否是0來決定

73.Map(掌握)
	(1)將鍵對映到值的物件。一個對映不能包含重複的鍵;每個鍵最多隻能對映到一個值。 
	(2)Map和Collection的區別?
		A:Map 儲存的是鍵值對形式的元素,鍵唯一,值可以重複。夫妻對
		B:Collection 儲存的是單獨出現的元素,子介面Set元素唯一,子介面List元素可重複。光棍
	(3)Map介面功能概述(自己補齊)
		A:新增功能
		B:刪除功能
		C:判斷功能
		D:獲取功能
		E:長度功能
	(4)Map集合的遍歷
		A:鍵找值
			a:獲取所有鍵的集合
			b:遍歷鍵的集合,得到每一個鍵
			c:根據鍵到集合中去找值
		
		B:鍵值對物件找鍵和值
			a:獲取所有的鍵值對物件的集合
			b:遍歷鍵值對物件的集合,獲取每一個鍵值對物件
			c:根據鍵值對物件去獲取鍵和值
			
		程式碼體現:
			Map<String,String> hm = new HashMap<String,String>();
			
			hm.put("it002","hello");
			hm.put("it003","world");
			hm.put("it001","java");
			
			//方式1 鍵找值
			Set<String> set = hm.keySet();
			for(String key : set) {
				String value = hm.get(key);
				System.out.println(key+"---"+value);
			}
			
			//方式2 鍵值對物件找鍵和值
			Set<Map.Entry<String,String>> set2 = hm.entrySet();
			for(Map.Entry<String,String> me : set2) {
				String key = me.getKey();
				String value = me.getValue();
				System.out.println(key+"---"+value);
			}

74.單點登入(Single sign-on,SSO)是一種訪問控制,在多個軟體應用中,使用者只需登入其中一個應用,就可以成功訪問其他應用;
   同樣,使用者只需登出其中一個應用,就可以成功登出其他應用。

   當一個公司產品線越來越複雜,做的東西越來越多,考慮到使用者的便利性和業務的交集,單點登入也就變得越來越必然。
   譬如,阿里巴巴中的淘寶網,天貓,聚划算和一淘,考慮下面的場景:我們使用者登入淘寶網購物,緊接著朋友打電話說出去玩,
   於是開啟聚划算的時候你會發現,你已經登了聚划算!可能這些細節都被大多數人忽略了(被誰給慣壞了),
   但如果要讓使用者再次手動登入聚划算,使用者體驗可想而知。這種便利性就是單點登入所帶來的。

   在單點登入中,認證系統會為每一個應用分配一把鑰匙,也就是說有了這把鑰匙,賬號密碼的輸入就可以免去了。這把鑰匙就藏在瀏覽器的 cookie 中。

75.SVN命令:
   1、檢出 co
   2、匯出 export  
   3、新增新檔案 add
   4、提交 commit
   5、更新檔案 update
   6、刪除檔案 delete
   7、加鎖/解鎖 lock unlock
   8、比較差異 diff 
   ...
   15、恢復本地修改 revert
   17、解決衝突 resolved
   20、合併內容到分支 merge

76.Oracle安裝後的優化配置(雲融網)

77.表空間:
   Oracle資料庫是通過表空間來儲存物理表的,一個資料庫例項可以有N個表空間,一個表空間下可以有N張表。

   有了資料庫,就可以建立表空間。

   表空間(tablespace)是資料庫的邏輯劃分,每個資料庫至少有一個表空間(稱作SYSTEM表空間)。為了便於管理和提高執行效率,可以使用一些附加表空間來劃分使用者和應用程式。例如:USER表空間供一般使用者使用,RBS表空間供回滾段使用。一個表空間只能屬於一個資料庫。

   建立表空間語法:

   Create TableSpace 表空間名稱  
   DataFile          表空間資料檔案路徑  
   Size              表空間初始大小  
   Autoextend on

   如:

   create tablespace db_test  
   datafile 'D:\oracle\product\10.2.0\userdata\db_test.dbf'  
   size 50m  
   autoextend on;

   檢視已經建立好的表空間:

   select default_tablespace, temporary_tablespace, d.username  
   from dba_users d

   使用者:

   Oracle資料庫建好後,要想在資料庫裡建表,必須先為資料庫建立使用者,併為使用者指定表空間。

   上面我們建好了資料庫和表空間,接下來建使用者:

   建立新使用者:

   CREATE USER          使用者名稱  
   IDENTIFIED BY        密碼  
   DEFAULT TABLESPACE   表空間(預設USERS)  
   TEMPORARY TABLESPACE 臨時表空間(預設TEMP) 

   如:

   CREATE USER utest  
   IDENTIFIED BY utestpwd  
   DEFAULT TABLESPACE db_test  
   TEMPORARY TABLESPACE temp;(這裡臨時表空間不能使用我們建立的db_test,不知為何?) 

   有了使用者,要想使用使用者賬號管理自己的表空間,還得給它分許可權:

   GRANT CONNECT TO utest;  
   GRANT RESOURCE TO utest;  
   GRANT dba TO utest;--dba為最高階許可權,可以建立資料庫,表等。

   檢視資料庫使用者:

   select  * from dba_users;

   表:
   有了資料庫,表空間和使用者,就可以用自定義的使用者在自己的表空間建立表了。有了表,我們可以開發了。

78.使用分割槽方式建立的表叫分割槽表

   範圍分割槽
   每個分割槽都由一個分割槽鍵值範圍指定(對於一個以日期列作為分割槽鍵的表,“2005 年 1 月”分割槽包含分割槽鍵值為從“2005 年 1 月 1 日”
   到“2005 年 1 月 31 日”的行)。

   列表分割槽
   每個分割槽都由一個分割槽鍵值列表指定(對於一個地區列作為分割槽鍵的表,“北美”分割槽可能包含值“加拿大”“美國”和“墨西哥”)。

   分割槽功能通過改善可管理性、效能和可用性,從而為各式應用程式帶來了極大的好處。
   通常,分割槽可以使某些查詢以及維護操作的效能大大提高。此外,分割槽還可以極大簡化常見的管理任務。
   通過分割槽,資料庫設計人員和管理員能夠解決前沿應用程式帶來的一些難題。分割槽是構建千兆位元組資料系統或超高可用性系統的關鍵工具。

   ----------------------
   在大量業務資料處理的專案中,可以考慮使用分割槽表來提高應用系統的效能並方便資料管理,本文詳細介紹了分割槽表的使用。
 
  在大型的企業應用或企業級的資料庫應用中,要處理的資料量通常可以達到幾十到幾百GB,有的甚至可以到TB級。雖然儲存介質和資料處理技術的發展也很快,但是仍然不能滿足使用者的需求,為了使使用者的大量的資料在讀寫操作和查詢中速度更快,Oracle提供了對錶和索引進行分割槽的技術,以改善大型應用系統的效能。

  使用分割槽的優點:

 ·增強可用性:如果表的某個分割槽出現故障,表在其他分割槽的資料仍然可用;

 ·維護方便:如果表的某個分割槽出現故障,需要修復資料,只修復該分割槽即可;

 ·均衡I/O:可以把不同的分割槽對映到磁碟以平衡I/O,改善整個系統效能;

 ·改善查詢效能:對分割槽物件的查詢可以僅搜尋自己關心的分割槽,提高檢索速度。 

79.索引:
   “索引(Index)提供查詢的速度”這是對索引的最基本的解釋,接下來我們將通過介紹索引的組成,讓大家對索引有更深入的理解。

   索引是資料庫中的一個獨特的結構,由於它儲存資料庫資訊,那麼我們就需要給它分配磁碟空間和維護索引表。
   建立索引並不會改變表中的資料,它只是建立了一個新的資料結構指向資料表;打個比方,平時我們使用字典查字時,
   首先我們要知道查詢單詞起始字母,然後翻到目錄頁,接著查詢單詞具體在哪一頁,這時我們目錄就是索引表,而目錄項就是索引了。

   當然,索引比字典目錄更為複雜,因為資料庫必須處理插入,刪除和更新等操作,這些操作將導致索引發生變化。

   索引的型別:

   我們知道索引的型別有兩種:聚集索引和非聚集索引。

   聚集索引:物理儲存按照索引排序。

   非聚集索引:物理儲存不按照索引排序。 

80.hibernate的關係維護配置:(雲融網)
   專案中沒有使用到

81.Tomcat埠號配置在什麼檔案中:server.xml

82.spring事務
   

83.spring整合Quartz定時任務
   在JavaEE系統中,我們會經常用到定時任務,比如每天凌晨生成前天報表,每一小時生成彙總資料等等。
   我們可以使用java.util.Timer結合java.util.TimerTask來完成這項工作,但時排程控制非常不方便,並且我們需要大量的程式碼。
   使用Quartz框架無疑是非常好的選擇,並且與Spring可以非常方便的整合
 

84.oracle行列轉換(部落格園)

JOB 	10(DEPTNO) 	20(DEPTNO) 	30(DEPTNO) 	40(DEPTNO)
CLERK 	   1 	          2 	            1 	             0
SALESMAN   0 	          0 	            4 	             0
PRESIDENT  1 	          0 	            0 	             0
MANAGER    1 	          1 	            1 	             0
ANALYST    0 	          2 	            0 	             0


一、經典的實現方式(其他的暫時略過)

主要是利用decode函式、聚合函式(如max、sum等)、group by分組實現的
  select t.job, count(decode(t.deptno, '10', 1)) as "10(DEPTNO)",
       count(decode(t.deptno, '20', 1)) as "20(DEPTNO)",
       count(decode(t.deptno, '30', 1)) as "30(DEPTNO)",
       count(decode(t.deptno, '40', 1)) as "40(DEPTNO)"
  from scott.emp t
  group by t.job;


85.在oracle中varchar和varchar2有什麼區別?(上海大域南京分公司)
1.varchar2把所有字元都佔兩位元組處理(一般情況下),varchar只對漢字和全形等字元佔兩位元組,數字,英文字元等都是一個位元組; 
2.VARCHAR2把空串等同於null處理,而varchar仍按照空串處理; 
3.VARCHAR2字元要用幾個位元組儲存,要看資料庫使用的字符集, 大部分情況下建議使用varchar2型別,可以保證更好的相容性。


varchar是ANSI SQL標準的資料型別,Oracle作為SQL資料庫對其提供部分支援。
兩者的不同點是:ANSI標準的varchar可以儲存空字串,而Oracle並不區分空字串和NULL(也就是把空字串做為NULL處理)。
因為Oracle保留在未來對ANSI標準提供完全支援的權利,所以可能會出現允許varchar中儲存空字串,或者隨著ANSI標準的修訂而變更varchar型別定義的情況。因此Oracle中的varchar型別不能保證始終向前相容。varchar2是Oracle特有的資料型別,不會受到外界標準的影響,可以在Oracle內部保證向前相容。
常見的9i和10g中,varchar與varchar2是同義詞,二者完全一致。但由於上述原因,Oracle不推薦使用varchar型別。11g我不清楚,細節請查閱相關文件。


86.springmvc和struts2的區別
 
1. 機制:spring mvc的入口是servlet,而struts2是filter(這裡要指出,filter和servlet是不同的。以前認為filter是servlet的一種特殊),這樣就導致了二者的機制不同,這裡就牽涉到servlet和filter的區別了。

2. 執行緒安全:struts2執行緒安全,springmvc執行緒不安全

3. 引數傳遞:sturts是基於類,每次發一次請求都會例項一個action,然後呼叫setter getter方法把request中的資料注入.一個Action物件對應一個request上下文。

                   spring3 mvc是方法級別的攔截,攔截到方法後根據引數上的註解,把request資料通過反射注入進去,一個方法對應一個request上下文。

4. 設計思想上:struts更加符合oop的程式設計思想, spring就比較謹慎,在servlet上擴充套件。

 
5. intercepter的實現機制:struts有以自己的interceptor機制,spring mvc用的是獨立的AOP方式。這樣導致struts的配置檔案量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。

    spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上spring3 mvc就容易實現restful url。     struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,因為struts2 action的一個方法可以對應一個url;而其類屬性卻被所有方法共享,這也就無法用註解或其他方式標識其所屬方法了。

     spring3 mvc的方法之間基本上獨立的,獨享request response資料,請求資料通過引數獲取,處理結果通過ModelMap交回給框架方法之間不共享變數,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其所有Action變數是共享的,這不會影響程式執行,卻給我們編碼,讀程式時帶來麻煩。

 
6. 另外,spring3 mvc的驗證也是一個亮點,支援JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,然後直接返回響應文字即可。


87.江蘇欣網視訊面試,上午面試完,下午就收到通知了
先是筆試,問題不難,基本上都是java面試寶典上的,還有些可以從網上找到,說明這些都是常見的面試問題
現在整理如下:

1.java如何呼叫c   我百度了下,好像是JNT技術

2.char型變數中能不能儲存一箇中文漢子

2.什麼是java序列化,如何實現java序列化

3.final finally finalize的區別 java面試寶典上的

4.short s1=1 s1=s1+1 s1+=1有什麼錯

5.說出arraylist vector linklist的儲存效能

6.abstract class和interface的區別

7.java語言如何進行異常處理,關鍵字throws throw try,catch,finally分別代表什麼意思

8.什麼時候用asssert  我百度了下:斷言

9.當一個物件被當作引數傳遞到一個方法後,此方法可以改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞

10.string和stringbuffer的區別

11.sleep和wait的區別

12.值傳遞

7.程式設計題目:
   
   1.設計一方法來實現:輸入兩長度相等字串,然後檢查是否兩字串包含相同字元的的子串(大於2字串)。。。
   2.設計四個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1


相關文章