美文网首页计算机杂谈大数据程序员
【寒假学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