This():當前類的對象,super父類對象。html
Super():在子類訪問父類的成員和行爲,必須受類繼承規則的約束前端
而this他表明當前對象,固然全部的資源均可以訪問.java
在構造函數中,若是第一行沒有寫super(),編譯器會自動插入.可是若是父類沒有不帶參數的構造函數,或這個函數被私有化了(用private修飾).此時你必須加入對父類的實例化構造.而this就沒有這個要求,由於它自己就進行實例化的構造.
而在方法中super和this使用的方法就差很少了.只不過super 要考慮是否能訪問其父類的資源.程序員
Ø Public:不一樣包、同一包、類內均可用web
Ø Private:類內算法
Ø Protected: 不一樣包的子類、同一包、類內均可用spring
Ø 不寫時:同一包內、類內sql
* * * * *數據庫
* * * *apache
* * *
* *
*
代碼以下:
1
2
3
4
5
6
7
8
9
10
|
public
class
Print {
public
static
void
main(String[] args) {
for
(
int
i =
0
; i <
5
; i++){
for
(
int
j =
5
; j > i; j--) {
System.out.print(
"*"
);
}
System.out.println();
}
}
}
|
java 事件委託機制的概念,一個源產生一個事件並將它送到一個或多個監聽器那裏。在這種方案中,監聽器簡單的等待,直到它收到一個事件。一旦事件被接受,監聽器將處理這個事件,而後返回。
垃圾回收機制 垃圾收集是將分配給對象但再也不使用的內存回收或釋放的過程。若是一個對象沒有指向它的引用或者其賦值爲null,則次對象適合進行垃圾回收
用break; return 方法。
序列化:
處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操做時所引起的問題。
序列化的實現:
將須要被序列化的類實現Serializable接口,該接口沒有須要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的,而後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就能夠將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
能夠。若是這個類的修飾符是public,其類名與文件名必須相同。
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)
快速排序的僞代碼。
方法的
重寫Override,子類覆蓋父類的方法,將子類傳與父類的引用調用的仍是子類的方法。
重載Overloading 一個類多個方法,名稱相同,參數個數類型不一樣。
二者都是Java多態性的不一樣表現。
Overloaded的方法是能夠改變返回值的類型。
1
2
3
4
5
6
7
8
|
1
,
public
class
Ctest()
{
Public
static
void
main()
{
System.out.prinln(
8
+
8
+」
88
」+
8
+
8
);
}
}
168888
|
屬性常量
方法不能夠overridding
類不能夠繼承
答:父類:
1
2
3
4
5
6
7
8
|
package
test;
public
class
FatherClass
{
public
FatherClass()
{
System.out.println(
"FatherClassCreate"
);
}
}
|
子類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
test;
import
test.FatherClass;
public
class
ChildClass
extends
FatherClass
{
public
ChildClass()
{
System.out.println(
"ChildClass Create"
);
}
public
static
void
main(String[] args)
{
FatherClass fc =
new
FatherClass();
ChildClass cc =
new
ChildClass();
}
}
|
輸出結果:
C:>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create
答:示例代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
test;
public
class
OuterClass
{
private
class
InterClass
{
Public Interlass()
{
System.out.println(
"InterClass Create"
);
}
}
public
OuterClass()
{
InterClass ic =
new
InterClass();
System.out.println(
"OuterClassCreate"
);
}
public
static
void
main(String[] args)
{
OuterClass oc =
new
OuterClass();
}
}
|
輸出結果:
C:>java test/OuterClass
InterClass Create
OuterClass Create
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package
test;
import
java.util.*;
class
InsertSort{
ArrayList al;
public
InsertSort(
int
num,
int
mod)
{
al =
new
ArrayList(num);
Random rand =
new
Random();
System.out.println(
"The ArrayList Sort Before:"
);
for
(
int
i=
0
;i<num ;i++ )
{
al.add(
new
Integer(Math.abs(rand.nextInt()) % mod +
1
));
System.out.println(
"al["
+i+
"]="
+al.get(i));
}
}
public
void
SortIt()
{
Integer tempInt;
int
MaxSize=
1
;
for
(
int
i=
1
;i<al.size();i++)
{
tempInt = (Integer)al.remove(i);
if
(tempInt.intValue()>=((Integer)al.get(MaxSize-
1
)).intValue())
{
al.add(MaxSize,tempInt);
MaxSize++;
System.out.println(al.toString());
}
else
{
for
(
int
j=
0
;j<MaxSize ;j++ )
{
if
(((Integer)al.get(j)).intValue()>=tempInt.intValue())
{
al.add(j,tempInt);
MaxSize++;
System.out.println(al.toString());
break
;
}
}
}
}
System.out.println(
"The ArrayList Sort After:"
);
for
(
int
i=
0
;i<al.size();i++)
{
System.out.println(
"al["
+i+
"]="
+al.get(i));
}
}
public
static
void
main(String[] args)
{
InsertSort is =
new
InsertSort(
10
,
100
);
is.SortIt();
}
}
|
JAVA類實現序例化的方法是實現java.io.Serializable接口
Collection框架中實現比較要實現Comparable 接口和 Comparator 接口
答:代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
static
void
split(String source,
int
num)
throws
Exception
{
int
k=
0
;
String temp=
""
;
for
(
int
i =
0
; i<source.length(); i++)
{
byte
[]b=(source.charAt(i)+
""
).getBytes();
k=k+b.length;
if
(k>num)
{
break
;
}
temp=temp+source.charAt(i);
}
System.out.println(temp);
}
|
1
2
3
4
5
6
7
|
public
class
YesterdayCurrent{
public
void
main(String[] args){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -
1
);
System.out.println(cal.getTime());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
int
getNum(){
int
i = -
1
;
try
{
String stri=
""
;
BufferedReader in =
new
BufferedReader(
new
FileReader(f));
while
((stri=in.readLine())!=
null
){
i = Integer.parseInt(stri.trim());
}
in.close();
}
catch
(Exception e){
e.printStackTrace();
}
return
i;
}
public
void
setNum(){
int
i = getNum();
i++;
try
{
PrintWriter out=
new
PrintWriter(
new
BufferedWriter(newFileWriter(f,
false
)));
out.write(String.valueOf(i));
//多是編碼的緣由,若是直接寫入int的話,將出現java編碼和windows編碼的混亂,所以此處寫入的是String
out.close() ;
}
catch
(Exception e){
e.printStackTrace();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class
A{
static
{
System.out.print(
"1"
);
}
public
A(){
System.out.print(
"2"
);
}
}
class
B
extends
A{
static
{
System.out.print(
"a"
);
}
public
B(){
System.out.print(
"b"
);
}
}
public
class
Hello{
public
static
void
main(String[] ars){
A ab =
new
B();
//執行到此處,結果: 1a2b
ab =
new
B();
//執行到此處,結果: 1a2b2b
}
}
|
注:類的static 代碼段,能夠看做是類首次加載(被虛擬機加載)執行的代碼,而對於類的加載,首先要執行其基類的構造,再執行其自己的構造
(1)接口能夠被多重implements,抽象類只能被單一extends
(2)接口只有定義,抽象類能夠有定義和實現
(3)接口的字段定義默認爲:public static final, 抽象類字段默認是"friendly"(本包可見)
當功能須要累積時用抽象類,不須要累積時用接口。
經過類(Class對象),能夠得出當前類的fields、method、construtor、interface、superClass、modified等,同是能夠經過類實例化一個實例、設置屬性、喚醒方法。Spring中一切都是返射、struts、hibernate都是經過類的返射進行開發的。
java.lang.Class
java.lang.refrection.Method
java.lang.refrection.Field
java.lang.refrection.Constructor
java.lang.refrection.Modifier
java.lang.refrection.Interface
對象.getClass()
類.class或Integer.type(int) Integer.class(java.lang.Integer)
Class.forName();
產生一個Class數組,說明方法的參數
經過Class對象及方法參數獲得Method
經過method.invoke(實例,參數值數組)喚醒方法
Integer.parseInt(「1234」)
Double.parseDouble(「123.2」)
1+」」
1.0+」」
double d=1256.22d;
d=d/100;
System.out.println(Math.round(d)*100);
Calendar c=Calendar.getInstance();
c.set(Calendar.YEAR,2004);
c.set(Calendar.MONTH,0);
c.set(Calendar.DAY_OF_MONTH,31);
System.out.println(c.get(Calendar.YEAR)+" "+(c.get(Calendar.MONTH)+1)+" "+c.get(Calendar.DAY_OF_MONTH));
Java.util.Date dat=new Date();
long now=dat.getTime();
當前日期加一天,若當前日期與結果的月份不相同,就是最後一天。
取下一個月的第一天,下一個月的第一天-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
static
void
main(String[] args)
{
Calendarc=Calendar.getInstance();
c.set(Calendar.YEAR,
2004
);
c.set(Calendar.MONTH,
0
);
c.set(Calendar.DAY_OF_MONTH,
30
);
Calendarc1=(Calendar)c.clone();
System.out.println(c.get(Calendar.YEAR)+
" "
+(c.get(Calendar.MONTH)+
1
)+
" "
+c.get(Calendar.DAY_OF_MONTH));
c.add(Calendar.DAY_OF_MONTH,
1
);
if
(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH))
{
System.out.println(
"是最後一天"
);
}
else
{
System.out.println(
"不是取後一天"
);
}
}
|
Import java.text. SimpleDateFormat;
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-ddhh:mm:ss");
Date dat=new Date();
//把日期轉化爲字符串
String str=sdf.format(dat);
System.out.println(str);
//將字符串轉化爲日期
Java.util.Date d1=sdf.parse(「yyyy-mm-dd」);
String a=new String("中".getBytes("gb2312"),"iso-8859-1");
String a=new String("中".getBytes("iso-8859-1"));
New了一個,」XYZ」原本又是一個
兩個
報錯,應當是float f=3.4f
若是是float f=3(整數)正確
經常使用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer
經常使用的包:java.lang java.awt java.io java.util java.sql javax.xmljavax.sevlet javax.ejb. java.net javax.faces
經常使用的接口: List Map Document NodeList EjbObject EjbHome SessionBean EntityBean
會。如:int i,i2; return (i-i2); //when i爲足夠大的正數,i2爲足夠大的負數。結果會形成溢位,致使錯誤。
靜態的多態:方法名相同,參數個數或類型不相同。(overloading)
動態的多態:
子類覆蓋父類的方法,將子類的實例傳與父類的引用調用的是子類的方法
實現接口的實例傳與接口的引用調用的實現類的方法。
動態內存
存放類實例
靜態內存
類自己
垃圾收集主要針對的是動態內存,通常當內存不夠用時會進行垃圾收集。
或經過System.gc()手動收集,但不保證必定執行。
static i = 10; //常量
class A a; a.i =10;//可變
靜態方法能夠調用靜態變量。
實現方法能夠調用靜態變量、實例變量
不能夠,若是其中包含對象的method();不能保證對象初始化.
Clone 有缺省行爲,super.clone();他負責產生正確大小的空間,並逐位複製。
Try:執行部分,產生異常
Catch:捕捉異常
Finally:無論有沒有異常都執行
Throws:在方法聲明處聲明要拋出的異常,調用者必須對其進行處理。
Throw:拋出一個異常
在try中能夠拋出異常,通常與聲明的異常相同。
自定義異常要繼承於Exception或Exception的子類
//相鄰兩個數比較,將最小或最大的放到後面,最後面數的不參與比較
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
public
class
BubbleSort {
private
static
int
al[] =
new
int
[
10
];
publicBubbleSort() {
al[
0
]=
2
;
al[
1
]=
3
;
al[
2
]=
23
;
al[
3
]=
45
;
al[
4
]=
1
;
al[
5
]=
67
;
al[
6
]=
23
;
al[
7
]=
80
;
al[
8
]=
35
;
al[
9
]=
72
;
}
public
static
void
main(String[] args) {
BubbleSort bs =
new
BubbleSort();
System.out.println(
"排序前:"
);
display(al);
for
(
int
i=
0
;i<al.length;i++) {
for
(
int
j =
0
; j < al.length-i-
1
; j++) {
if
(al[j]>al[j+
1
]) {
swap(j,j+
1
);
}
}
}
System.out.println();
System.out.println(
"排序後:"
);
display(al);
}
private
static
void
display(
int
[] al2) {
for
(
int
i =
0
; i < al2.length; i++) {
System.out.print(al2[i]+
" "
);
}
}
private
static
void
swap(
int
i,
int
j) {
int
temp = al[i];
al[i]= al[j];
al[j] = temp;
}
}
|
String:長度給定不可變,當多個字符串聯合時要先轉爲StringBuffer,再聯合,速度慢。
StringBuffer:長度可變,能夠將多個字符串值直接聯合,效率高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public
class
Stack {
int
[] data;
int
maxSize;
int
top;
public
Stack(
int
maxSize) {
this
.maxSize = maxSize;
data =
new
int
[maxSize];
top = -
1
;
}
/**
* 依次加入數據
* @param data 要加入的數據
* @return 添加是否成功
*/
public
boolean
push(
int
data) {
if
(top+
1
== maxSize) {
System.out.println(
"棧已滿!"
);
return
false
;
}
this
.data[++top] = data;
return
true
;
}
/**
* 從棧中取出數據
* @return 取出的數據
*/
public
int
pop()
throws
Exception{
if
(top==-
1
) {
throw
new
Exception(
"棧已空!"
);
}
return
this
.data[top--];
}
public
static
void
main(String[] args) throwsException {
Stack stack=
new
Stack(
1000
);
stack.push(
1
);
stack.push(
2
);
stack.push(
3
);
stack.push(
4
);
stack.push(
5
);
while
(stack.top>=
0
)
{
System.out.println(stack.pop());
}
}
}
|
數據的傳送 增、刪、改、查、constainsAll,能夠存放不一樣類型的對象。
集合List 的遍歷方法有:
Iterator:
Enumeration
For
Get
set
Collection的通用方法有:
Iterator()
Add()
Clear();
remove()
ArrayList Vector:以數組的方式存儲,增、刪慢,查、改快
ArrayList:線程不安全,速度快
Vector:線程安全,速度慢(synchoronized)
LikedList:以單鏈表的方式存儲,增、刪快,查、改慢
HashMap與Hashtable都實現的Map接口,HashTable線程安全,HashMap線程不安全。
Collection是集合的根接口,其下有set及list
Collections是集合的算法。
在比較時先調用hashCode方法,若是不相同,證實不相等。
若是相同,再調用equals方法,若是equals方法相同,證實相等,不相同,證實不相等。
==:主要用在基本數據類型及引用
Equals:主要是對象或對象引用的比較。
集合中是否包含某一個元素用contains來判斷。
List,set繼承於Collection
Map沒有繼承於Collection,其相對是獨立的。
屬於Collection類型的對象,能夠經過構造函數將一個集合構形成另一個集合。
1.抽象:
找共性,將共有的屬性、方法放到父類中
2.繼承:
子類繼承於父類,具備父類的全部屬性與方法,能夠重用,也能夠覆蓋。
3.封裝:
一個類包括多個屬性及方法。
4. 多態性:
動態:
靜態:
基本數據類型包括byte、int、char、long、float、double、boolean和short。
java.lang.String類是final類型的,所以不能夠繼承這個類、不能修改這個類。爲了提升效率節省空間,咱們應該用StringBuffer類
Int是基本數據類型,不是對象,佔一個內存空間,沒有方法。與其同類的有long,char,doble
Integer是封裝類,具備方法及屬性。與其同類的有Long,Double.Float
運行時異常:java JVM拋出的異常,代碼中不用處理。
通常異常:用戶拋出的異常,若是用throws 聲明瞭,調用這個方法的代碼必須對其處理。
&:與: 左邊若爲false右邊還執行。
&&:短路與,左邊若爲false右邊不執行。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示老是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,能夠覆蓋此方法提供垃圾收集時的其餘資源回收,例如關閉文件等。
算符能夠用來決定某對象的類是否實現了接口。
棧是一種線形集合,其添加和刪除元素的操做應在同一段完成。棧按照後進先出的方式進行處理。
堆是棧的一個組成元素
Static Nested Class是被聲明爲靜態(static)的內部類,它能夠不依賴於外部類實例被實例化。而一般的內部類須要在外部類實例化後才能實例化。
assertion (斷言)在軟件開發中是一種經常使用的調試方式,不少開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;若是該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。通常來講,assertion用於保證程序最基本、關鍵的正確性。assertion檢查一般在開發和測試時開啓。爲了提升性能,在軟件發佈後,assertion檢查一般是關閉的。
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會致使程序或系統的不穩定甚至崩潰,Java提供的GC功能能夠自動監測對象是否超過做用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操做方法。
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,須要強制轉換類型) short s1 = 1; s1 +=1;(能夠正確編譯)
Math.round(11.5)==12 Math.round(-11.5)==-11round方法返回與參數最接近的長整數,參數加1/2後求其floor.
java中的保留字,如今沒有在java中使用。
ArithmeticException, ArrayStoreException, BufferOverflowException,BufferUnderflowException, CannotRedoException, CannotUndoException,ClassCastException, CMMException, ConcurrentModificationException,DOMException, EmptyStackException, IllegalArgumentException,IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,ImagingOpException, IndexOutOfBoundsException, MissingResourceException,NegativeArraySizeException, NoSuchElementException, NullPointerException,ProfileDataException, ProviderException, RasterFormatException,SecurityException, SystemException, UndeclaredThrowableException,UnmodifiableSetException, UnsupportedOperationException
通常異常:
IOException
FileNotFoundException
SqlException
接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。任何抽象類都是實際類Object的子類。
都不能
數組沒有length()這個方法,有length這個屬性
String有length()這個方法.
構造器Constructor不能被繼承,所以不能重寫Overriding,但能夠被重載Overloading。
String類是final類故不能夠繼承。
switch(expr1)中,expr1是一個整數表達式。所以傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string都不能做用於swtich。
會執行,在return前執行。
2 << 3
不對,有相同的hash code。
是引用傳遞
基本數據類型:值
對象: 引用
Cookie
Session
Hidden
url 重寫
Singleton模式主要做用是保證在Java應用程序中,一個類Class只有一個實例存在。
通常Singleton模式一般有幾種種形式:
第一種形式: 定義一個類,它的構造函數爲private的,它有一個static的private的該類變量,在類初始化時實例話,經過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。
public class Singleton {
private Singleton(){}
//在本身內部定義本身一個實例,是否是很奇怪?
//注意這是private 只供內部調用
private static Singletoninstance = new Singleton();
//這裏提供了一個供外部訪問本class的靜態方法,能夠直接訪問
public static SingletongetInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提升了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其餘形式:
定義一個類,它的構造函數爲private的,全部方法爲static的。
通常認爲第一種形式要更加安全些
原理
有錯直接轉到異常處理部分或向上拋出。
應用:
JAVA的異常就是錯誤,有兩種一種是運行時,編碼能夠不用捕捉。一種是通常異常,若是throws聲明瞭,必須進行處理。
優勢:
程序員不用管內存,jvm自動完成,開發方便。運行優先很是低,程序沒法清楚實例何時被消毀。
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
可以定義成爲一箇中文的,由於java中以unicode編碼,一個char佔16個字節,因此放一箇中文是沒問題的
字節流,字符流。字節流繼承於InputStream OutputStream,字符流繼承於Reader Writer。在java.io包中還有許多其餘的流,低層流與調層流,高層流主要是爲了提升性能和使用方便。
啓動一個線程是調用start()方法,啓動線程並調用run方法。
線程是進程內的併發,沒有自已內存空間,共享進程的,線程間的通訊成本較低。
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。
1
2
3
4
5
6
7
8
9
10
11
12
|
Extends Thread
Implements Runnable
同步
Public
synchronized
aa()
{
}
Public
void
cc(object aa)
{
synchronized
(aa)
{
}
}
|
用synchoronized修飾同步方法。
答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
同步的實現方面有兩種,分別是synchronized,wait與notify
反對使用stop(),是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。
Collection Map
List set HashMap
ArrayList linkedList HashSet TreeSet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public
class
TestThread
{
private
int
j;
public
synchronized
void
inc()
{
j++;
System.out.println(Thread.currentThread().getName()+
"-inc:"
+ j);
}
public
synchronized
void
dec()
{
j--;
System.out.println(Thread.currentThread().getName()+
"-dec:"
+ j);
}
public
static
void
main(String[]args)
{
TestThread t=
new
TestThread();
for
(
int
i =
0
; i <
2
; i++)
{
Thread inc=
new
Thread(newInc(t));
|