Java 中 HashMap/ List初始化时赋值

1、HashMap 初始化的文艺写法

HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化:
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");  
map.put("age", "20");


看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:
HashMap<String, String> map = new HashMap<String, String>() {
    {
        put("name", "test");  
        put("age", "20"); 
    }
};


看起来优雅了不少,一步到位,一气呵成的赶脚。然后问题来了,这里的双括号”{{}}”到底什么意思,什么用法呢?
双括号”{{}}”,用来初始化,使代码简洁易读。
第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。


2、推而广之,可初始化ArrayList、Set


List<String> names = new ArrayList<String>() {
    {
        for (int i = 0; i < 10; i++) {
            add("A" + i);
        }
    }
};
System.out.println(names.toString());


3、Java7:增加对collections的支持
在 Java 7 中你可以像 Ruby, Perl、Python 一样创建collections了, 但是这些集合是不可变的。


List<String> list = ["item"];
String item = list[0];
  
Set<String> set = {"item"};
  
Map<String, Integer> map = {"key" : 1};
int value = map["key"];


4、文艺写法的潜在问题


文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败。
1.此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当时串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
2.上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象:


new HashMap(map);
这样就可以正常初始化了。


5、执行效率问题


当一种新的工具或者写法出现时,猿们都会来一句:性能怎么样?(这和男生谈论妹纸第一句一般都是:“长得咋样?三围多少?”一个道理:))
关于这个两种写法我这边笔记本上测试文艺写法、普通写法分别创建 10,000,000 个 Map 的结果是 1217、1064,相差 13%。
public class Test {
    public static void main(String[] args) {
        long st = System.currentTimeMillis();
        /*
        for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>() {
                {
                    put("name", "test");
                    put("age", "20");
                }
            };
        }
        System.out.println(System.currentTimeMillis() - st); // 1217
        */


        for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            put("name", "test");
            put("age", "20");
        }
        System.out.println(System.currentTimeMillis() - st); // 1064
    }
}

 

转自:https://www.cnblogs.com/pejsidney/p/9235343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
登录页面。 最后,我们需要实现一个ProductService类,用于操作商品信息: ```java public class ProductService { 使用 Apache POI-TL 1.4.2 版本对 Word 文档的文本框赋值可以非常方 private UserDao userDao = new UserDao(); private Map<Integer, Product> products = new HashMap<>(); public ProductService() { // 初始化便地完成。下面是一个示例代码: ``` XWPFTemplate template = XWPFTemplate.compile("template.docx").render(); // 获取第一个文本框 XWPFTextBox textBox = template.getTextBoxes().get(0); // 在文商品信息 products.put(1, new Product(1, "iPhone", 5999)); products.put(2, new Product本框内插入文本 textBox.setText("新的文本"); template.write(new FileOutputStream("output.docx")); template.close(); ``(2, "iPad", 3999)); products.put(3, new Product(3, "MacBook", 9999)); ` 在示例代码,首先使用 XWPFTemplate 类编译 Word 模板并渲染出一个新的 Word 文档对象。然后,通过调用 getTextBoxes 方法获取文档的所有文本框对象,使用 get(0) products.put(4, new Product(4, "iPod", 999)); } public User getUser(String username) { 方法获取第一个文本框对象。最后,使用 setText 方法对文本框内的文本进行赋值。 注意, return userDao.getUser(username); } public List<Product> getProducts(String username) { List<Product> result = new ArrayList<>(); 使用 POI-TL 对 Word 文档进行操作需要在 pom.xml 文件引入以下依赖: ``` <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.4 User user = userDao.getUser(username); Map<Integer, Integer> shoppingCart = user.getShoppingCart(); for (Integer productId : shopping.2</version> </dependency> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值