Java小知識

內部類分為: 成員內部類、靜態嵌套類、方法內部類、匿名內部類。
(1)、內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號。
(2)、內部類不能用普通的方式訪問。成員變量成員變量靜態成員變量
?
List遍歷:
Iterator itr = list.iterator();
while (itr.hasNext())
{
Object nextObj = itr.next();
}
或:
for(int i=0;i<lists.size();i++)???
?{
??????????? System.out.println(lists.get(i));?
?}
或:
for(Long string : lists)??
{
??????????? System.out.println(string);?
}

synchronize線程同步
?
java有幾種類型的流?
從輸入輸出方面來講有: 輸入流 輸出流。從流的內容上來講有:字節流 字符流。
?
Java中靜態變量與實例變量的區別。
java類的成員變量有倆種:一種是被static關鍵字修飾的變量,叫類變量或者靜態變量;另一種沒有static修飾,為實例變量。

在程序運行時的區別:實例變量屬于某個對象的屬性,必須創建了實例對象,其中的實例變 量才會被分配空間,才能使用這個實例變量。靜態變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節碼,不用創建任何實例對 象,靜態變量就會被分配空間,靜態變量就可以被使用了。總之,實例變量必須創建對象后才可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。

類的靜態變量在內存中只有一個,靜態變量可以直接通過類名進行訪問,其生命周期取決于類的生命周期。

而實例變量取決于類的實例。每創建一個實例,java虛擬機就會為實例變量分配一次內存,實例變量位于堆區中,其生命周期取決于實例的生命周期。

java序列化

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸于網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序 列化的類實現Serializable接口,然后使用一個輸出流(如:FileOutputStream)來構造一個 ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

簡單說就是為了保存在內存中的各種對象的狀態,并且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存Object States,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化
什么情況下需要序列化
a)當你想把的內存中的對象保存到一個文件中或者數據庫中時候;
b)當你想用套接字在網絡上傳送對象的時候;
c)當你想通過RMI傳輸對象的時候;

static方法調用非static方法只能通過創建(new)新對象的方式,否則不能調用。

?

寫clone()方法時,通常都有一行代碼,是什么?

super.clone();

?

List Map Set區別及特點。

List特點:元素有放入順序,元素可重復(LinkedList,ArrayList,Vector )。
Map特點:元素按鍵值對存儲,無放入順序(HashMap,HashTable,LinkeHashMap)

HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null
Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)

List和Set是繼承自collection的,而Map不是。?

聚合、組合區別。

聚合:兩個對象之間是整體和部分的弱關系,可以超越、分開。

組合:兩個對象之間是整體和部分的強關系,不能超越、分開。

?

UML面向對象中包括哪些圖及每件圖的作用

UML中包括九種圖:用例圖、類圖、對象圖、狀態圖、時序圖、協作圖、活動圖、組件圖、配置圖。

對象之間的關系:

1、依賴關系(Dependence)

假設A類的變化引起了B類的變化,則說名B類依賴于A類。

依賴關系有如下三種情況:

1、A類是B類的一個成員變量;

2、A類是B類方法當中的一個參數;

3、A類向B類發送消息,從而影響B類發生變化

使用帶箭頭的虛線表示

2、泛化關系(Generalization):UML對象圖和類圖的泛化關系A是B和C的父類,B,C具有公共類(父類)A,說明A是B,C的一般化(概括,也稱泛化)

在UML當中,對泛化關系有三個要求:

1、子類與父類應該完全一致,父類所具有的屬性、操作,子類應該都有;

2、子類中除了與父類一致的信息以外,還包括額外的信息;

3、可以使用父類的實例的地方,也可以使用子類的實例;

使用帶空心三角形的實線表示

3、關聯關系(Association):類之間 的聯系,如籃球隊員與球隊之間的關聯(下圖所示)。其中,關聯兩邊的"employee"和“employer”標示了兩者之間的關系,而數字表示兩者的 關系的限制,是關聯兩者之間的多重性。通常有“*”(表示所有,不限),“1”(表示有且僅有一個),“0...”(表示0個或者多個),“0,1”(表 示0個或者一個),“n...m”(表示n到m個都可以),“m...*”(表示至少m個)。

在關聯中有一種叫“限定關聯”,還有一種謂之自身關聯。另外,對象之間的關聯就沒那么復雜,只是將類的關聯實例化而已。

使用帶數字的實線表示

4、聚合關系(Aggregation):UML對象圖和類圖的聚合關系表示的是整體和部分的關系,整體與部分可以分開

如:電話機包括一個話筒

電腦包括鍵盤、顯示器,一臺電腦可以和多個鍵盤、多個顯示器搭配,確定鍵盤和顯示器是可以和主機分開的,主機可以選擇其他的鍵盤、顯示器組成電腦;

使用帶空心菱形的實線來表示

5、組合關系(Composition):UML對象圖和類圖的組合關系也是整體與部分的關系,但是整體與部分不可以分開

如:公司和部門,部門是部分,公司是整體,公司A的財務部不可能和公司B的財務部對換,就是說,公司A不能和自己的財務部分開;人與人的心臟

使用帶實心菱形的實線來表示

