Java编程思想(九) —— 持有对象(2)

11)Map

作者说将对象映射到其他对象的能力是解决编程问题的杀手锏。

确实,例如查看随机数的分布,如果真是随机数的话,那么10000次产生20以内的随机数,每个数字出现的次数应该是相近的。

public class TestMap {
    public static void main(String[] args) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        Random r = new Random(47);

        //map里面为空
        System.out.println(map.get(1));
        for (int i = 0; i < 10000; i++) {
            int j = r.nextInt(10);
            Integer temp = map.get(j);
            map.put( j ,temp == null ? 1 : temp+1);
        }
        System.out.println(map);
    }
}

//result:null
//{0=994, 1=1033, 2=1010, 3=1014, 4=958, 5=1000, 6=1052, 7=980, 8=946, 9=1013}

数字确实是随机分布的,Map也很好用。

Map也用到多维。

Map<Person,List<TV>>;

12)Queue

先进先出,买基金的时候,由于后期追加购买,但是前期的基金已经满1个月,这样不用赎回费,然后问了客服之后发现,先买进的先赎回,然后自己大拍大腿,这不就是所谓的队列设计吗?

LinkedList实现了Queue接口。

对了,经常用到Random,竟然忘了说为什么作者传参用了47,其实Random传参是传入一个计算的种子,默认是系统时间,47在他看来一直是“魔幻数字”。

public class TestQueue {
    public static void main(String[] args) {
        Queue<Integer> q  = new LinkedList<Integer>();
        Random r = new Random(47);
        for (int i = 0; i < 10; i++) {
        //将一个元素插入队尾
            q.offer(r.nextInt(12));
        }
        //返回队头
        System.out.println(q.peek());
        System.out.println(q);
    }
}

一、PriorityQueue

直接看例子:

public class TestPriorityQueue {
    public static void main(String[] args) {
        String s = "What 's your favorite number ,1 or 2?";
          List<String> l = Arrays.asList(s.split(""));
          PriorityQueue<String> pq = new PriorityQueue<String>(l);

          while(pq.peek()!=null){
              System.out.print(pq.remove()+" ");
          }
    }
}

result:
[,  ,  ,  ,  , b,  , 1,  , i, e, n, h, ',  , a, o, 2, ?, y, t, t, o, u, u, m, r, e,
 r, f, ,, s, a, v, r, o, W, r]             
              
          ' , 1 2 ? W a a b e e f h i m n o o o r r r r s t t u u v y

先级最高最先弹出,在优先队列里面 最小的值拥有最高的优先级,如果为String,从上面看,空格优先级最高。

直接输出并不会排序,这和我之前预想的不一样。

要顺序输出,需要用peek方法,返回队头,空返回null,然后remove的时候优先级高的会现出来。

 public static void main(String[] args) {
        String s = "werwerwer";
        List<String> l = Arrays.asList(s.split(""));
        PriorityQueue<String> pq = new PriorityQueue<String>(l);
        while (pq.peek() != null) {
            System.out.print(pq.remove() + " ");
        }
        pq = new PriorityQueue<String>(l);
        System.out.println(pq.peek());
        pq.remove();
        System.out.println(pq.peek());
        pq.remove();
        System.out.println(pq.peek());
    }

result:
 e e e r r r w w w
e
e

结果让我奇怪的是String里面有空格。这个看了字符串再回来解决。

13)Foreach与迭代器

foreach遍历:

public class Box {
    public static void main(String[] args) {
        Collection<String> c = new LinkedList<String>();
        String s = "you are so great";
        Collections.addAll(c,s.split(" "));
        for(String string : c){
            System.out.println(string);
        }
    }
}

原来foreach是Java SE5引入的特性,因为同时也引入了Iterable接口,接口产生Iterator的Iterator方法,Iterable被Foreach用来在序列中移动。所以实现Iterable的接口的类都可以用于Foreach语句。

All Known Subinterfaces:
BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>,
Collection<E>, Deque<E>, DirectoryStream<T>, List<E>, NavigableSet<E>,
 Queue<E>, Set<E>, SortedSet<E>

其实Iterable的子接口有这么多,接下来实现Collection接口的自然也就实现了Iterable接口,所以也适用。

总结:

先看容器分类图:

点线为接口,实线为具体类,空心箭头指实现接口,实心箭头指某个类可以生成箭头所指向的类的对象。

1、数组可以存放对象,存放基本类型的数据,可以多维,就是容量不能改变。

2、Collection保存单一的元素,Map保存键值对。

3、List和数组类似,但是List可以自动扩充容量。大量随机访问使用ArrayList,经常进行插入删除操作,用LinkedList。

public class Box {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
       Random r = new Random(47);
       LinkedList<Integer> l = new LinkedList<Integer>();
       for(int i = 0; i< 1000000; i++){
           l.add(r.nextInt(1000));
       }
       long end = System.currentTimeMillis();
       System.out.println(end - start);

