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书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...
随机推荐
- php中json对象数据的输出转化
php中json对象数据的输出转化 public function get_my_now_citys(){ $datas=$this->_post('datas'); //前台js脚本传递给后端 ...
- AngularJS事件
<body ng-app="myApp"> <div ng-controller="myCtrl"> <button ng-cli ...
- I/O多路复用之epoll实战
概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程 通俗理解(摘自网上一大神) 这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前 ...
- Android高仿qq及微信底部菜单的几种实现方式
最近项目没那么忙,想着开发app的话,有很多都是重复,既然是重复的,那就没有必要每次都去写,所以就想着写一个app通用的基本框架,这里说的框架不是什么MVC,MVP,MVVM这种,而是app开发的通用 ...
- script标签跨域的缺点
1,只支持GET,不支持其他例如:put,delete,post等 2,想拿到数据需要服务器端做出相应处理,必须在window域下面有对应的执行函数.例如:window.callbackHandler ...
- ReactNative开发工具有这一篇足矣
ReactNative系列文章: 1.<逻辑性最强的React Native环境搭建与调试> 2.<ReactNative开发工具有这一篇足矣> 正文 React Native ...
- 【Python3之多进程】
一.进程和线程的简单解释 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 用生活举例: (转自阮一峰网络日志) 1.计算机的核心是CPU,它承担了所有 ...
- ionic 最简单的路由形式,头部固定,下面tab切换-------一个简单的单页切换起飞了
<ion-header-bar class="bar-dark" align-title="left"> <h1 class="ti ...
- hasOwnProperty的用法
判断一个属性倒底是在原型中,还是在实例中 hasOwnProperty() 来个栗子 function Person(){ }; Person.prototype.name = "hezhi ...
- 搭建SSM项目框架全过程及思考
1.前言 之前都是在现有框架下进行写代码或者总是看一些别人的架构,总会眼高手低.于是打算自己完整的走一遍流程,同时把所遇到的问题,思考的问题记下来,供大家参考.由于是工作年限不高,属于新手,不足之处还 ...