6、實現關系(Implementation):是用來規定接口和實線接口的類或者構建結構的關系,接口是操作的集合,而這些操作就用于規定類或者構建的一種服務。

使用帶空心三角形的虛線表示

?

判斷一個對象是否是已知類對象:

instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數據。舉個例子:
  String s = "I AM an Object!";
  boolean isObject = s instanceof Object;

Windows中進程之間同步方法:

1臨界區;2互斥量;3事件;4信號量。

?

JAVASERVLETAPI中forward()與redirect()的區別?

答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后 者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以 滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用 sendRedirect()方法。

?

JSP兩種跳轉方式分別是什么?有什么區別?
答:有兩種,分別為:<jsp:include page="included.jsp" flush="true">
<jsp:forward page="nextpage.jsp"/>
前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完后還會回來,相當于函數調用。并且可以帶參數.后者完全轉向新頁面,不會再回來。相當于go to語句。


JSP中動態INCLUDE與靜態INCLUDE的區別?
答:動態INCLUDE用jsp:include動作實現<jsp:include page="included.jsp"flush="true"/>它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面<% @include file="included.htm"%>

jsp有哪些動作?作用分別是什么?
答:JSP共有以下6種基本動作:
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記。

?

jsp有哪些內置對象?作用分別是什么?
答:JSP共有以下9種基本內置組件(可與ASP的6種內部組件相對應):
request用戶端請求,此請求會包含來自GET/POST請求的參數
response網頁傳回用戶端的回應
page Context網頁的屬性是在這里管理
session與請求有關的會話期
application servlet正在執行的內容
out用來傳送回應的輸出
config servlet的構架部件
page JSP網頁本身
exception針對錯誤網頁,未捕捉的例外。

?

ASP的6個內置對象:

session server cookies response request application。

寫出3種以上你所聽過或用過的j2ee應用服務器的名稱

RedHat 的JBoss,收費的有 BEA(現Oracle)的WebLogic和 IBM 的WebSphere。

?

分別用application,jsp,applet三種形式編寫輸出"hello world

1、application程序
public class a
{
??? public static void main(String args[])
??? {
??????? System.out.println("Hello World!");
??? }

}
2、applet程序
public class b extends java.applet.Applet
{
??? public paint(java.awt.Graphics g)
??? {
??????? g.outstring("Hello World!",10,10);
??? }
}
3、jsp程序
<%
??????? out.print("Hello World!");
%>
4、servlet程序
import javax.servlet.*;
public class c
{
????public void response(responseservlet r)
??? {
??????? r.response("Hello World!");
??? }
}

?

關于 final StringBuffer:

StringBuffer可以動態改變字符數據,那么如果定義了一個final的StringBuffer后,還可以改變字符數據嗎?例如下列代碼有錯誤嗎?
??? ??? final StringBuffer sb = new StringBuffer();
??? ??? sb.append("a");
??? ??? sb.append("b");
??? ??? System.out.println(sb.toString());

答案是:正確的。定義為final類型的數據是不可以修改的,那為啥上面的代碼為啥是正確的呢?我們要看一下final的定義了:對于基本類 型,final使數值恒定不變;而對于對象引用,final使引用恒定不變。一旦引用被初始化指向一個對象,就無法再把它改為指向另一個對象。然而,對象 其自身卻是可以被修改的,Java并未提供使任何對象恒定不變的途徑。

根據上面的定義,那么下面的代碼是錯誤的。
??? ??? final StringBuffer sb = new StringBuffer();
??? ??? sb.append("a");
??? ??? sb.append("b");
??? ??? System.out.println(sb.toString());

??????? sb = new StringBuffer();
因為變量sb定義為final類型的了,所以它的引用不能改變;所以sb = new StringBuffer();代碼是錯誤的,編譯不通過。

?

java數組初始化時如果定義:

int[] b;
System.out.println(b[0]);

則不能編譯通過,數組b未初始化;

如果定義:

int[] b=new int[5];
System.out.println(b[0]);

則編譯通過并輸出0。

?

wait一定要在同步塊中執行。

?

List arrayList = new ArrayList();
如果像上面這樣使用默認的構造方法,初始容量被設置為10。當ArrayList中的元素超過10個以后,會重新分配內存空間,使數組的大小增長到16。
容量變化的規則是什么呢?請看下面的公式:
((舊容量 * 3) / 2) + 1
注:這點與C#語言是不同的,C#當中的算法很簡單,是翻倍。

?

抽象方法僅有聲明,public abstract,沒有方法體。

?

當需要排序的集合或數組不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實現對象排序或自定義排序。

?

Map<String,String> map = new? HashMap<String,String>();

map.put("A","m");
System.out.println(map.get("a"));

如果沒有此元素則輸出null。

?

try
??{
???System.out.println("aaa");
??System.exit(0);
??}
??finally
??{System.out.println("bbb");}

輸出為:aaa。

?

java中嚴格來講不存在父線程、子線程。一個線程無法完全終止另一個線程,貨調用其sleep(),sleep()方法是程序來調用的。

?

java數組具有length屬性,而字符串具有length方法:

