1.收獲
今天是不一樣的昨天理澎,以前總是以為自己的解決辦法是最適合自己的,但是我今天發(fā)先我錯(cuò)了曙寡,也許把別人的優(yōu)秀方法借鑒過來糠爬,然后轉(zhuǎn)化為自己的方法,肯定是比以前自己的方法好举庶,不僅解決了以前自己沒有解決的問題执隧,而且還還應(yīng)用各個(gè)方面。這也許是我今天最大的收獲。我要把這種方法養(yǎng)成一種習(xí)慣深入到各個(gè)方面镀琉,也許這樣才使自己成長峦嗤。今天也看見了自己與別人的差距在哪,不是你不夠努力滚粟,而是你努力的方向不對(duì)寻仗,朝著錯(cuò)誤的方向前進(jìn),只會(huì)離目標(biāo)越來越遠(yuǎn)凡壤,所以要找到正確的方向加上好的方法署尤,不要忘了還有努力!加油亚侠!
2.技術(shù)
(1)java泛型的定義和應(yīng)用
(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
(4)異常處理的方法
3.技術(shù)的實(shí)際應(yīng)用和實(shí)踐
(1)java泛型的定義和應(yīng)用
什么是泛型:
泛型是程序設(shè)計(jì)語言的一種特性曹体。允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中編寫代碼時(shí)定義一些可變部分,那些部分在使用前必須作出指明硝烂。
為什么要用泛型:
不會(huì)強(qiáng)行對(duì)值類型進(jìn)行裝箱和拆箱箕别,或?qū)σ妙愋瓦M(jìn)行向下強(qiáng)制類型轉(zhuǎn)換,所以性能得到提高滞谢。通過知道使用泛型定義的變量的類型限制串稀,編譯器可以在一個(gè)高得多的程度上驗(yàn)證類型假設(shè),所以泛型提高了程序的類型安全狮杨。
怎末應(yīng)用泛型:
A.泛型的分類
泛型可分為泛型類母截,泛型方法,泛型數(shù)組
B.泛型的定義與應(yīng)用
首先我們需要定義一個(gè)泛型類橄教,在這個(gè)類中與以往的類有不同之處清寇,在類名后面有了<T>,并且在他的屬性中护蝶,也是被T 修飾华烟,并不確定他的類型,這就是泛型持灰。在泛型類里面在定義這個(gè)類的構(gòu)造方法盔夜。(注意:下面的T(Type)可以被換成E)
class GenericTest<T>{
int age;
T a1;
T a2;
public GenericTest( T a2,T a1){
this.a1=a1;
this.a2=a2;
System.out.println(a1.equals(a2));
}
}
然后我們?cè)谥骱瘮?shù)創(chuàng)建這個(gè)類的具體對(duì)象
GenericTest<String> g2=new GenericTest<>("VVTFVBG","VVTFVBG");
GenericTest<Integer> g1=new GenericTest<>(1,1);
上面的泛型解決不同類型的對(duì)象的創(chuàng)建。
在說二三條之前我們來里以下set,map,list之間的關(guān)系
(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
Set類繼承Collection接口堤魁,HashSet繼承Set類喂链,而TreeSetS是實(shí)現(xiàn)類SortedSet接口,SortedSet 接口使繼承Set類姨涡。
Set集合
1.集合里面的對(duì)象是不能重復(fù)的 如果重復(fù)就加不進(jìn)去
-----內(nèi)部使用的是HashMap - Map來實(shí)現(xiàn) 鍵值對(duì) 鍵key不能重復(fù)
------------如何是實(shí)現(xiàn)HashMap里面的key不相同
--------- -------- 計(jì)算這個(gè)key對(duì)應(yīng)對(duì)象的hash值
------------- ----整數(shù):在對(duì)象的地址的基礎(chǔ)上按照一定的算法計(jì)算出來的一個(gè)整數(shù) 這個(gè)整數(shù)就是hash值衩藤,如果兩個(gè)對(duì)象相同 那麼計(jì)算出來的hash值相同
2.集合是無序的 添加的順序和存儲(chǔ)的順序無關(guān)
----使用了默認(rèn)的排序
HashSet集合
定義
HashSet<String> names=new HashSet<>();
names.add("jack");
names.add("merry");
names.add("abc");
names.removeIf(element ->{return element.compareTo("c")>0;});
System.out.println(names);
System.out.println(names.hashCode());
實(shí)現(xiàn)效果:
TreeSet集合
在這個(gè)集合中能夠?qū)崿F(xiàn)對(duì)這集合中的對(duì)象進(jìn)行排序
首先我們先創(chuàng)建一個(gè)person類吧慢,然后創(chuàng)建多個(gè)person的多個(gè)具體的對(duì)象涛漂,然后將這些對(duì)象放到TreeSet集合中。
class Person implements Comparable{
String name;
int age;
public Person(String name, int age){
this.name=name;
this.age=age;
}
}
Person p1=new Person("jack",20);
Person p2=new Person("merry",10);
Person p3=new Person("tom",20);
people.add(p1);
people.add(p2);
people.add(p3);
在進(jìn)行排序的過程中,會(huì)進(jìn)行對(duì)象的比較匈仗,而equals 比較的是對(duì)象內(nèi)部的內(nèi)瓢剿, 使用的兩個(gè)對(duì)象在類中必須實(shí)現(xiàn)Comparable接口的compareTo方法在compareTo里面實(shí)現(xiàn)具體該如何比較,想要打印出對(duì)象的信息進(jìn)必須要實(shí)現(xiàn)ToString方法
class Person implements Comparable{
String name;
int age;
public Person(String name, int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
//1. 判斷o對(duì)象是不是peron的一個(gè)對(duì)象
if(o instanceof Person){
Person o1=(Person)o;
//自己規(guī)定比較的策略
if(this.age!=o1.age){
return this.age-o1.age;
}else{
//年齡相同情況下
return this.name.compareTo(o1.name);
}
}else{
return -1;
}
}
}
對(duì)集合中的對(duì)象排序的兩種方法
//比較:方法一
TreeSet<Person> people=new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
//方法二
TreeSet<Person> people=new TreeSet<>((Person p1,Person p2) -> p1.compareTo(p2));
實(shí)現(xiàn)效果:
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
HashMap集合
方法的具體使用
HashMap<String,Integer> score=new HashMap<>();
//添加對(duì)象 添加鍵值對(duì)
score.put("CHINA",100);
score.put("CHI",95);
score.put("C",86);
//更改某個(gè)鍵值對(duì)對(duì)應(yīng)的值
score.put("C",85);
//獲取鍵值對(duì)的個(gè)數(shù)
System.out.println(score.size());
//獲取所有的key
System.out.println(score.keySet());
//獲取所有的值
System.out.println(score.values());
//獲取Entry:key-value
System.out.println( score.entrySet());
//獲取一個(gè)鍵Key對(duì)應(yīng)的值
System.out.println(score.get("CHINA"));
}
效果:
在HashMap集合中我們?cè)鯓觼肀闅v鍵值對(duì)悠轩,下面有兩種方法
//1.通過遍歷key來得到每一個(gè)Key對(duì)應(yīng)的值
for(String key:score.keySet()){
//通過key得到值
int s=score.get(key);
System.out.println("key:"+key+" value:"+s);
}
//2.通過Entryset 得到Entry對(duì)象的集合
//一個(gè)Entry管理一個(gè)鍵值對(duì) getkey getvalue
Set<Map.Entry<String,Integer>> entrys = score.entrySet();
for(Map.Entry entry:entrys){
//得到Entry對(duì)應(yīng)的keyf
String key=(String)entry.getKey();
//獲取Entry的值
Integer value =(Integer)entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
System.out.println(score);
效果:
在HashSet间狂,TreeSet,HashMap火架,TreeMap集合的特殊要求
(4)異常處理的方法
什么是異常鉴象,什么是錯(cuò)誤:
異常是指使程序出現(xiàn)停止編譯的現(xiàn)象,經(jīng)過修改何鸡,程序正常運(yùn)行纺弊,而錯(cuò)誤是使程序出現(xiàn)崩潰的現(xiàn)象。程序異常和錯(cuò)誤沒有明顯的分界線骡男。
出現(xiàn)異常怎末辦:
我們可以根據(jù)系統(tǒng)的提示將異常拋出淆游,利用系統(tǒng)的方法。但是我們也可以自己寫異常的方法隔盛,利用自己的方法將異常拋出
處理異常的模板
try{
執(zhí)行代碼
可能會(huì)出現(xiàn)異常
一旦出現(xiàn)異常 系統(tǒng)自動(dòng)會(huì)為我們創(chuàng)建一個(gè)異常對(duì)象 并拋出
}catch( NullPointException e){
如果需要自己處理異常 局catch
}catch(IOException e){
如果有多個(gè)異常 可以使用多個(gè)catch來捕獲
如果有多個(gè)異常 catch的順序是從小到大
}catch(Exception e){
}finally{
//不管有沒有異常finally都會(huì)被執(zhí)行
處理資源回收 不會(huì)處理網(wǎng)絡(luò)連接 數(shù)據(jù)庫連接 I/O流
}
注意:
如果異常出現(xiàn) 后面的代碼不會(huì)執(zhí)行
try代碼塊 不要抓太多代碼
例子:
nt a=0;
int b=20;
FileReader fr=null;
try{
int c=b/a;
System.out.println("hello");
fr=new FileReader("");
}catch (ArithmeticException e){
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try{
fr.close();
}catch (IOException e){
}
}
在這代碼中 int c=b/a;出現(xiàn)了異常犹菱,后面的語句: System.out.println("hello");沒有執(zhí)行,那麼我們只需要將a的值部位0就可以了
現(xiàn)在將 System.out.println("hello");執(zhí)行了吮炕,但是在后面的程序中出現(xiàn)了異常腊脱,所以我們利用了系統(tǒng)的方法將他拋出。
try(){
}catch{
}這種拋出異常方法
圓括號(hào)里面只能添加可以關(guān)閉的對(duì)象
實(shí)現(xiàn)了Closeble接口的對(duì)象
如果出項(xiàng)異常 系統(tǒng)就會(huì)自動(dòng)關(guān)閉這個(gè)資源来屠。
try(FileReader fr1=new FileReader("ddd")){
//使用對(duì)象
}catch(IOException e){
e.printStackTrace();
}
利用自己寫的拋出異常的方法來拋出程序的異常
首先我們需要根據(jù)系統(tǒng)中的拋出異常的方法來寫出拋出異常的類
class PXDException extends Exception{
//1.提供一個(gè)無參構(gòu)造方法
public PXDException(){
}
//2.提供一個(gè)有參構(gòu)造方法 參數(shù)是一個(gè)字符串
public PXDException(String des){
super(des);
}
}
然后再創(chuàng)建一個(gè)類虑椎,來拋出這個(gè)異常的具體信息,以提示用戶進(jìn)行修改
class TException {
public static void test3()throws PXDException{
StackTraceElement[] stackTrace=Thread.currentThread().getStackTrace();
StackTraceElement e=stackTrace[2];
String detail=e.getClassName()+"->"+e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();
//....
throw new PXDException("自己的異常類:無所作為 "+detail);
}
}
然后在實(shí)際的運(yùn)行過程中進(jìn)行調(diào)用方法來拋出
try {
TException.test3();
} catch (PXDException e) {
System.out.println(e.getMessage());
}
效果: