美文网首页计算机杂谈大数据程序员
【寒假学Java】 持有对象?俗称泛型和容器以及迭代器吧

【寒假学Java】 持有对象?俗称泛型和容器以及迭代器吧

作者: 张照博 | 来源:发表于2018-02-03 00:44 被阅读87次

    正文之前

    今天又是迷醉的一天,嘿嘿,看小说到现在!!还是得看看书的,今天貌似到了容器,泛型这一节了。好好看会。

    正文

    第一点:Java内置容器

    这是Java的内置的容器--序列列表。观察了一阵子之后大概的了解到,估计是定义了一种Object类型的数组,然后给了一些内置的方法可以调用,之后封装一波就是常用的容器了。当然那,肯定会有优化,但是内核应当如此!?

    import java.util.ArrayList;
    
    
    class Item_of_Array{
        private int i;
        Item_of_Array(int s){
            this.i=s;
        }
        public void getI(){
            System.out.println(i);
        }
        public String toString(){
            // System.out.println("this.getClass().getSimpleName()");
            return this.getClass().getSimpleName();
        }
    }
    
    class Item_of_Other{
        private String a;
        Item_of_Other(String s){
            this.a=s;
        }
        public void getI(){
            System.out.println(a);
        }
        public String toString(){
            // System.out.println("this.getClass().getSimpleName()");
            return this.getClass().getSimpleName();
        }
    }
    public class MainClass
    {
        @SuppressWarnings("unchecked")
        public static void main(String args[]) throws Exception
        {
            ArrayList items=new ArrayList();
            items.add(new Item_of_Array(10));
            items.add(new Item_of_Other("Other"));
            for(int i=0;i<items.size();++i){
                // System.out.println(items.getClass().getSimpleName());
                System.out.println(items.get(i).toString());  
            }
        }
    }
    

    在使用的时候随便你传入的参数是啥,反正都是Object的子类,而我记得Object含有一个toString()的方法,所以如果重写一下的话,那么就有了共性了!!所以我的才不会报错~~ 6不?

    The Result :

    Item_of_Array
    Item_of_Other
    [Finished in 1.4s]
    

    当然也是因为我用了这个,编译期间是不会报错的,但是如果没有toString的话,在运行期间还是会报错,完全是因为我重写了toString(),不然还是会报错的:


    注: /Users/zhangzhaobo/program/java/MainClass.java使用了未经检查或不安全的操作。
    注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
    Item_of_Array
    Item_of_Other
    [Finished in 1.5s]
    

    当然,根据我们C++的经验的话,ArrayList只是个模板,妥的,所以是可以传入参数类型从而限定我们add()的实参类型的,这样前面的代码其实就成了一个编译期的错误,会无法编译!!所以我们要稍稍变通,比如?多态!:

    public class MainClass
    {
        @SuppressWarnings("unchecked")
        public static void main(String args[]) throws Exception
        {
            ArrayList<Base> items=new ArrayList<Base>();
            items.add(new Item_of_Array(10));
            items.add(new Item_of_Other("Other"));
            for(int i=0;i<items.size();++i){
                // System.out.println(items.getClass().getSimpleName());
                System.out.println(items.get(i).toString());  
            }
        }
    }
    

    可以看到我限定的是Base类型,所以传入的实参必须是Base或者是其子类,这个时候我们只要这样,那样就👌OK了!!

    ava.util.ArrayList;
    
    class Base{
    
    }
    
    class Item_of_Array extends Base{
        private int i;
        Item_of_Array(int s){
            this.i=s;
        }
        public void getI(){
            System.out.println(i);
        }
        public String toString(){
            // System.out.println("this.getClass().getSimpleName()");
            return this.getClass().getSimpleName();
        }
    }
    
    class Item_of_Other extends Base{
        private String a;
        Item_of_Other(String s){
            this.a=s;
        }
        public void getI(){
            System.out.println(a);
        }
        public String toString(){
            // System.out.println("this.getClass().getSimpleName()");
            return this.getClass().getSimpleName();
        }
    }
    

    不费吹灰之力啊!!

    我是淫荡的分割线!~ mmp这话从哪儿学来的来着?

    第二点:Collection和Map:

    请注意,Collection是个接口,需要填充类型,也就是泛型的含义所在了


    我是淫荡的分割线!~ mmp这话从哪儿学来的来着?

    第三点:迭代器:

    不是吧?Java的迭代器居然只能单向移动??这不是在C++中单向链表的限制吗?这样的话,它的优越性呢?好吧,我承认它用起来好像确实挺方便。而且很安全。但是感觉还是少了那么点味道啊?

    注意了注意了!!千万不要!千万不要把java文件命名为Iterator,不然你的代码写的再对都不行啊。系统默认的迭代器类就叫这个名字,你这等于重写,不是使用了。报错如下:

    HustWolf:java zhangzhaobo$ javac Iterat.java 
    Iterat.java:19: 错误: 类型Iterator不带有参数
            for(Iterator<String> it=list.iterator();it.hasNext();)
                        ^
    1 个错误
    

    后来改了才回过头来对了。

    import java.util.*;
    
    class Item{
        Item(int s){
            this.i=s;
        }
        int i;
        public int get(){
            return i;
        }
    }
    public class Iterat{
            public static void main(String[] args)
        {
            ArrayList<Item> list=new ArrayList<Item>();
            for(int i=0;i<10;++i)
                list.add(new Item(i));
            Iterator<Item> it=list.iterator();
            while(it.hasNext()){
                Item s=it.next();
                System.out.println(s.get()+" haha");
            }
        }
    }
    

    The Result:

    0 haha
    1 haha
    2 haha
    3 haha
    4 haha
    5 haha
    6 haha
    7 haha
    8 haha
    9 haha
    [Finished in 1.7s]
    

    在网上意外找到一段迭代器的实现代码,借鉴下,很棒的!!

    深入理解Java中的迭代器 - Mr·Dragon - 博客园
    我是淫荡的分割线!~ mmp这话从哪儿学来的来着?

    第四点:Set这个好东西,跟C++的差不多了

    set这个好东西啊,跟C++有点差别,但是还是大同小异的!! 代码先走:

    import java.util.*;
    
    public class TestSet{
        public static void main(String[] args) {
            Random rand=new Random(47);
            Set<Integer> set=new HashSet<Integer>();
            for(int i=0;i<10;++i){
                set.add(rand.nextInt(100));
            }
            System.out.println(set);
        }
    }
    

    The Result:

    [0, 68, 22, 55, 7, 58, 93, 61, 29]
    [Finished in 1.4s]
    
    我是淫荡的分割线!~ mmp这话从哪儿学来的来着?

    第五点: 神器Map:

    废话真的没啥用,直接代码多爽快?

    import java.util.*;
    
    
    public class TestMap{
        public static String ShowLength(int i){
            String X=new String();
            X+='[';
            for(int s=0;s<i;++s){
                X+='*';
            }
            X+="->]";
            return X;
        }
        public static void ShowMap(Map<Integer,Integer> map,int r){
            for(int i=0;i<r;++i){
                if(map.get(i)!=null){
                    System.out.println("Number:"+i+" \tFreq:"+ShowLength(map.get(i)));
                }
                else{
                    System.out.println("Number:"+i+", Freq: Null");
                }
            }
        }
        public static void main(String[] args) {
            Random rand=new Random();
            Map<Integer,Integer> map=new HashMap<Integer,Integer>();
            for(int i=0;i<1000;++i){
                int r=rand.nextInt(100);
                Integer freq=map.get(r);
                map.put(r,freq==null?1:freq+1);
            }
            ShowMap(map,100);
        }
    }
    
    Number:0    Freq:[******->]
    Number:1    Freq:[******->]
    Number:2    Freq:[******->]
    Number:3    Freq:[*****->]
    Number:4    Freq:[***********->]
    Number:5    Freq:[*****->]
    Number:6    Freq:[**************->]
    Number:7    Freq:[********->]
    Number:8    Freq:[***********->]
    Number:9    Freq:[**************->]
    Number:10   Freq:[******************->]
    Number:11   Freq:[************->]
    Number:12   Freq:[*************->]
    Number:13   Freq:[**************->]
    Number:14   Freq:[*********->]
    Number:15   Freq:[**************->]
    Number:16   Freq:[*****->]
    Number:17   Freq:[**************->]
    Number:18   Freq:[********->]
    Number:19   Freq:[****->]
    Number:20   Freq:[*********->]
    Number:21   Freq:[*****->]
    Number:22   Freq:[*********->]
    Number:23   Freq:[*******->]
    Number:24   Freq:[*********->]
    Number:25   Freq:[***********->]
    Number:26   Freq:[**************->]
    Number:27   Freq:[********->]
    Number:28   Freq:[**********->]
    Number:29   Freq:[*******->]
    Number:30   Freq:[*********->]
    Number:31   Freq:[*************->]
    Number:32   Freq:[***************->]
    Number:33   Freq:[*********->]
    Number:34   Freq:[********->]
    Number:35   Freq:[*******->]
    Number:36   Freq:[*****************->]
    Number:37   Freq:[*************->]
    Number:38   Freq:[******->]
    Number:39   Freq:[********->]
    Number:40   Freq:[**************->]
    Number:41   Freq:[******->]
    Number:42   Freq:[*******->]
    Number:43   Freq:[************->]
    Number:44   Freq:[***********->]
    Number:45   Freq:[*************->]
    Number:46   Freq:[**************->]
    Number:47   Freq:[************->]
    Number:48   Freq:[***************->]
    Number:49   Freq:[*****->]
    Number:50   Freq:[********->]
    Number:51   Freq:[*******->]
    Number:52   Freq:[*************->]
    Number:53   Freq:[**********->]
    Number:54   Freq:[****->]
    Number:55   Freq:[****************->]
    Number:56   Freq:[******->]
    Number:57   Freq:[******************->]
    Number:58   Freq:[*********->]
    Number:59   Freq:[******->]
    Number:60   Freq:[*********->]
    Number:61   Freq:[*************->]
    Number:62   Freq:[***************->]
    Number:63   Freq:[********->]
    Number:64   Freq:[*********->]
    Number:65   Freq:[**->]
    Number:66   Freq:[**************->]
    Number:67   Freq:[*************->]
    Number:68   Freq:[*****->]
    Number:69   Freq:[**************->]
    Number:70   Freq:[*********->]
    Number:71   Freq:[*******->]
    Number:72   Freq:[*********->]
    Number:73   Freq:[*******->]
    Number:74   Freq:[**********->]
    Number:75   Freq:[********->]
    Number:76   Freq:[********->]
    Number:77   Freq:[**********->]
    Number:78   Freq:[**********->]
    Number:79   Freq:[*********->]
    Number:80   Freq:[**************->]
    Number:81   Freq:[*************->]
    Number:82   Freq:[*********************->]
    Number:83   Freq:[***********->]
    Number:84   Freq:[*****->]
    Number:85   Freq:[*****->]
    Number:86   Freq:[************->]
    Number:87   Freq:[************->]
    Number:88   Freq:[******->]
    Number:89   Freq:[*******->]
    Number:90   Freq:[***********->]
    Number:91   Freq:[******************->]
    Number:92   Freq:[**********->]
    Number:93   Freq:[*****->]
    Number:94   Freq:[*************->]
    Number:95   Freq:[************->]
    Number:96   Freq:[***********->]
    Number:97   Freq:[*********->]
    Number:98   Freq:[************->]
    Number:99   Freq:[*******->]
    [Finished in 1.5s]
    

    正文之后

    差不多了。溜了溜了。内容其实很多的,但是没办法,有些我觉得现阶段没啥用的,到时候要用直接看文档好了。现在基本了解就OK了,明天开始看算法和机器学习!!不能继续被《一世之尊》牵着走了!!!

    相关文章

      网友评论

        本文标题:【寒假学Java】 持有对象?俗称泛型和容器以及迭代器吧

        本文链接:https://www.haomeiwen.com/subject/gmyjzxtx.html