String s = "abcd";
System.out.println(s.length()); //打印字符串長度
String[] aa = {"abc", "123"};
System.out.println(aa.length); //注意,沒有括號了

首先你需要知道length和length()二者的區別,前者是屬性,后者是方法。
字符串用length()方法獲得長度,而數組是通過length屬性獲得長度。

java外部類需通過創建內部類對象訪問內部類成員或方法。

?

javac.exe編譯 java.exe解釋運行。

?

6^4<<2=22 (4<<2=16, 6^16(按位異或)=22)。

?

forward 服務器端的跳轉,地址欄不會改變
redirect 客戶端跳轉 地址欄會改變
forward是服務器內部重定向

forward:轉發頁面和轉發到的頁面可以共享request里面的數據.
redirect:不能共享數據.

forward:一般用于用戶登陸的時候,根據角色轉發到相應的模塊.

redirect:一般用于用戶注銷登陸時返回主頁面和跳轉到其它的網站等.

從效率來說
forward:高.
redirect:低.

?

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。
Overload的方法是可以改變返回值的類型。(但是不能只是返回類型不同,至少具備參數個數、參數類型、參數順序三者中的一項。)
override要求具有同樣的名稱及參數類型。

?

java輸出日期:

? Calendar cal = Calendar.getInstance();
??SimpleDateFormat sdf = new SimpleDateFormat("yyyy年-MM-dd HH:mm:ss");
??String cdate = sdf.format(cal.getTime());
??System.out.println("times is :"+cdate);
??或:

? Date date = new Date();
??DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
??String birthday = df.format(date);
??System.out.println(birthday);

?

??????? final—修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲
明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時
給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載

  finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執行,
然后控制就會進入 finally 塊(如果有的話)。

  finalize—方法名。Java技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。
這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

?

有這么兩個程序,
程序1:
class Insect{
private static int x1=printInit搜索("static Insect.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
private static int x2=printInit("static Beetle.x2 initialized");
public static void main(String[] args){}
}

程序2:
class Bowl{
Bowl(int marker){
System.out.println("Bowl ("+marker+")");
}
}
class Table{
static Bowl bowl1= new Bowl(1);
static Bowl bowl2= new Bowl(2);
}
public class StaticInitialization {
public static void main(String[] args){}
}

輸出結果:
程序1:
static Insect.x1 initialized
static Beetle.x2 initialized
程序2:


java虛擬機在首次主動使用類型的時候才會初始化(lazy-load的形式),主動使用包括以下6種情況

1. 創建類的實例
2. 調用類的靜態方法
3. 操作類的非常量靜態字段(非final static)
4. 調用特定的反射方法
5. 初始化一個類的子類
6. 指定一個類為虛擬機啟動時的初始化類

所以說,你必須主動使用到這個類,這個類才會被初始化,這就能解釋第一次有輸出,而第二次沒有輸出的情況了

另外,值得一提的是,加載和初始化不是一個概念,比如,在main函數中寫
Table a = null;
一樣不會有輸出。。Table類被加載了但是沒有被初始化,因為這不屬于上述6種“主動使用”情況之一。

?

static?int?printInit(String?s)
{
System.out.println(s);
return?47;
}

?

類初始化順序:靜態變量--->靜態初始化塊------>變量---->初始化塊----->構造器。

?

常用的O/R映射框架:

1、 Hibernate

2、 Apache OJB

3、 JDO(是SUN提出的一套標準—Java數據對象)

4、 Toplink(Orocle公司的)

5、 EJB(2.0X中有CMP;3.0X提出了一套“Java持久化API”---JPA)

6、 IBatis(非常的輕量級,對JDBC做了一個非常非常輕量級的包裝,嚴格說不是O/R映射框架,而是基于SQL的映射(提供了一套配置文件,把SQL語句配置到文件中,再配置一個對象進去,只要訪問配置文件時,就可得到對象))

?

?

?class?A
{????
????//3
????public?A()
????{
????????a1();
????}

????public?void?a1()
????{
????????System.out.println("A-a1");
????}

}

public?class?B?extends?A
{
????int?bb?=?0;
????//2
????public?B()????{
????????//5
????????bb?=?1000;
????}
????//4
????public?void?a1()
????{
????????System.out.println("bb?is?"?+?bb);
????????System.out.println("B-a1");
????}

????public?static?void?main(String[]?args)
????{
????????//1
????????new?B();
????}

}
執行結果:

bb is 0
B-a1

java中要讓一個方法不被子類覆蓋,應該怎么定義。

1)使用final方法,final方法可以把方法鎖定防止任何繼承類修改它的意義和實現。高效,編譯器在遇到調用final方法時會轉入內嵌機制,大大提高執行效率。

2)父類的私有方法不能被子類覆蓋。

3)父類的靜態方法不能被子類覆蓋為非靜態方法。

4)同上,父類的非靜態方法不能被子類覆蓋為靜態方法。

?

請說明java程序能在不同平臺運行的原理是怎樣的。

