集合的由來?
面向?qū)ο笳Z言對事務的體現(xiàn)都是以對象的形式,所以為了方便對多個對象的操作款票,JAVA就提供了集合類
集合和數(shù)組的區(qū)別?
數(shù)組 | 集合 |
---|---|
長度固定 | 長度可變 |
存儲基本數(shù)據(jù)類型 | 只可以存儲對象 |
Collection集合的功能概述?
Collection表示一組對象控硼,這些對象也成為collection元素。
一些collection允許有重復的元素徽职,另一些不允許有重復的元素象颖。
一些collection是有序的,另一些是無序的姆钉。
Collection集合存儲字符串并遍歷?(迭代器)
public static void collectiontest() {
Collection<String> col=new ArrayList();
col.add("eee");
col.add("cvv");
col.add("nvj");
Iterator it = col.iterator(); //迭代器
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
Collection集合存儲自定義對象并遍歷?(迭代器)
public static class Person{
private String name;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection c=new ArrayList();
Person p1=new Person("呵呵噠");
Person p2=new Person("萌萌噠");
c.add(p1);
c.add(p2);
Iterator It=c.iterator();
while(It.hasNext()) {
Person s=(Person)It.next();
System.out.println(s.getName());
}
List集合的特有功能?
List是有序的collection说订。可以對列表中每個元素的插入位置進行精確地控制潮瓶。用戶可以根據(jù)元素的證書索引訪問元素陶冷,并搜索列表中的元素。
List接口成員方法
void add(int index,E element)//添加元素
E remove(int index)//刪除元素
E get(int index)//獲得元素
E set(int index,E element)//修改元素
ListIterator listIterator()//迭代器
boolean hasPrevious()//ListIterator的方法毯辅,用于反向遍歷鏈表,與hasNaxt()方法相同
E previous()//ListIterator的方法埂伦,用于反向遍歷鏈表,與next()方法相同返回越過的對象
ConcurrentModificationException//在每個迭代器的方法開始處檢查自己改寫操作的計數(shù)值是否與集合的改寫操作計數(shù)值一致思恐;如果不一致沾谜,拋出ConcurrentModificationException
List集合存儲字符串并遍歷?(迭代器和普通for)
public static void ListTest() {
List list=new ArrayList();
list.add("呵呵呵");
list.add("好累啊");
list.add("努力吧");
for(int i=0;i<list.size();i++) {
System.out.println("這是for循環(huán)的:"+list.get(i));
}
ListIterator litor=list.listIterator();
while(litor.hasNext()) {
String s=(String)litor.next();
System.out.println("這是ListIterator的:"+s);
}
}
并發(fā)修改異常出現(xiàn)的原因?解決方案?
A: 出現(xiàn)的現(xiàn)象
迭代器遍歷集合,集合修改集合元素
B: 原因
迭代器是依賴于集合的胀莹,而集合的改變迭代器并不知道基跑。
C: 解決方案
a:迭代器遍歷,迭代器修改(ListIterator)
元素添加在剛才迭代的位置
b:集合遍歷描焰,集合修改(size()和get())
元素添加在集合的末尾
常見的數(shù)據(jù)結構的特點?
棧:Stack<T> 后進先出媳否。
隊列:Queue<T> 先進先出。隊列在聲明的時候可以是泛型荆秦。
數(shù)組:只合適查詢比較頻繁篱竭,增刪較少的情況,對于int類型數(shù)據(jù)步绸,默認初始值為1;
鏈表:單鏈表和雙鏈表掺逼,LinkedList list=new LinkedList(),出了頭結點,每個節(jié)點包含一個數(shù)據(jù)域和一個指針域靡努,除了頭坪圾、尾節(jié)點晓折,每個節(jié)點的指針指向下一個節(jié)點惑朦。
List集合的子類特點
ArrayList:底層數(shù)據(jù)結構是數(shù)組兽泄,查詢快,增刪慢漾月。線程不安全病梢,效率高。
Vector:底層數(shù)據(jù)結構是數(shù)組梁肿,查詢快蜓陌,增刪慢。線程安全吩蔑,效率低钮热。特有addElement(E obj),E elementAt(int index),Enumeration element()三種方法。
LinkedList:底層數(shù)據(jù)結構是鏈表烛芬,查詢慢隧期,增刪快,線程不安全赘娄,效率高仆潮。特有addFirst(E e)、addLast(E e),getFirst()遣臼、getLast(),removeFirst()性置、removeLast() 6中方法。
LinkedList練習
A:LinkedList存儲字符串并遍歷
B:LinkedList存儲自定義對象并遍歷
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> lt=new LinkedList<String>();
lt.add("String");
lt.add("interstring");
Oo oo=new Oo("不好玩","找工作好累");
lt.add(oo.getIi());
lt.add(oo.getMm());
for(int i=0;i<lt.size();i++) {
System.out.println(lt.get(i));
}
}
泛型是什么?格式是?好處是?
泛型是一種特殊的類型揍堰,它把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候進行鹏浅。
也被稱作為參數(shù)化類型,可以把類型當作參數(shù)一樣傳遞過來屏歹,在傳遞過來之前并不明確隐砸,但在使用的時候就變得明確。格式:
- 泛型類
public class 類名<泛型類型,……> - 泛型方法
public<泛型類型>返回類型 方法名(泛型類型) - 泛型接口
public interface 接口名<泛型類型1……>
- 好處:
- 提高了程序的安全性
- 將運行期遇到的問題轉(zhuǎn)移到了編譯期
- 省去了類型強轉(zhuǎn)的麻煩
增強for的格式是?好處是?弊端是?
- 作用:簡化數(shù)組和Collection集合的遍歷
- 格式:
for(元素類型變量 變量:數(shù)組或者Collection集合){
使用變量即可西采,該變量就是元素
} - 好處:簡化遍歷
- 弊端:增強for的目標要判斷是否為null
靜態(tài)導入的格式是?注意事項是?
- 格式:improt static 包名……類名.方法名;
- 注意事項:
方法必須是靜態(tài)
如果有多個同名的靜態(tài)方法凰萨,必須加前綴
可變參數(shù)的作用是?格式是?注意事項是?
- 作用:
定義方法時候不知道該定義多少個參數(shù) - 格式:
修飾符 返回值類型 方法名(數(shù)據(jù)類型…… 變量名){} - 注意事項:
這里的變量其實是一個數(shù)組。
如果一個方法有可變參數(shù)械馆,并且有多個參數(shù)胖眷,那么可變參數(shù)肯定是最后一個
用下列集合完成代碼
Collection
List
ArrayList
Vector
LinkedList
存儲字符串并遍歷
存儲自定義對象并遍歷
要求加入泛型,并有增強for遍歷霹崎。
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> lt=new LinkedList<String>();
Collection<String> l1=new ArrayList<String>();
ArrayList<String> l2=new ArrayList<String>();
Vector<String> l3=new Vector<String>();
lt.add("String");
lt.add("interstring");
Oo oo=new Oo("不好玩","找工作好累");
lt.add(oo.getIi());
lt.add(oo.getMm());
for(String s:lt) {
System.out.println("LinkedList:"+s);
}
l1.addAll(lt);
for(String s:l1) {
System.out.println("Collection:"+s);
}
l2.addAll(l1);
for(String s:l2) {
System.out.println("ArrayList:"+s);
}
l3.addAll(l2);
for(String s:l3) {
System.out.println("LinkedLis:"+s);
}
}
class Oo{
public Oo(String ii, String mm) {
super();
this.ii = ii;
this.mm = mm;
}
public String getIi() {
return ii;
}
public void setIi(String ii) {
this.ii = ii;
}
public String getMm() {
return mm;
}
public void setMm(String mm) {
this.mm = mm;
}
private String ii;
private String mm;
}
Set接口
一個不包含重復元素的collection
HasSet類
不保證set的迭代順序珊搀,特別是它不保證該順序恒久不變。
底層數(shù)據(jù)結構是哈希表尾菇,元素是鏈表的數(shù)組境析。哈希表依賴于哈希值存儲囚枪。
LinkedHashSet類
元素有序唯一,由鏈表保證元素有序劳淆,由哈希表保證元素唯一链沼。
TreeSet
使用元素的自然順序?qū)υ剡M行排序,或者根據(jù)創(chuàng)建set時提供的Comparator進行排序沛鸵,
底層數(shù)據(jù)結構是紅黑樹
編寫一個程序括勺,獲取10個1至20的隨機數(shù),要求隨機數(shù)不能重復曲掰。
Random r=new Random();
int h;
TreeSet<Integer> tst=new TreeSet<Integer>();
for(int i=0;tst.size()<10;i++) {
h=r.nextInt(20);
tst.add(h);//TreeSet不允許重復元素疾捍,所有不需要判斷重復
}
for(Integer m:tst) {
System.out.println(m);
}
什么是異常
異常就是Java程序在運行過程中出現(xiàn)的錯誤
異常的分類
異常分為三類
- Error //編譯時異常,運行時候可以不顯示處理
- Exception //編譯時異常
- RuntimeExeption //所有RuntimeExeption都成為運行時異常栏妖,必須顯示處理
如何處理異常
JVM默認把異常的名稱乱豆,錯誤原因以及一場出現(xiàn)的位置等信息輸出在控制臺
程序停止運行
-
異常的進行過程:
列如:jvm發(fā)現(xiàn)運算是已經(jīng)違反了數(shù)學運算規(guī)則,java將這種常見的問題進行描述,并封裝成了對象叫做ArithmeticException
當除0運算發(fā)生后,jvm將該問題打包成了一個異常對象.
并將對象拋給調(diào)用者main函數(shù),new ArithmeticException("/by zero");main函數(shù)收到這個問題時,有兩種處理方式:
1,自己將該問題處理,然后繼續(xù)運行
2,自己沒有針對的處理方式,只有交給調(diào)用main的jvm來處理
jvm有一個默認的異常處理機制,就將該異常進行處理.并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺上
同時將程序停止運行 異常處理方案
try……catch……finally
其中try用于檢測異常,catch用于捕獲異常吊趾,finally使用結束資源throw宛裕、throws、Throwable
throw | throws | Throwable |
---|---|---|
只用在方法體內(nèi) | 用在方法聲明后面趾徽,跟的是異常類名 | 它是接口 |
只能拋出一個異常對象名 | 可以跟多個異常類名 | getMessage()獲取異常信息续滋,返回字符串 |
拋出異常由方法體內(nèi)的語句處理 | 拋出異常由方法調(diào)用者來處理 | printStackTrace()獲取異常類名和異常信息,以及異常位置孵奶,返回void |
執(zhí)行throw則一定拋出了某種異常 | throws表示出現(xiàn)異常的一種可能性疲酌,不一定發(fā)生 | printStackTrace(PrintStram s)通常保存在文檔中 |
- 當異常發(fā)生時候,后續(xù)程序需要執(zhí)行就用try了袁,不需要就用throws
編譯時期異常和運行時期異常的區(qū)別
編譯時期異常朗恳,JAVA程序必須顯示處理,否則程序會發(fā)生錯誤载绿。
運行時期異常粥诫,JAVA程序無需顯示處理,也可以和編譯時期異常一樣處理崭庸。
finally關鍵字的特點
被finally控制的語句體一定會執(zhí)行
特殊情況:在執(zhí)行到finally之前jvm退出了怀浆。
- 作用:用于釋放資源,在IO流操作和數(shù)據(jù)庫操作中會見到
finally相關的面試題
final,finally和finalize的區(qū)別
final用于修飾類和變量怕享,修飾過的類不能被繼承执赡,修飾過的變量就變成個常量
finally是異常處理中使用的。用于不管初步出現(xiàn)異常都必須處理的事情函筋,列如關閉連接沙合。
finalize是方法名,是JAVA的垃圾清理機制跌帐,用于清理對象內(nèi)存首懈,在垃圾收集器刪除對象之前調(diào)用绊率。
如果catch里面有return語句,請問finally的代碼還會執(zhí)行嗎?如果會究履,請問是在return前還是return后滤否。
會執(zhí)行,在return之前
File的構造方法
Public File(String pathname)
Public File(String parent,String child)
Public File(File parent,String child)
File的成員方法
- 創(chuàng)建功能
public boolean createNewFile()
public boolean mkdir()
public boolean mkdirs() - 刪除功能
public boolean delete() - 重命名功能
public boolean renameTo(File dest) - 判斷功能
public boolean isDirectory()
public boolean isFile()
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isHidden() - 基本獲取功能
public String getAbsolutePath()
public String getPath()
public String getName()
public long length()
public long lastModified() - 高級獲取功能
public String[] list()
public File[] listFiles()
獲取指定目錄下指定后綴名的文件名稱
判斷E盤目錄下是否有后綴名為.jpg的文件挎袜,如果有顽聂,就輸出此文件名稱
File file=new File("E:\\");
String[] arr=file.list();
for(String s:arr) {
if(s.endsWith(".jpg")) {
System.out.println(s);
}
}