第三周学习笔记
文章目錄
- 2022.1.15
- 其他
- 2022.1.16
- 問題
- 集合
- Map
- 其他
- 2022.1.20
- 問題
- 集合
- Map
- 其他
- 2022.1.21
- 問題
- 集合
- Map
- 2022.1.23
- 思考題
- 查閱時一些有趣的信息
- 其他
- 查閱時一些有趣的信息
- 其他
2022.1.15
其他
注意下,這種寫法下會導致a1在{}作用域外無法使用
所以針對異常處理的話,我個人感覺他不是用來在主函數里進行對象創建的時候用的,而是檢驗算法中正確性用的
論正確的如何在創建對象的過程中完成對錯誤的鑒定
Pokemon pokemon = null;try{if(a.equals("Surf")){pokemon= new Pachirisu();}else if(a.equals("Cut")){pokemon= new Lapras();}else if (a.equals("Cut Surf")){pokemon= new Furret();}else if(a.equals("Cut,Surf")){pokemon = new Furret();}else {throw new Exception("Please input again , because your operation is out of order");}return pokemon;}catch (Exception e){e.printStackTrace();return null;}}如何在格式字符串輸出的時候里面包含雙引號,可以按下面的操作
throw new Exception("Please input again and make sure that your operation is in the range of " +"\"Cut\" and \"Surf\" and \"Cut Surf\"");請說說 Java 中抽象類和接口的不同之處
接口的變量默認被什么修飾符修飾? 方法呢?
接口的變量默認被修飾為public static final類型,方法默認被public修飾符修飾
public class two implements three {enum test{a,b,c,d,e,max}//three.a=89;@Overridepublic void test() {System.out.println("hello ");}public static void main(String[] args){//three.a=99;System.out.println(three.a);} }接口中只能有 public 公有方法 這句話正確咩?
父類如果實現了一個接口的話,子類就會默認繼承父類實現的接口,即便接口里被父類實現的方法存在默認方法
public interface three {int a=9999;void test();public default void testTwo(){System.out.println("this is a test");} } public class two implements three {enum test{a,b,c,d,e,max}//three.a=89;@Overridepublic void test() {System.out.println("hello ");}public static void main(String[] args){//three.a=99;System.out.println(three.a);three Three = new two();} } public class four extends two{public static void main(String[] args){four test = new four();test.test();} }2022.1.16
問題
什么情況下上述代碼存在問題?set里存在元素
集合
鏈表.get(i)方法得到的是一個鏈表元素,相當于從屬于鏈表這個父類,所以如果我們需要調用鏈表元素中的特有方法的話,必須對鏈表元素進行強制類型轉化如下
for (int i = 0; i < noticeList.size(); i++){System.out.println(i+1+":"+((Notice)(noticeList.get(i))).getTitle());}然后注意下,可以通過i+1加上字符串的形式寫出類似于自動填寫序號的作用
注意下noticeList.size()不要忘了后面的括號
注意下set方法的使用,并不是直接修改,而是通過修改元素然后修改的鏈表
Set
有關于如何向集合中添加元素并且輸出
package Eetjihe;import java.util.HashSet; import java.util.Iterator;public class one {public static void main(String[] args) {HashSet set = new HashSet();set.add("red");set.add("green");set.add("yellow");set.add("blue");Iterator it = set.iterator();while (it.hasNext()) {System.out.println(it.next()+" ");}} }注意,Set類的實例沒有直接可以調用元素的方法,所以需要利用迭代器進行操作
注意迭代器操作的時候不要寫成這個樣子
while (it.hasNext()) {System.out.println(it+" ");}這是一個死循環,因為it不能自己到下一個元素,并且此時輸出來的應該是it的地址
向集合中插入元素,編譯器是不會報錯的,且集合內不會出現重復元素
如何將自定義類加入到hashset中去
package Eetjihe;public class Cat {private String name;private int month;private String species;public Cat(String name, int month, String species){this.month=month;this.species=species;this.name=name;}public int getMonth() {return month;}public String getSpecies() {return species;}public String getName() {return name;}public void setMonth(int month) {this.month = month;}public void setName(String name) {this.name = name;}public void setSpecies(String species) {this.species = species;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", month=" + month +", species='" + species + '\'' +'}';} } package Eetjihe;import java.util.HashSet; import java.util.Iterator; import java.util.Set;public class catTest {public static void main(String[] args){Cat huahua = new Cat("huahua",12,"English");Cat fanfan = new Cat("fafan",1,"Chinese");Set set = new HashSet();set.add(huahua);set.add(fanfan);Iterator it = set.iterator();while(it.hasNext()){System.out.println(it.next()+" ");}} }還有注意下,輸出語句還可以寫成這樣
for (int i=0;i<set.size();i++){System.out.println(it.next());}為了防止set在添加自定義類時添加了重復數據,我們需要重設hashCode方法和equals方法,因為hashCode我直接按照系統默認來的,等數據結構解決了在回來處理這個問題,暫時先跳過,equals方法按照下面的來寫
@Overridepublic boolean equals(Object obj) {if(this==obj) {return true;}if(obj.getClass()== Cat.class){Cat cat = (Cat) obj;return cat.getName().equals(this.name) && cat.getMonth()==(this.month) && cat.getSpecies().equals(this.species);}return false;}在上面,obj首先是由對象向上轉型得到的,然后getClass()方法得到的是class文件信息,每一個實例對象都歸屬于一個class文件信息,我只是粗略的了解下,這里包含二進制文件的一些內容,但也不是很深,我選擇先跳過,因為當前我覺得還沒必要理解那么深入就可以解決問題了
然后處理下第一個if的問題:這個理解起來其實挺簡單的,就是直接比較地址,如果地址相同的話,那么二者必然相同,這沒啥好說的
第二個if是先判斷兩者的class文件是否相同,如果相同就將obj進行強制轉化成所需類型.然后進行上面的比較就好
然后為什么傳入obj類型:因為任何類型都可以強制轉化成Object類型,如果不用Object類型的話,用一個具體的類的話,如果我們用了個不同于這個具體類的對象的話,程序會不知道怎么處理,然后直接給你來個報錯
如何通過變量名查找和通過類中變量查找
it=set.iterator();if(set.contains(huahua)){System.out.println(huahua);}else{System.out.println("沒有信息");}boolean flag=false;while(it.hasNext()){Cat cat = (Cat) it.next();if(cat.getName().equals("huahua")){flag=true;}}if(flag){System.out.println("find it");}else{System.out.println("No");}泛型的使用
上面的寫法保證了自動轉化時都是我們需要的類型,不需要進行強制類型轉化
如何刪除集合中的元素
刪除單個元素
for (Cat cat : set){if(cat.getName().equals("huahua")){set.remove(cat);break;} }刪除多個元素
HashSet<Cat> set1= new HashSet<Cat>();for (Cat cat : set){if(cat.getMonth()<=10){set1.add(cat);}}set.removeAll(set1);Map
創建HashMap
HashMap<String,String> map = new HashMap<String,String>();添加HashMap數據
Scanner input = new Scanner(System.in);HashMap<String,String> map = new HashMap<String,String>();for(int cnt=0;cnt<3;cnt++) {String key = input.next();String value = input.next();map.put(key,value);}用迭代器輸出key和value
Iterator<String> it = map.values().iterator();System.out.println("value is ");while(it.hasNext()) {System.out.println(it.next());}it= map.keySet().iterator();System.out.println("key is ");while(it.hasNext()) {System.out.println(it.next());}Set<Map.Entry<String,String>> entrySet=map.entrySet();System.out.println("key-value");for(Map.Entry<String,String> entry : entrySet){System.out.println(entry.getKey()+"-"+entry.getValue());}其他
如果你數據沒有輸完然后用了ctrl+D,會強制終止程序繼續運行,并且還會給你報錯,我得到的報錯信息是下面這樣的
Exception in thread "main" java.util.NoSuchElementExceptionat java.base/java.util.Scanner.throwFor(Scanner.java:937)at java.base/java.util.Scanner.next(Scanner.java:1478)at zidian.one.main(one.java:12)2022.1.20
問題
集合
Map
如何通過key來進行查找
Set<String> keySet= map.keySet();String a = input.next();for(String key : keySet){if(key.equals(a)){System.out.println("find it and the key is "+key+" the value is " + map.get(key));}}如果插入的key值是有重復的,那么以后面的為準,前面的key值會被刷新
其他
2022.1.21
問題
集合
Map
如何先HashMap中添加入我們自定義的類
while(i<3){String id = input.next();if(GoodMap.containsKey(id)){continue;}String name = input.next();double value = input.nextDouble();Goods good = new Goods(id,name,value);GoodMap.put(id,good);i++;}2022.1.23
思考題
List list = new ArrayList(); 能添加各種類型的數據嗎?
理論上可以添加數據,就像下面這樣
package thinkingOne;import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class testOne {public static void main(String[] args) {List list = new ArrayList();list.add(new Integer((3332432)));list.add("afhfhad");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).toString());}} }不過有時也會出現運行時錯誤,比如下面這種
public class testOne {public static void main(String[] args) {List list = new ArrayList();list.add(new Integer(3141));list.add("afhfhad");for (int i = 0; i < list.size(); i++) {String str =(String) list.get(i);System.out.println(str);}} }所以需要泛型來對list中的變量進行約束
如果容器中的數據類型不確定,那么在使用前,應該先進行類型判斷再使用,從而避免運行時異常。
if (list.get(i) instanceof String){String str = (String) list.get(i); }List list = new Array()會報錯嗎?為什么?
會報錯
public class testOne {public static void main(String[] args) {List<Object> list =new Array<Integer>();list.add(1);} }因為List和Array間,前者表示列表,后者表示數組,二者其實不同
如果改成
public class testOne {public static void main(String[] args){List<Object> list = new ArrayList<Integer>();} }好像也一樣報錯,就兩種不會報錯
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList();不過添加Integer的元素時,會顯示無法向Object轉型
什么時候用?、extends、super?
我沒看太懂這個問題,我對這個的理解就是什么時候用extend和super,所以下面寫一下
用exetend就是寫我想寫一個類,并且這個類和某一個類具有明顯的繼承關系時,我就會用extend,以此表示這個類是某個類的子類,以減少一些代碼量
用super(),我用這個就常用的就是訪問父類的構造方法,當然它還可以用來訪問父類的一些變量,和一些方法,下面用代碼展示下
package thinkingOne;public class testOne {public static void main(String[] args){dog1 testOne = new dog1(1,2);testOne.fun2();} } class dog{private int a,b;public dog(int a,int b) {this.a = a;this.b = b;}String name = "I am the one";void fun1(){System.out.println("hello");} }class dog1 extends dog{public dog1(int a,int b){super(a,b);}public void fun1(){System.out.println(name);}public void fun2(){super.fun1();fun1();}}然后再寫上面的時候發現了我幾個問題吧
private修飾符不能通過super.變量名進行訪問,protected可以
然后不能直接在class里寫super.父類方法名,比如這樣
super.fun1();要這么寫
public void fun2() {super.fun1();}其中修飾符你隨意就好
List<?>和List的區別?
- List<?>,即通配符類型,其引用變量,同樣可以接受任何對應List的參數化類型,包括List,但不能添加任何元素,保證了安全性和表述性。但不具有表述性,從中取出的元素時Object類型,要通過手動轉換才能得到原本的類型。
- List,即實際類型參數為Object的參數化類型,其引用變量可以接受List,可以添加元素,但不能接受除了其本身外的任何參數化類型(泛型的子類型化原則)
查閱時一些有趣的信息
其他
ed可以
3. 然后不能直接在class里寫super.父類方法名,比如這樣```javasuper.fun1();```要這么寫```javapublic void fun2() {super.fun1();}```其中修飾符你隨意就好List<?>和List的區別?
- List<?>,即通配符類型,其引用變量,同樣可以接受任何對應List的參數化類型,包括List,但不能添加任何元素,保證了安全性和表述性。但不具有表述性,從中取出的元素時Object類型,要通過手動轉換才能得到原本的類型。
- List,即實際類型參數為Object的參數化類型,其引用變量可以接受List,可以添加元素,但不能接受除了其本身外的任何參數化類型(泛型的子類型化原則)
查閱時一些有趣的信息
其他
總結
- 上一篇: Buuoj reverse1
- 下一篇: Rumor CodeForces - 8