Java跨平臺是通過java虛擬機實現的,首先java編譯程序將源程序翻譯為JVM可執行的字節碼文件。Java解釋器則通過即時編譯及解釋執行兩種方式對字節碼文件進行執行。JVM是一種用于計算機設備的規范,它是一個虛擬出來的計算機是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM包含一套字節碼指令集,一組寄存器,一個棧一個垃圾回收堆和一個存儲方法域。JVM屏蔽了與具體操作系統平臺相關的信息,這樣java程序只需要生成JVM所需要的字節碼文件即可。JVM負責將字節碼文件翻譯為具體平臺上執行的機器指令運行。也就保證了java程序能在不同平臺實現運行。

?

public static 和 static public順序可以調換。

?

System.out.println(6 + 6 + "(Result)");

輸出:12(Result)

?

substring(int?beginIndex, int?endIndex)

返回一個新字符串,它是此字符串的一個子字符串。該子字符串從指定的 beginIndex 處開始,直到索引endIndex - 1 處的字符。因此,該子字符串的長度為endIndex-beginIndex

?

數據庫性能優化有哪些措施?

1、調整數據結構的設計。這一部分在開發信息系統之前完成,程序員需要考慮是否使用ORACLE數據庫的分區功能,對于經常訪問的數據庫表是否需要建立索引等。

2、調整應用程序結構設計。這一部分也是在開發信息系統之前完成,程序員在這一步需要考慮應用程序使用什么樣的體系結構,是使用傳統的Client/Server兩層體系結構,還是使用Browser/Web/Database的三層體系結構。不同的應用程序體系結構要求的數據庫資源是不同的。

3、調整數據庫SQL語句。應用程序的執行最終將歸結為數據庫中的SQL語句執行,因此SQL語句的執行效率最終決定了ORACLE數據庫的性能。 ORACLE公司推薦使用ORACLE語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。

4、調整服務器內存分配。內存分配是在信息系統運行過程中優化配置的,數據庫管理員可以根據數據庫運行狀況調整數據庫系統全局區(SGA區)的數據緩沖區、日志緩沖區和共享池的大小;還可以調整程序全局區(PGA區)的大小。需要注意的是,SGA區不是越大越好,SGA區過大會占用操作系統使用的內存而引起虛擬內存的頁面交換,這樣反而會降低系統。

5、調整硬盤I/O,這一步是在信息系統開發之前完成的。數據庫管理員可以將組成同一個表空間的數據文件放在不同的硬盤上,做到硬盤之間I/O負載均衡

6、調整操作系統參數,例如:運行在UNIX操作系統上的ORACLE數據庫,可以調整UNIX數據緩沖池的大小,每個進程所能使用的內存大小等參數。

實際上,上述數據庫優化措施之間是相互聯系的。ORACLE數據庫性能惡化表現基本上都是用戶響應時間比較長,需要用戶長時間的等待。但性能惡化的原因卻是多種多樣的,有時是多個因素共同造成了性能惡化的結果,這就需要數據庫管理員有比較全面的計算機知識,能夠敏感地察覺到影響數據庫性能的主要原因所在。另外,良好的數據庫管理工具對于優化數據庫性能也是很重要的。
?

分頁和分段區別

1、頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率;或者說,分頁僅僅是由于系統管理的需要,而不是用戶的需要。
????? 段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好的滿足用戶的需要。
2、頁的大小固定且由系統確定,把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬件實現的,因而一個系統只能有一種搜索大小的頁面。
????? 段的長度卻不固定,決定于用戶所編寫的程序,通常由編輯程序在對源程序進行編輯時,根據信息的性質來劃分。

3、分頁的作業地址空間是維一的,即單一的線性空間,程序員只須利用一個記憶符,即可表示一地址。
??????分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。

?

視圖、索引、存儲過程優缺點

1.視圖
(1).什么是視圖?
視圖(View)作為一種數據庫對象,為用戶提供了一個可以檢索數據表中的數據方式。用戶通過視圖來瀏覽數據表中感興趣的部分或全部數據,而數據的物理存儲位置仍然在表中。
視圖是一個虛擬表,并不代表任何物理數據,只是用來查看數據的窗口而已。視圖并不是以一組數據的形式存儲在數據庫中,數據庫中只存儲視圖的定義,而不存儲 視圖對應的數據,這些數據仍存儲在導出視圖的基本表中。當基本表中的數據發生變化時,從視圖中查詢出來的數據也隨之改變。
視圖中的數據行和列都是來自于基本表,是在視圖被引用時動態生成的。使用視圖可以集中、簡化和制定用戶的數據庫顯示,用戶可以通過視圖來訪問數據,而不必直接去訪問該視圖的基本表。
視圖由視圖名和視圖定義兩個部分組成。視圖是從一個或多個表導出來的表,它實際上是一個查詢結果,視圖的名字和視圖對應的查詢存儲在數據字典中。

(2).視圖的優缺點?
<1>.視圖的優點
A.數據安全性。
對不同的用戶定義不同的視圖,使用戶只能看到與自己有關的數據。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上。通過視圖,用戶可以被限制在數據的不同子集上。
B.查詢簡單化。
為復雜的查詢建立一個視圖,用戶不必輸入復雜的查詢語句,只需針對此視圖做簡單的查詢即可。那些被經常使用的查詢可以被定義為視圖,從而使用戶不必為以后的操作每次都指定全部的條件。
C.邏輯數據獨立性。
視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來。
對于視圖的操作,例如,查詢只依賴于視圖的定義,當構成視圖的基本表需要修改時,只需要修改視圖定義中的子查詢部分,而基于視圖的查詢不用改變。

