对内部类,很模糊,不知道时候该用,什么时候不用。就像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; } }
能举例一个具体的例子吗?
从字面理解:
Map一般是一个基础类,定义了基本的要素,而Map.Entry则针对这个Map定义了简单、易用的实现与实例构建类。
具体要视不同情况而定,原则上没有确定的解释。
举不出来啊,就是根本不懂Map跟Map.Entry的区别,不懂怎么用..很模糊,完全不知道怎么区别运用
大概举了一个,接触到的,你看看。期待(*-*)...
@小小工程师: 我明白你的意思了。
我是站在.net的角度看问题的,而你的问题是java的,刚好我对java几乎不接触。
在.net里,你说的map就是dictionary,字典;你说的map.entry就是keyvaluepair,键值对。
(以上意思能理解不?)
既然是字典,那么就有字(键)和解释(值),所以,map的定义里需要两个泛类型参数,第一个是键的类型,第二个是值的类型。
字典同时也是简单的列表集合(实现了IList接口),而列表集合是非字典结构的简单元素集合,它们之间为了兼容,就需要融合键值对了,因此有了Map.Entry。Map.Entry也是带有两个泛类型参数的泛类,第一个是键类型,第二个是值类型,对应于Map的类型参数。
通俗说,Map是字典,有字(键)和解释(值),Map.Entry就是针对Map里的字(键)和解释(值)的整体封装。
@519740105: 说得好有逻辑,好羡慕。我先好好想想,看看能不能理解
@519740105: 这几天努力想了想,有个很模糊不确切的理解:Map是个key:value对的集合,是散列表类。里面包含key value两个部分,如果要访问它的内部,这时候就需要一个更直接的部分,来方便访问,就有了-->Map.Entry。就像一个装着两样东西的袋子,给它一根拉开的拉链?
就是如果想访问Map的key value,就使用Map.Entry,更方便也简单!可能直接用Map也可以做到(我现在还不知道), 但用Map.Entry却更方便简单!
...很模糊的一个理解,不知道对不对。把豆豆再提高一点,看看还有没有高手来指点指点。要是还没有,就结贴了。谢谢你们的热心帮忙!!! @-@
@小小工程师: 字典的内部是一个很复杂的处理过程,这个你可以先不考虑,可以忽略。如果你一定要较真,可以反编译出来看看(好像java也是能反编译的)。
在使用上,你只要记住我前面说的就好:map能通过key能找到对应的value;map.entry是map内的key-value对。
@519740105:大侠前辈,误会了。没有较真,我发的那个例子代码,是视频里老师写的,第一次见,老师也根本没说什么用,直接用了,所以根本不知道怎么用,没办法就上来问了。就是想知道怎么用,什么情况可以用。谢谢前辈的热心帮忙,那个有没有哪个平台适合初学者提问题的?我现在提的问题,是学习角度出来的,暂时跟工作业务没什么关系,有没有那种适合初学都提问题,讨论的平台啊?
(不管三七二十一,先结帖,谢谢好心大侠^-^!)
我给你说个比较容易理解的概念。
内部类就是放在类内部的另一个类。
如:
/** * @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{ } }
要实例化内部类就要先实例化外部类,这在线程安全上有一定的作用。一般在单例模式中用内部类来定义单例,使线程安全。
他甚至比双重校验锁还容易实现单例。
单例例子(这是我学习单例的时候写的例子,注释是我自己的理解):
/**<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(); } }
以上,希望对你有所帮助。
有一点点理解,不过可不可以加点注释。我试验了一遍,但还是没太搞懂,主要表达的意思...
@小小工程师: static是在程序启动时加载,启动后一直伴随着程序。查下相关static会对你有帮助。
@takeurhand: 好的,我试试