問題30:
問題29:
aa
cc:
aasdf
問題28:
問題27:
問題26:
問題25:
問題24:
問題23:
問題22:
問題21:
問題20:
問題19:
問題18:
問題17:
多線程的同步:
- 同步鎖對(duì)象
package hello;
public class TicketThread implements Runnable{
int tickets = 50;
Object mutex = new Object();
@Override
public void run() {
while(true) {
synchronized (mutex) {
if(tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
}
}
}
- 非靜態(tài)同步方法(非靜態(tài)同步方法的鎖對(duì)象是this)
package hello;
public class TicketThread implements Runnable{
int tickets = 50;
Object mutex = new Object();
@Override
public void run() {
while(true) {
method();
}
}
protected synchronized void method() {
if(tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
}
- 靜態(tài)同步方法(靜態(tài)同步方法的鎖對(duì)象是當(dāng)前類的字節(jié)碼對(duì)象)
問題16:
多線程的兩種實(shí)現(xiàn)方式:
- extended Thread
- implements Runnable
問題15:
編碼表:
ASCII 基本碼表
GBK 中國(guó)字符碼表
Unicode 所有字符都占2個(gè)字節(jié)
UTF-8 長(zhǎng)度可變碼表
ANSI 本地編碼表腿倚,根據(jù)系統(tǒng)環(huán)境語言變化纯出。
問題14:
Properties和IO流結(jié)合功能:
Properties是Hashtable的子類,屬于持久屬性集敷燎。
void list(PrintWriter out)可以直接將集合輸出暂筝。
void load(Reader reader)
問題14:
輸入輸出流:
標(biāo)準(zhǔn)輸入輸出流:
輸入 System.in
輸出 System.out
字節(jié)流:
輸入 InputStream FileInputStream
輸出 OutputStream FileOutputStream
字符流:(字符流= 字節(jié)流+編碼)
輸入 Reader FileReader
輸出 Writer FileWriter
字節(jié)流與字符流之間的橋梁:
InputStreamReader #是字節(jié)流通向字符流的橋梁
OutputStreamWriter #是字符流通向字節(jié)流的橋梁
高效緩沖字節(jié)流:
BufferedInputStream
BufferedOutputStream
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br = new BufferedReader(new FileReader("a.txt"))
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"))
高效緩沖字符流:
BufferedReader
BufferedWriter
打印流:
PrintStream()
PrintWriter() #自動(dòng)將字節(jié)輸出流轉(zhuǎn)換為字符輸入流浑吟。 類似:new BufferedWriter(new FileWriter("a.txt"))
特點(diǎn):自動(dòng)換行(print如绸,println淑仆,format)荸百、自動(dòng)刷新(print,println踪央,format)
對(duì)象操作流:
ObjectOutputStream(OutputStream out)
ObjectInputStream(InputStream in)
注意:對(duì)象操作流的對(duì)象一定要實(shí)現(xiàn)序列化接口Serializable抚恒。解決對(duì)實(shí)現(xiàn)序列化接口出現(xiàn)的黃色警告問題,需要手動(dòng)
給類添加序列號(hào)serialVersionUID温赔。
問題13:
Map對(duì)象的兩種遍歷方式
方式一: 先獲取keyset拄衰,然后遍歷它褪。
Map<String, String> map = new HashMap<String, String>();
System.out.println(map.put("wy001", "czh"));
System.out.println(map.put("wy002", "ouyy"));
System.out.println(map.put("wy003", "xcz"));
System.out.println(map);
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(value);
}
方式二:獲取map.entry,然后遍歷肾砂。
Map<String, String> map = new HashMap<String, String>();
System.out.println(map.put("wy001", "czh"));
System.out.println(map.put("wy002", "ouyy"));
System.out.println(map.put("wy003", "xcz"));
System.out.println(map);
Set<Map.Entry<String, String>> entrys = map.entrySet();
for(Map.Entry<String, String> entry : entrys) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "+" + value);
}
問題12:
集合的三種遍歷方式:
- toArray() ---- 轉(zhuǎn)換為數(shù)組遍歷
- Iterator ---- 采用迭代器對(duì)象
- for(obj st : c) ---- 增強(qiáng)for
備注:對(duì)于List集合還可以用普通for循環(huán)來遍歷,因?yàn)橛衖ndex宏悦。
問題11:
迭代器并發(fā)修改錯(cuò)誤:
使用迭代器迭代集合的同時(shí)需要修改集合元素:
錯(cuò)誤方式:
package hello;
import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.ListIterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();
while(it.hasNext()) {
String s = (String) it.next();
if(s.equals("java")) {
c.add("android");
}
}
System.out.println(c);
}
}
迭代器是原來集合的一個(gè)副本镐确,當(dāng)?shù)鞑僮鞯臅r(shí)候,發(fā)現(xiàn)和集合不一樣饼煞,會(huì)報(bào)并發(fā)修改異常源葫。
正確方式:
import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.ListIterator;
public class IteratorDemo {
public static void main(String[] args) {
ArrayList c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
ListIterator it = c.listIterator();
while(it.hasNext()) {
String s = (String) it.next();
if(s.equals("java")) {
it.add("android");
}
}
System.out.println(c);
}
}
用迭代器來修改集合,迭代完成后砖瞧,會(huì)同步到原集合息堂。
問題10:
基本數(shù)據(jù)類型和相對(duì)應(yīng)的包裝類
基本數(shù)據(jù)類型 | 相對(duì)應(yīng)的包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolen | Boolen |
問題9:
修飾符總結(jié):
修飾符 | 類 | 成員變量 | 成員方法 | 構(gòu)造方法 |
---|---|---|---|---|
public | Y | Y | Y | Y |
default | Y | Y | Y | Y |
protected | N | Y | Y | Y |
private | N | Y | Y | Y |
abstract | Y | N | Y | N |
static | N | Y | Y | N |
final | Y | Y | Y | N |
備注:Y代表可以修飾,N代表不能修飾。成員內(nèi)部類不在此次考慮范圍內(nèi)荣堰。static 可以修飾成員內(nèi)部類床未。
問題8:
權(quán)限修飾符的方法的作用域:
- public : 當(dāng)前類、相同包下不同類振坚、不同包下的類
- default : 當(dāng)前類薇搁、相同包下不同類
- protected: 當(dāng)前類、相同包下不同類
- private:當(dāng)前類
另外:default是用于包內(nèi)渡八,protected可以用于子類啃洋。
問題7:
多態(tài)成員特點(diǎn):
- 成員變量:成員變量是沒有重寫的,所以編譯時(shí)看左邊屎鳍,運(yùn)行時(shí)看左邊宏娄。
- 成員方法:編譯時(shí)看左邊,運(yùn)行時(shí)看右邊逮壁。
- 靜態(tài)方法:編譯時(shí)看左邊孵坚,運(yùn)行時(shí)看左邊。
package hello;
public class PoymorphicDemo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.num);//20
a.eat();//cat eat fish...
a.foo();//我是父類靜態(tài)方法
}
}
class Animal{
int num = 20;
public void eat() {
System.out.println("eating ...");
}
public static void foo() {
System.out.println("我是父類靜態(tài)方法");
}
}
class Cat extends Animal{
int num = 10;
public void eat() {
System.out.println("cat eat fish");
}
public static void foo() {
System.out.println("我是子類靜態(tài)方法");
}
}
問題6:
final修飾類貌踏、成員方法十饥、成員變量
- final修飾類:不能被繼承、不能有子類祖乳。
- final修飾的成員方法:不能被重寫逗堵。
- final修飾的成員變量:不可以被修改,一旦初始化就不可以改變眷昆。
- 可以顯示初始化:final int a = 1蜒秤;
- 可以構(gòu)造初始化: 在構(gòu)造函數(shù)中進(jìn)行初始化。
問題5:
抽象類與接口的區(qū)別:
抽象類 | 接口 |
---|---|
單繼承 | 多實(shí)現(xiàn) |
有抽象方法也有非抽象方法 | 只能有抽象方法 |
有成員變量也可以有成員常量 | 只能有成員常量 |
有構(gòu)造方法 | 無構(gòu)造方法 |
問題4:
List接口和Set接口的區(qū)別:
List 接口實(shí)現(xiàn)的類中元素是有序可重復(fù)的亚斋。
Set 接口實(shí)現(xiàn)的類中元素是無序不重復(fù)的作媚。
問題3:
接口與類之間的關(guān)系
- 類與類之間的關(guān)系:繼承 extends, 單一繼承,多層繼承
- 類與接口之間的關(guān)系:實(shí)現(xiàn) implements帅刊, 多繼承纸泡,多實(shí)現(xiàn)
- 接口與接口之間的關(guān)系:繼承 extends
問題2
String類型的比較,看如下代碼和相應(yīng)的結(jié)果:
String s1 = new String("hello");
String s2 = "hello";
String s3 = "hello";
System.out.println(s1==s2);//false
System.out.println(s1==s3);//false
System.out.println(s2==s3);//true
為什么最后一個(gè)比較的結(jié)果為true赖瞒?
為了字符串的重復(fù)使用女揭,字符串常量的內(nèi)容是存儲(chǔ)在方法區(qū)的常量池里面的。如下圖所示:
字符串常量存儲(chǔ)結(jié)構(gòu)
問題1:
String為引用類型栏饮,當(dāng)String變量作為函數(shù)參數(shù)傳遞時(shí)吧兔,即使函數(shù)內(nèi)部修改了String的值,為什么不影響原來的值(函數(shù)外面的該參數(shù))袍嬉,為什么和傳遞數(shù)組名不一樣境蔼?
JAVA數(shù)據(jù)類型有兩種:基本類型和引用類型
- 基本類型:byte short int long float double char boolen
- 引用類型:類灶平、接口、數(shù)組
原因:String是一個(gè)final修飾的類箍土,JAVA虛擬機(jī)在每次修改String的值時(shí)都是重新申請(qǐng)內(nèi)存逢享。因此不會(huì)影響方法外該變量的值。如果用StringBuilder就不一樣了涮帘,用append拼接字符串后拼苍,是在原有地址上擴(kuò)充。