<2>.視圖的缺點
A.性能。
SQL Server必須把視圖的查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那么,即使是視圖的一個簡單查詢,SQL Server也把它變成一個復雜的結合體,需要花費一定的時間。
B.修改限制。
當用戶試圖修改視圖的某些行時,SQL Server必須把它轉化為對基本表的某些行的修改。事實上,當從視圖中插入或者刪除時,情況也是這樣。對于簡單視圖來說,這是很方便的,但是,對于比較復雜的視圖,可能是不可修改的,這些視圖有如下特征:
  a.有UNIQUE等集合操作符的視圖。
  b.有GROUP BY子句的視圖。
  c.有諸如AVG\SUM\MAX等聚合函數的視圖。
  d.使用DISTINCT關鍵字的視圖。
  e.連接表的視圖(其中有些例外)
(3).創建視圖的限制:
在創建視圖時,還要注意試圖必須滿足以下幾點限制:
<1>.不能將規則或者DEFAULT定義關聯于視圖。
<2>.定義視圖的查詢中不能含有ORDER BY\COMPURER\COMPUTER BY 子句和INTO關鍵字
<3>.如果視圖中某一列是一個算術表達式、構造函數或者常數,而且視圖中兩個或者更多的不同列擁有一個相同的名字(這種情況通常是因為在視 圖的定義中有一個連接,而且這兩個或者多個來自不同表的列擁有相同的名字),此時,用戶需要為視圖的每一列指定列的名稱。

參考博客:
使用SQL Server視圖的優缺點

2.索引
(1).什么是索引?
索引是以表列為基礎的數據庫對象,它保存著表中排序的索引列,并且記錄了索引列在數據表中的物理存儲位置,實現了表中數據的邏輯排序,其主要目的是提高 SQL Server系統的性能,加快數據的查詢速度和減少系統的響應時間。索引通過記錄表中的關鍵值指向表中的記錄,這樣數據庫引擎就不用掃描整個表而定位到相 關的記錄。相反,如果沒有索引,則會導致SQL Server搜索表中的所有記錄,以獲取匹配結果。
索引除了可以提高查詢表內數據的速度以外,還可以使表和表之間的連接速度加快。例如,在實現數據參照完整性時,可以將表的外鍵制作為索引,這樣將加速表與表之間的連接。

(2).索引的分類
有3種索引類型:聚集索引、非聚集索引和唯一索引。如果表中存在聚集索引,則非聚集索引使用聚集索引來加快數據查詢。
<1>.聚集索引
聚集索引會對表和視圖進行物理排序,所以這種索引對查詢非常有效,在表和視圖中只能有一個聚集索引。當建立主鍵約束時,如果表中沒有聚集索引,SQL Server會用主鍵列作為聚集索引鍵。可以在表的任何列或列的組合上建立索引,實際應用中一般定義成主鍵約束的列建立聚集索引。
<2>.非聚集索引
非聚集索引不會對表和視圖進行物理排序。如果表中不存在聚集索引,則表示未排序的。在表或視圖中,最多可以建立250個非聚集索引,或者249個非聚集索引和1個聚集索引。
<3>.唯一索引
唯一索引不允許兩行具有相同的索引值。只要列中數據是唯一的,就可在同一個表上創建一個唯一的聚集索引。如果必須實施唯一性以確保數據的完整性,則應在列上創建UNIQUE或PRIMARY KEY約束,而不要創建唯一索引。

(3).使用索引的代價
雖然索引有很多優點,但索引的存在也讓系統付出了一定的代價。創建索引和維護索引都會消耗時間,當對表中的數據進行增加、刪除和修改操作時,索引就要進行 維護,否則索引的作用就會下降;另外,每個索引都會占用一定的物理空間,如果占用的物理空間過多,就會影響到整個SQL Server系統的性能。

(4).建立索引的原則
創建索引雖然可以提高查詢速度,但是它是犧牲一定的系統性能。因此,在創建時,哪些列適合創建索引,哪些列不適合創建索引,需要進行判斷,具體以下原則:
<1>.有主鍵的數據列要建立索引。因為主鍵可以加速定位到表中的某一行。
<2>.有外鍵的數據列要建立索引。外鍵列通常用于表與表之間的連接,在其上創建索引可以加快表間的連接。
<3>.對于經常查詢的數據列最好建立索引。
A.對于需要在指定范圍內快速或頻繁查詢的數據列,因為索引已經排序,其指定的范圍是連續的,查詢可以利用索引的排序,加快查詢的時間。
B.經常用在WHERE子句中的數據列,將索引建立在WHERE子句的集合過程中,對于需要加速或頻繁檢索的數據列,可以讓這些經常參與查詢的數據列按照索引的排序進行查詢,加快查詢的時間。
<4>.對于那些查詢中很少涉及的列、重復值比較多的列不要建立索引。
例如,在查詢中很少使用的列,有無索引并不能提高查詢的速度,相反增加了系統維護時間和消耗了系統空間。
<5>.對于定義為text、image和bit數據類型的列不要建立索引。因為這些數據類型的數據列的數據量要么很大、要么很小,不利于使用索引。

