首页 新闻 会员 周边

请问Map和Map.Entry之间到底是怎么理解,内部类应该用在什么场合

0
悬赏园豆:30 [已解决问题] 解决于 2014-11-03 19:46

   对内部类,很模糊,不知道时候该用,什么时候不用。就像Map  和 Map.Entry,应该怎样理解,怎么去使用,方便写代码?

  希望知道的朋友前辈,指点一下。如果能讲得深入透彻一点就更好了。*-*谢谢谢谢

  

问题补充:
public static void main(String[] args)
      throws IOException {
    //举个读取一本小说的例子
        String file="src\\book.txt";
        Map<Character,Integer> map=
                        countAll(file,"GBK");
        int all=0;
        Collection<Integer> values=map.values();
        
        for(int n:values){
            all+=n;
        }
        List<Entry<Character,Integer>> list=//像这里使用Map.Entry内部类,类似的应该怎么理解,运用???
            new ArrayList<Entry<Character,Integer>>(
                    map.entrySet());    
        Collections.sort(list,new 
                Comparator<Entry<Character,Integer>>(){
            private int dir=-1;
            public int compare(Entry<Character,Integer> o1,
                    Entry<Character,Integer> o2) {
                return dir*(o1.getValue()-o2.getValue());
            }
        });
        for(int i=0;i<10;i++){
            Entry<Character,Integer> entry=list.get(i);
            char ch=entry.getKey();
            int n=entry.getValue();
            System.out.println(
                    ch+":"+n+"个  "+((double)n/all)*100);    
        }
        System.out.println("不重复字数):"+map.size());
        System.out.println("文字总数:"+all);
    }
    public static Map<Character,Integer> countAll(
            String file,String encoding)
             throws IOException {
        InputStreamReader in=
           new InputStreamReader(
             new BufferedInputStream(
              new FileInputStream(file)),encoding);
        Set<Character> set=
                new HashSet<Character>();
        set.add(',');
        set.add(' ');
        set.add(',');
        set.add('。');
        set.add(':');
        set.add(':');
        //set.add(':');
        set.add('\n');
        set.add('\r');
        
        Map<Character,Integer> map=
                new HashMap<Character,Integer>();
        int c;
        int i=0;
        while((c=in.read())!=-1){
            char ch=(char)c;
            if(set.contains(ch)){//忽略掉回车换行,标点符号那些
                System.out.println(i++);
                continue;
            }
            Integer n=map.get(ch);
            map.put(ch, n==null? 1:n+1);
        }
        
        in.close();
        return map;
    }
}
小小工程师的主页 小小工程师 | 初学一级 | 园豆:5
提问于:2014-10-27 23:42
< >
分享
最佳答案
0

能举例一个具体的例子吗?

从字面理解:

Map一般是一个基础类,定义了基本的要素,而Map.Entry则针对这个Map定义了简单、易用的实现与实例构建类。

 

具体要视不同情况而定,原则上没有确定的解释。

收获园豆:30
519740105 | 大侠五级 |园豆:5810 | 2014-10-28 09:52

举不出来啊,就是根本不懂Map跟Map.Entry的区别,不懂怎么用..很模糊,完全不知道怎么区别运用

小小工程师 | 园豆:5 (初学一级) | 2014-10-29 00:23

大概举了一个,接触到的,你看看。期待(*-*)...

小小工程师 | 园豆:5 (初学一级) | 2014-10-29 00:43

@小小工程师: 我明白你的意思了。

我是站在.net的角度看问题的,而你的问题是java的,刚好我对java几乎不接触。

在.net里,你说的map就是dictionary,字典;你说的map.entry就是keyvaluepair,键值对。

(以上意思能理解不?)

既然是字典,那么就有字(键)和解释(值),所以,map的定义里需要两个泛类型参数,第一个是键的类型,第二个是值的类型。

字典同时也是简单的列表集合(实现了IList接口),而列表集合是非字典结构的简单元素集合,它们之间为了兼容,就需要融合键值对了,因此有了Map.Entry。Map.Entry也是带有两个泛类型参数的泛类,第一个是键类型,第二个是值类型,对应于Map的类型参数。

通俗说,Map是字典,有字(键)和解释(值),Map.Entry就是针对Map里的字(键)和解释(值)的整体封装。

