容器

来源:互联网 发布:闪烁特效的软件 编辑:程序博客网 时间:2024/04/29 08:48

1、返回一个数组

    在C/C++中,不能直接返回一个数组,通常是返回一个指向数组的指针。这样维护数组的生命周期变得十分困难,并且容易造成内存泄露。

    但是在JAVA中,可以直接返回一个数组。而且不用关系数组是在哪儿创建的,什么时候需要销毁。

2、注意

    如果一个字符串频繁地被改变,请使用StringBuffer代替String,这样会大大地提高效率。

    equals比较方法是基于内容的,而==比较是基于内存地址的。

    在获取容器的迭代器之后,就不能再向容器中添加数据了。

3、容器

    JAVA的容器有两种基本类型:

    Collection:每个位置只能保存一个元素,如List和Set。

    Map:每个位置保存的是键值对,如HashMap。

4、迭代器

     迭代器将容器的类型和对容器的操作(添加、删除、修改)分离,也是一种设计模式。

    List list = new ArrayList();

    Iterator iter = list.iterator();

    while(iter.hasNext()) {

        iter.next();

        iter.remove();

    }

5、无意识中造成的递归

    假设我们要打印一个类的地址,通常我们会简单地使用this关键字来获取地址,如下:

    class Test {

        public String toString() {

            return "class Test address is:" + this + "\n";

        }

    }

    此时,如果创建一个Test类的对象,并打印它,会收到无穷无尽的异常。

    这是因为"class Test address is:" 和this相加时,编译器看到String对象后面跟着一个"+"号,而"+"号后面跟着的却不是一个String对象,于是编译器尝试将this转换为String类型。而此操作调用的是该类的toString方法,于是造成无限递归下去。

6、散列算法和散列码

    当Integer被用作Map的键时,它能够很好地工作,因为它具备"键"的所有性质。

    而当使用我们自定义的类作为键时,我们需要同时重载hashCode和equals方法。否则,如果此类没有基类,则会调用所有类的基类Object的hashCode方法(使用对象的地址)生成散列码。而且,Object中的equals方法也是比较两个对象的地址。所以需要同时重载hashCode和equals两个方法。

7、设置只读容器

    Map m = new HashMap();

    Collections2.fill(m, Collections2.geography, 25);

    m = Collections.unmodifiableMap(m);

    在将容器设为“只读”之前,必须填入有意义的数据。装载数据后,就应该使用"unmodifiable"方法返回的引用去替换掉原本的引用。 

8、多线程下的容器

    Map m = Collections.synchronizedMap(new HashMap());

    ConcurrentHashMap

    这样就可以保证同步。


原创粉丝点击