參考博客:
SQLServer索引調優實踐
SQL Server索引維護指導(1)
詳細講解SQL Server索引的性能問題

3.存儲過程
(1).什么是存儲過程?
當開發一個應用程序時,為了易于修改和擴充,經常會將負責不同功能的語句集中起來而且按照用途分別放置,以便能夠反復調用,而這些獨立放置且擁有不同功能的語言,即是“過程”(Procedure)。
存儲過程(Stored Producedures)是一組為完整特定功能的SQL語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字給出參數(如果該存儲過程帶有參數)來執行它。
它能夠包含執行各種數據庫操作的語句,并且可以調用其他的存儲過程;能夠接受輸入參數,并以輸出參數的形式將多個數據值返回給調用程序(Calling Procedure)或批處理(Batch);向調用程序或批處理返回一個狀態值,以表明成功或失敗(以及失敗的原因)。

(2).存儲過程的優點
<1>.存儲過程優點
A.執行速度快。
存儲過程只在創造時進行編譯,已經通過語法檢查和性能優化,以后每次執行存儲過程都不需再重新編譯,而我們通常使用的SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
B.允許組件式編程。
經常會遇到復雜的業務邏輯和對數據庫的操作,這個時候就會用SP來封裝數據庫操作。當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。只需創建存儲過程一 次并將其存儲在數據庫中,以后即可在程序中調用該過程任意次。在代碼上看,SQL語句和程序代碼語句的分離,可以提高程序代碼的可讀性。
存儲過程可以設置參數,可以根據傳入參數的不同重復使用同一個存儲過程,從而高效的提高代碼的優化率和可讀性。
C.減少網絡流量。
一個需要數百行Transact-SQL代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網絡中發送數百行代碼。
對于同一個針對數據庫對象的操作,如果這一操作所涉及到的T-SQL語句被組織成一存儲過程,那么當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,否則將會是多條SQL語句。從而減輕了網絡流量,降低了網絡負載。
D.提高系統安全性。
可將存儲過程作為用戶存取數據的管道。可以限制用戶對數據表的存取權限,建立特定的存儲過程供用戶使用,避免非授權用戶對數據的訪問,保證數據的安全。

<2>.存儲過程缺點:
A.移植性差。依賴于數據庫廠商,難以移植(當一個小系統發展到大系統時,對數據庫的要求也會發生改變);
B.難以調試、維護。業務邏輯大的時候,封裝性不夠,難調試難以維護;
C.服務器不能負載均衡。復雜的應用用存儲過程來實現,就把業務處理的負擔壓在數據庫服務器上了。沒有辦法通過中間層來靈活分擔負載和壓力.均衡負載等。

