Java中容器的两种初始化方式比较
List,Set,Map的两种初始化赋值方式
List<Integer> list2 = new ArrayList<Integer>();
for (int i=0;i<times;i++){
list2.add(i);
} List<Integer> list1 = new ArrayList<Integer>(){
{
for (int i=0;i<times;i++){
add(i);
}
}
};
Map<String,String> map = new HashMap<String,String>(){
{
put("14","我是14");
put("13","我是13");
put("12","我是12");
}
};
Set
Set<String> set = new HashSet<String>(){
{
add("a");
add("b");
add("c");
}
};
两种方式中显然直接在申明时赋值的写法比较优雅,在List后面的两个{{}}的意义是,第一层括号表示一个匿名内部类,第二层括号表示在生成的内部类构造时被初始化,将class文件反编译后可以看出,java将匿名内部类创建了两个类,子类中含有父类的引用
public class MyTest2 {
Map<String,String> map = new HashMap<String,String>(){
{
put("1","我是1");
put("2","我是2");
}
};
public static int index = 10;
public static void main(String[] args) {
List<String> list = new ArrayList<String>(10){
{
for (int i=0;i<index;i++){
add("a");
}
}
};
}
}
public class MyTest2
{
Map<String, String> map = new HashMap() {};
public static int index = 10; public static void main(String[] args)
{
List<String> list = new ArrayList(10) {};
}
}
final class MyTest2$2
extends ArrayList<String>
{
MyTest2$2(int x0)
{
super(x0);
for (int i = 0; i < MyTest2.index; i++) {
add("a");
}
}
}
class MyTest2$1
extends HashMap<String, String>
{
MyTest2$1(MyTest2 this$0)
{
put("1", "我是1");
put("2", "我是2");
}
}
- 此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当时串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。(序列化)
- 上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象(串行化)
List<String> list = new ArrayList<String>(){
{
for (int i=0;i<index;i++){
add("item"+i);
}
}
};
Gson gson = new Gson();
String str1 = gson.toJson(new ArrayList<String>(list));
@Test
public void testEffict1(){
long start = System.currentTimeMillis();
int times = 1000000000;
List<Integer> list1 = new ArrayList<Integer>(){
{
for (int i=0;i<times;i++){
add(i);
}
}
};
long t1 = System.currentTimeMillis();
System.out.println("第一种方式time:"+(t1-start));
}
@Test
public void testEffict2(){
int times = 1000000000;
long t1 = System.currentTimeMillis();
List<Integer> list2 = new ArrayList<Integer>(100000000);
for (int i=0;i<times;i++){
list2.add(i);
}
long end = System.currentTimeMillis();
System.out.println("第二种方式time:"+(end-t1));
}
第一种方式time:33566
第二种方式time:33331
可见两者在效率方面的差别不大
Java中容器的两种初始化方式比较的更多相关文章
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- java中多线程的两种创建方式
一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继 ...
- Java连载66-数组的两种初始化方式
一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...
- JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解
在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...
- Springboot中IDE支持两种打包方式,即jar包和war包
Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war 在项目的根目录执行maven 命令clean pa ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- JAVA中单例模式的几种实现方式
1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
随机推荐
- java中打印输出数组
import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) { int size ...
- python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2
python编写一个三级while的循环菜单 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表. 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} shiqu_dir = {} ...
- 理解oauth2.0【转载】
原文出处: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得 ...
- CSS自适应的占位符效果
一种不错的自适应input效果,分享一下.html section : <div style="width:500px;height:500px;margin:300px auto;b ...
- 进程间通信之AIDL
一.引言 AIDL是android内部进程通信接口的描述语言,是实现跨进程方法调用的一大利器,其中Binder和Messenger的实现机制都是AIDL. 二.使用下面结合示例说明其使用过程: 本次示 ...
- 使用base64提升视觉效果体验
最近在做一个微信端的小项目,前端代码写完后,就放在手机端测试,没什么问题,但是页面在加载和渲染时的效果却让人有些不爽,虽然是个小项目,我大可不必做这些,但是看着页面的闪动,就忍不住想做些什么. 先说说 ...
- 将HTML导出生成word文档
前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...
- mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...
- 基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程
简介 之前事先搜索了下博客园上关于Dapper分页的实现,有是有,但要么是基于存储过程,要么支持分页,而不支持排序,或者搜索条件不是那么容易维护. 代码 首先先上代码: https://github. ...
- 收集了一些容易出错的题,可能大家也不会注意到的基础知识(js)
---恢复内容开始--- 1.题中运用到函数表达式.构造函数.原型.优先级.this. 2.参数影响 3.对原型的运用 4.递归 5.基本类型与引用类型传递 6.优先级 7.自调用函数 ---恢复内容 ...