519740105 | 园豆:5810 (大侠五级) | 2014-10-29 09:00

@519740105: 说得好有逻辑,好羡慕。我先好好想想,看看能不能理解

小小工程师 | 园豆:5 (初学一级) | 2014-10-30 00:11

@519740105: 这几天努力想了想,有个很模糊不确切的理解:Map是个key:value对的集合,是散列表类。里面包含key value两个部分,如果要访问它的内部,这时候就需要一个更直接的部分,来方便访问,就有了-->Map.Entry。就像一个装着两样东西的袋子,给它一根拉开的拉链?

  就是如果想访问Map的key value,就使用Map.Entry,更方便也简单!可能直接用Map也可以做到(我现在还不知道), 但用Map.Entry却更方便简单!

  ...很模糊的一个理解,不知道对不对。把豆豆再提高一点,看看还有没有高手来指点指点。要是还没有,就结贴了。谢谢你们的热心帮忙!!! @-@

小小工程师 | 园豆:5 (初学一级) | 2014-11-02 15:25

@小小工程师: 字典的内部是一个很复杂的处理过程,这个你可以先不考虑,可以忽略。如果你一定要较真,可以反编译出来看看(好像java也是能反编译的)。

在使用上,你只要记住我前面说的就好:map能通过key能找到对应的value;map.entry是map内的key-value对。

519740105 | 园豆:5810 (大侠五级) | 2014-11-02 21:51

@519740105:大侠前辈,误会了。没有较真,我发的那个例子代码,是视频里老师写的,第一次见,老师也根本没说什么用,直接用了,所以根本不知道怎么用,没办法就上来问了。就是想知道怎么用,什么情况可以用。谢谢前辈的热心帮忙,那个有没有哪个平台适合初学者提问题的?我现在提的问题,是学习角度出来的,暂时跟工作业务没什么关系,有没有那种适合初学都提问题,讨论的平台啊?

 (不管三七二十一,先结帖,谢谢好心大侠^-^!)

小小工程师 | 园豆:5 (初学一级) | 2014-11-03 19:45
其他回答(1)
0

我给你说个比较容易理解的概念。

内部类就是放在类内部的另一个类。

如:

/**
 * @Name Outer
 * @Description 外部类
 * @Attention NULL
 * @Tags 
 * @Author CaiYj
 * <br>2014-10-28上午10:43:22
 */
public class Outer {
    /**
     * @Name inner
     * @Description 内部类
     * @Attention NULL
     * @Tags 
     * @Author CaiYj
     * <br>2014-10-28上午10:43:33
     */
    public class inner{
        
    }
}
View Code

要实例化内部类就要先实例化外部类,这在线程安全上有一定的作用。一般在单例模式中用内部类来定义单例,使线程安全。

他甚至比双重校验锁还容易实现单例。

单例例子(这是我学习单例的时候写的例子,注释是我自己的理解):

/**<p>最优单例模式初始化操作<p>
 * <p>单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕。<p>
 * <p>Title: SingletonInternal<p>
 * <p>Descriptions:<p>
 * @author Caiyongji 
 * @date Feb 7, 2014
 */
public class SingletonInternal {
    private static class SingletonInter{
        private final static SingletonInternal INTERNAL=new SingletonInternal();
    }
    private SingletonInternal(){}
    public static SingletonInternal getInstance() {
        return SingletonInter.INTERNAL;
    }
    private void doIt(){
        System.out.println("SingletonInternal.doIt()");
    }
    
    
    //main 方法
    public static void main(String[] args) {
        SingletonInternal.getInstance().doIt();
    }
}
View Code

以上,希望对你有所帮助。

CaiYongji | 园豆:1267 (小虾三级) | 2014-10-28 10:47

有一点点理解,不过可不可以加点注释。我试验了一遍,但还是没太搞懂,主要表达的意思...

支持(0) 反对(0) 小小工程师 | 园豆:5 (初学一级) | 2014-10-29 00:39

@小小工程师: static是在程序启动时加载,启动后一直伴随着程序。查下相关static会对你有帮助。

支持(0) 反对(0) CaiYongji | 园豆:1267 (小虾三级) | 2014-10-29 09:39

@takeurhand: 好的,我试试

支持(0) 反对(0) 小小工程师 | 园豆:5 (初学一级) | 2014-10-30 00:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册