(3).存儲過程分類
<1>.系統存儲過程
系統存儲過程(System Stored Procedures)主要存儲在master數據庫中,并以sp_為前綴,并且系統存儲過程主要是從系統表中獲取信息,從而為系統管理員管理SQL Server提供支持。
<2>.本地存儲過程
本地存儲過程(Local Stored Procedures)也就是用戶自行創建在用戶數據庫中的存儲過程。事實上一般所說的存儲過程值得就是本地存儲過程。用戶創建的存儲過程是由用戶創建并能完成某一特定功能(如查詢用戶所需的數據信息)的存儲過程。
<3>.臨時存儲過程
臨時存儲過程(Temporary Stored Procedures)可分為以下兩種:
A.本地臨時存儲過程
如果在創建存儲過程中,以井號(#)作為其名稱的第一個字符,則該存儲過程將成為一個存放在tempdb數據庫中的本地臨時存儲過程(例如,CREATE PROCEDURE #book_proc.....)。本地臨時存儲過程只有創建它的連接的用戶才能夠執行它,而且一旦這位用戶斷開與SQL Server的連接,本地臨時存儲過程就會自動刪除,當然,這位用戶也可以在連接期間用DROP PROCEDURE命令刪除多創建的本地臨時存儲過程。
B.全局臨時存儲過程
如果在所創建的存儲過程名稱是以兩個井號(# #)開始,則該存儲過程將成為一個存儲在tempdb數據庫中的全局臨時存儲過程,如果沒有,便立即將全局臨時存儲過程刪除;如果有,SQL Server會讓這些執行中的操作繼續進行,但是不允許任何用戶再執行全局臨時存儲過程,等到所有未完成的操作執行完畢后,全局臨時存儲過程就會自動刪 除。
由于全局臨時存儲過程能夠被所有的連接用戶使用,因此,必須注意其名稱不能和其他連接所采用的名稱相同。
<4>.遠程存儲過程
遠程存儲過程(Remote Stored Procedures)是位于遠程服務器上的存儲過程,通常可以使用分布式查詢和EXECUTE命令執行一個遠程存儲過程。
<5>.擴展存儲過程
擴展存儲過程(Extended Stored Procedures)是用戶可以使用外部程序語言編寫的存儲過程。擴展存儲過程在使用和執行上與一般的存儲過程完全相同。可以將參數傳遞給擴展存儲過程,擴展存儲過程也能夠返回結果和狀態值。
為了區別,擴展存儲過程的名稱通常以xp_開頭。擴展存儲過程是以動態鏈接庫(DLLS)的形式存在,能讓SQL Server動態的裝載和執行。擴展存儲過程一定要存儲在系統數據庫master中。

參考博客:
SQL Server 存儲過程

4.事務處理
(1).什么是事務?
事務是單個的工作單元。如果某一事務成功,則在該事務中進行的所有數據更改均會提交,成為數據庫中的永久組成部分。如果事務遇到錯誤且必須取消或回滾,則所有數據更改均被清除。事務作為一個邏輯工作單元有4個屬性,稱為ACID(原子性、一致性、隔離性和持久性)屬性。
<1>.原子性:事務必須是原子工作單元,對于其數據修改,要么全都執行,要么全都不執行。
<2>.一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用于事務的修改,以保持所有數據的完整性。事物結束時,所有的內容數據結果都必須是正確的。
<3>.隔離性:由并發事務所作的修改必須與任何其他并發事務所作的修改隔離,保證事務查看數據時數據處于的狀態,只能是另一并發事務修改它之前的狀態或者是另一事務修改它之后的狀態,而不能中間狀態的數據。
<4>.持久性:事務完成之后對系統的影響是永久性的。
(2).事務分類
<1>.顯式事務:用begin transaction明確指定事務的開始。
<2>.隱性事務:打開隱性事務:set implicit_transactions on,當以隱性事務模式操作時,SQL Servler將在提交或回滾事務后自動啟動新事務。無法描述事務的開始,只需要提交或回滾事務。
<3>.自動提交事務:SQL Server的默認模式,它將每條單獨的T-SQL語句視為一個事務。如果成功執行,則自動提交,否則回滾。

?JAVA初始化順序 http://blog.sina.com.cn/s/blog_4efdd1d5010097p7.html
1、調用順序:
JAVA類首次裝入時,會對靜態成員變量或方法進行一次初始化,但方法不被調用是不會執行的,靜態成員變量和靜態初始化塊級別相同,非靜態成員變量和非靜態初始化塊級別相同。
先初始化父類的靜態代碼--->初始化子類的靜態代碼-->
(創建實例時,如果不創建實例,則后面的不執行)初始化父類的非靜態代碼--->初始化父類構造函數--->初始化子類非靜態代碼--->初始化子類構造函數

其他說明:
2 、類只有在使用New調用創建的時候才會被JAVA類裝載器裝入。
3、創建類實例時,首先按照父子繼承關系進行初始化。
4、類實例創建時候,首先初始化塊部分先執行,然后是構造方法;然后從本類繼承的子類的初始化塊執行,最后是子類的構造方法。
5、類消除時候,首先消除子類部分,再消除父類部分。

轉載于:https://www.cnblogs.com/jianmang/articles/4918579.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/375441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375441.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 設置線程名字

使用 std::thread #include <thread> #include <pthread.h>std::thread t(funs, args); pthread_setname_np(t.native_handle(), threadName);通過 pthread_create 創建 #define _GNU_SOURCE #include <pthread.h>pthread_t tid; pthread_create(&ti…

java學習_File屬性處理

// TODO Auto-generated method stub File filenew File("newhello.txt"); //文件是否存在 System.out.println("文件是否存在&#xff1a;"file.exists()); //讀取文件名稱 System.out.println("讀取文件名&#xff1a;"file.getName()); //讀取…

pytest 基礎講解

文章目錄 一、前置說明二、操作步驟1. 安裝 pytest2. python 編寫測試用例3. 在 pycharm 中使用 pytest 運行測試用例1)執行單條用例:點擊用例前面的三角形執行,或在用例內部點擊右鍵2)執行多條用例:在測試用例的外部區域,點擊右鍵,批量執行所有用例4. 命令行中使用 pyt…

Myeclipse8.6中安裝SVN插件

方法一&#xff1a; 1.打開HELP->MyEclipse Configuration Center&#xff0c;切換到SoftWare標簽頁。   2.點擊Add Site 打開對話框&#xff0c;在對話框Name輸入Svn&#xff0c;URL中輸入&#xff1a;http://subclipse.tigris.org/update_1.6.x   3.在左邊欄中找到Per…

初識EL

一、EL函數庫介紹 由于在JSP頁面中顯示數據時&#xff0c;經常需要對顯示的字符串進行處理&#xff0c;SUN公司針對于一些常見處理定義了一套EL函數庫供開發者使用。  這些EL函數在JSTL開發包中進行描述&#xff0c;因此在JSP頁面中使用SUN公司的EL函數庫&#xff0c;需要導入…

ffmpeg 合并 flv 文件