      ArrayList<Integer> a = new ArrayList<Integer>();
      for(int i = 0; i< 1000000; i++){
          a.add(r.nextInt(1000));
      }
      long end2 = System.currentTimeMillis();
      System.out.println(end2 -end);
    }
}

4、Map,HashMap用来快速访问,TreeMap保持键的排序,速度没HashMap快,LinkedHashMap保持元素排序,也通过散列也能快速访问,于两者中间。

5、Set元素不重复,TreeSet,HashSet,LinkedHashSet与Map的类似。

最后你会发现,这些容器可以存放对象,还可以无限大小,还可以帮你计数,这么神奇的类是怎么设计出来的,这就是学好数据结构的重要性了。

时间: 2024-11-07 08:39:42

Java编程思想(九) —— 持有对象(2)的相关文章

Java编程思想(八) —— 持有对象(1)

书中的原标题是--holding your object,把握你的对象,译者翻译成持有对象.这是用的最多的类之一. 作者说的,如果一个程序包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序.确实,如果数组大小已知,那么就很简单了. 除了数组,Java提供了容器类来holding object. 1)泛型和类型安全的容器 ArrayList,可以自动扩充大小的数组,add插入对象,get访问对象,size查看对象数目. class Apple{} public class Box

Java编程思想(九) —— 通过异常处理错误(1)

前阵子看到一个编程的学习方法--橡皮鸭调试法,就是拿一只小黄鸭. 面对面,跟他讲解你的编程思路,如果你没有橡皮鸭或者是一个能听你讲java,c,cpp,前端,io,系统内核,汇编,数据结构,计算机网络的女朋友,那么写博客也是你自己梳理好思路的一个好方法. 书中原话:java的基本理念是结构不佳的代码不能运行. 其实我之前也搞不懂为什么要弄个这样的东西出来,其实跟书上讲的一样,"异常"有"对此感到意外"的意思,问题出现了,我们不知道怎么处理,但又不能置之不理,可以停下

Java编程思想笔记(对象)

今天是七夕,猿选择拜读圣经.    抽象过程:(1)万物皆为对象.(2)程序是对象的集合(它们通过发送消息来告知彼此所要做的,要想请求一个对象,就必须对该对象发送一条消息.)(3)每个对象都有自己的由其他对象所构成的存储.(包)(4)每个对象都拥有其类型(可以发送什么样的消息给它)(5)某一特定类型的所有对象都可以接收同样的消息. 每个对象都有一个接口(class):每个对象都只能满足某些请求,这些请求由对象的接口所定义,决定接口的便是类型.接口确定了对某一特定对象所能发出的请求. 每一个对象都

学习java编程思想 第一章 对象导论

一.面向对象的五个基本特性: 1.万物皆为对象.将对象视为奇特的变量,他可以存储数据,还可以要求它在自身上执行操作. 2.程序是对象的合集,他们通过发送消息告诉彼此所要做的. 3.每个对象都有自己的由其他对象所构成的存储.换句话说,可以通过创建包含现有对象的包的形式来创建新类型的对象. 4.每个对象否拥有其类型.每个类最重要的特性就是"可以发送什么样的消息给它". 5.某一特定类型的所有对象都可以接受同样的消息. 二.在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为&qu

Java 编程思想 Chapter_14 类型信息

本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最重要的 本章的内容其实都是为类型信息服务的,主要内容有 一.Class对象 问题: 1.Class对象的创建过程是怎么样的 2.Class对象有哪几种创建方式,之间有什么差异 3.使用泛型 在了解类型信息之前,需要了解class对象 创建class对象,需要先查找这个这个类的.class文件, 查找

Java编程思想总结(一)对象导论

Java编程思想总结(一)对象导论 1.1 抽象过程 万物皆对象. 程序是对象的集合(即:类),他们通过发送消息(调用方法)来告知彼此要做的. 每个对象都有自己的由其他对象所构成的存储(引用其他对象或基本类型,即组合). 每个对象都拥有其类型.每个类最重要的区别于其他类的特征就是“可以发送什么样的消息给它”(即调用方法). 某一特定类型的所有对象都可以接受同样的消息. 对象具有状态(成员属性).行为(成员方法)和标识(引用的名称).每个对象在内存中都有唯一的一个地址. 1.2 每个对象都有一个接

Java编程思想 4th 第2章 一切都是对象

Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情在类对象中完成. 在Java中,使用引用来操纵对象,在Java编程思想的第四版中,使用的术语是"引用(reference)",之前有读过Java编程思想第三版,在第三版中,使用的术语是"句柄(handle)",事实上,我觉得第三版的术语"句柄"更加形象传神,就像你用一个

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

JAVA编程思想学习笔记——第一章 对象导论

搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的集合,它们通过发送消息来告诉彼此所要做的 3.每个对象都由自己的由其它对象所构成的存储 4.每个对象都拥有其类型 5.某一特定类型的所有对象都可以接收同样的信息  单根继承结构 所有的类都继承自单一的基类,Object.在单根集成结构中的所有对象都具有一个公用接口,所以他们归根到底都是相同的基本类型.单根集成