// 轉ts char cmd[1024] {\0}; sprintf(cmd, "ffmpeg -i %s -loglevel quiet -c copy -bsf:v h264_mp4toannexb -f mpegts %s", lastFlvFile.c_str(), lastTsFile.c_str()); system(cmd);// 合并ts char cmd[1024] {\0}; sprintf(cmd, "ffmpeg -i concat:\&qu…

怎么樣的理解才是完全理解SQL(二)

如果我們從集合論&#xff08;關系代數&#xff09;的角度來看&#xff0c;一張數據庫的表就是一組數據元的關系&#xff0c;而每個 SQL 語句會改變一種或數種關系&#xff0c;從而產生出新的數據元的關系&#xff08;即產生新的表&#xff09;。我們學到了什么&#xff1f;思考…

Scala學習筆記-環境搭建以及簡單語法

關于環境的搭建&#xff0c;去官網下載JDK8和Scala的IDE就可以了&#xff0c;Scala的IDE是基于Eclipse的。 下面直接上代碼&#xff1a; 這是項目目錄&#xff1a; A是scala寫的&#xff1a; package first import scala.collection.mutable.ListBufferobject A {def main(args…

UVa 12169 (枚舉+擴展歐幾里得) Disgruntled Judge

題意&#xff1a; 給出四個數T, a, b, x1,按公式生成序列 xi (a*xi-1 b) % 10001 (2 ≤ i ≤ 2T) 給出T和奇數項xi&#xff0c;輸出偶數項xi 分析&#xff1a; 最簡單的辦法就是直接枚舉a、b&#xff0c;看看與輸入是否相符。 1 #include <cstdio>2 3 const int maxn …

使用Beautifulsoup爬取藥智網數據

使用Beautifulsoup模塊爬取藥智網數據 Tips&#xff1a;1.爬取多頁時&#xff0c;先用一頁的做測試&#xff0c;要不然ip容易被封 2.自己常用的處理數據的方法&#xff1a; regre.compile(正則表達式) datareg.sub(要替換的字符串,data) 代碼&#xff08;其實沒多少&#xff09…

冪集 返回某集合的所有子集

冪集。編寫一種方法&#xff0c;返回某集合的所有子集。集合中不包含重復的元素。 說明&#xff1a;解集不能包含重復的子集。 示例: 輸入&#xff1a; nums [1,2,3]輸出&#xff1a; [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]來源&#xff1a;力扣&#xff08;LeetCode…

iOS標準時間與時間戳相互轉換

本文轉載至 http://blog.sina.com.cn/s/blog_a843a8850101dzqd.html [cpp] view plaincopy 設置時間顯示格式: NSString* timeStr "2011-01-26 17:40:50"; NSDateFormatter *formatter [[[NSDateFormatter alloc] init] autorelease]; [formatter s…

JavaScript設計模式 Item 3 --封裝

在JavaScript 中&#xff0c;并沒有對抽象類和接口的支持。JavaScript 本身也是一門弱類型語言。在封裝類型方面&#xff0c;JavaScript 沒有能力&#xff0c;也沒有必要做得更多。對于JavaScript 的設計模式實現來說&#xff0c;不區分類型是一種失色&#xff0c;也可以說是一…

【WCF安全】WCF 自定義授權[用戶名+密碼+x509證書]

1.x509證書制作(略) 2.直接貼代碼 ----------------------------------------------------------------------服務端------------------------------------------------------------------------------------------- WCF服務 1 using System;2 using System.Collections.Generi…

openMVS-編譯

opencv4 編譯 會有問題&#xff0c;可以重新下載 opencv3 編譯并指定好路徑。 OpenCV_DIRyour opencv3 build install path cmake -DCMAKE_BUILD_TYPERelease -DVCG_ROOT"$main_path/vcglib" ..

ASP.NET Web API 數據提供系統相關類型及其關系

轉載于:https://www.cnblogs.com/frankyou/p/4932651.html

openMVG跑自定義數據出錯

使用自己拍攝的圖片跑 openMVG 的 turtor_demo.py 時&#xff0c;出現錯誤&#xff0c;沒有生成 sfm_data.bin DSC01988" model "DSC-RX100M6" doesnt exist in the database Please consider add your camera model and sensor width in the database.原因時數…

windows server 2003下安裝iis6+php

參照http://www.myhack58.com/Article/sort099/sort0100/2012/35579.htm 這篇文章&#xff0c;即可&#xff01; 前 面我寫了《windows安裝PHP5.4Apache2.4Mysql5.5》的安裝教程&#xff0c;本地實現是很簡單的&#xff0c;但是有人還是喜歡用IIS來配置 PHP環境&#xff0c;部分…

將 JAR 轉為 EXE – JSMOOTH 的使用教程(第二期)(轉載)

http://www.iteknical.com/convert-jar-to-exe-phase-ii-jsmooth-use-tutorial/轉載于:https://www.cnblogs.com/leinuo2016/p/4932790.html

“”要求左值

錯誤 C2102 “&”要求左值 wrong code typedef struct CodeData {void *ptr_;CodeData(void*ptr) : ptr_(ptr){} } CodeData;typedef struct Data {int data_;data(int data) : data_(data){} } Data;// 這里出錯&#xff0c;因為&后面是臨時變量&#xff0c;不能取地…