文档章节

摘要

完美世界
 完美世界
发布于 2014/06/01 08:18
字数 1700
阅读 39
收藏 1

http://www.programcreek.com/2013/09/top-9-questions-for-java-map/

http://www.programcreek.com/2013/03/hashmap-vs-treemap-vs-hashtable-vs-linkedhashmap/

http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

http://www.programcreek.com/2011/11/java-access-level-public-protected-private/

http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/


#1. 把Array转化成ArrayList


把Array转化成ArrayList,程序员经常用以下方法:


List<String> list = Arrays.asList(arr);

Arrays.asList() 实际上返回一个ArrayList,但是这个ArrayList是Arrays的一个内部私有类,而不是java.util.ArrayList类。这个私有类java.util.Arrays.ArrayList有set(), get(), contains()方法,但是不能够添加新的元素。它的大小是固定的。如果你想要一个java.util.ArrayList,正确的方法是:


ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

java.util.ArrayList的构造函数可以接受一个集合类型。java.util.Arrays.ArrayList也继承了集合类型,所以可以作用参数使用。


#2. 检查数组是否包含一个值


开发人员经常做的是:


Set<String> set = new HashSet<String>(Arrays.asList(arr));

return set.contains(targetValue);

这个代码是工作的,但没有没有效率。把列表转换成set没有必要,需要额外的时间。正确的方法是:


Arrays.asList(arr).contains(targetValue);

或者,一个简单的loop:


for(String s: arr){

if(s.equals(targetValue))

return true;

}

return false;

第一种比第二种更具有可读性。


#3. 在循环中删除一个列表元素


考虑下面的代码,迭代过程中删除元素:


ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

for (int i = 0; i < list.size(); i++) {

list.remove(i);

}

System.out.println(list);

这段代码的输出是:


[b, d]

这个方法有一个严重的问题。当元素被移除,该列表的大小缩减,元素索引也随之发生了变化。所以,如果你想通过使用索引来删除一个循环内的多个元素,就会导致错误的结果。


你可能猜到可以使用iterator来删除循环中的元素。在Java中的foreach循环的工作原理就像一个iterator。 但是在这里也会发生错误。请看下面的代码:


ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

 

for (String s : list) {

if (s.equals("a"))

list.remove(s);

}

上面的foreach loop代码会抛出一个异常ConcurrentModificationException. 但是下面这段代码不会。


ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));

Iterator<String> iter = list.iterator();

while (iter.hasNext()) {

String s = iter.next();

 

if (s.equals("a")) {

iter.remove();

}

}

通过分析ArrayList.iterator()的原代码,我们可以发现next()方法必须要在remove()方法前被调用。在foreach loop中,编译器产生的代码会先调用next()方法,从而产生异常ConcurrentModificationException。请查看ArrayList.iterator()的原代码。


#4. Hashtable 与 HashMap


按照算法惯例,Hashtable是数据结构的名称。但在Java中,数据结构的名称是HashMap。Hashtable是同步的版本。所以很多时候你并不需要Hashtable,而是HashMap。 这两篇文章详细介绍了各种Map的区别和常见的问题: HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap, Map常见10大问题,


#5.使用原始类型Collection


在Java中,原始类型和无界通配符类型很容易混在一起。以Set为例,Set是原始类型,而Set<?>是无界通配符类型。


考虑下面的代码,它使用原始类型的List作为参数:


public static void add(List list, Object o){

list.add(o);

}

public static void main(String[] args){

List<String> list = new ArrayList<String>();

add(list, 10);

String s = list.get(0);

}

此代码将抛出一个异常:


Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

at ...

使用原始类型的Collection是危险的,因为原始类型的Collection跳过类型检查。另外值得一提的是Set, Set<?>, Set<Object>之间存在着巨大的差异。 了解更多,请查看原始类型 vs. 无界通配符类型 和 类型擦除。


#6. 访问级别


很多时候,开发者使用public修饰字段。这样做的好处是很容易通过直接引用来获取字段的值,但是这是一个非常糟糕的设计。经验法则是“给成员的访问级别尽可能低”。可以查看Java4种不同的访问级别public, default, protected, and private。


#7. ArrayList 与 LinkedList


当开发人员不知道ArrayList和LinkedList的区别的时候,他们经常使用的是ArrayList,可能因为它看起来面熟。但是ArrayList和LinkedList之间有巨大的性能差异。 简单来说如果有大量的添加/删除操作,而没有很多随机存取操作,LinkedList的应该是首选。可以查看ArrayList与LinkedList了解它们之间更多的区别。


#8.可变性与不变性


不可变对象有很多优点,如简单性,安全性等。但是它需要为每个不同的值创造一个单独的对象,对象太多可能会导致垃圾回收的成本高。所以可变和不可变之间进行选择时应该有一个平衡。


一般情况下,使用可变对象,以避免产生过多的中间对象。一个经典的例子是串联了大量的字符串。如果使用的是不可变的字符串String,会产生很多可以垃圾回收的对象。这样既浪费时间也浪费CPU的运算能力,使用可变对象是正确的解决方案(如StringBuilder)。


String result="";

for(String s: arr){

result = result + s;

}

另外一些情况,可变对象刚更加合适可取。例如排序(Collections.sort())。如果Collection是不可变的,排序方法每次将会返回一个新的Collection,这样会极其浪费资源。 可以看看为什么在Java中String被设计成不可变?


#9. 父类和子类的构造函数




以上这段代码出现编译错误,因为默认的父类构造函数未定义。在Java中,如果一个类没有定义构造函数,编译器会默认插入一个默认的无参数构造函数。如果程序员定义构造函数,编译器将不插入默认的无参数构造函数。上面的代码由于自定义了有参数的构造函数,编译器不再插入无参数的构造函数。子类的构造函数,无论是有参数或无参数,都将调用父类无参构造函数。当子类需要父类的无参数构造函数的时候,就发生了错误。


解决这个问题,可以1)增加一个父类构造函数


public Super(){

    System.out.println("Super");

}

,或2)删除自定义的父类构造函数,或3)添加super(value)到子类构造函数。更多请查看父类和子类的构造函数。


#10. "" 与 Constructor?


字符串可以通过两种方式创建:


//1. use double quotes

String x = "abc";

//2. use constructor

String y = new String("abc");

这两者有什么区别呢? 下面的例子可以提供一个快速的答案:

String a = "abcd";

String b = "abcd";

System.out.println(a == b);  // True

System.out.println(a.equals(b)); // True

String c = new String("abcd");

String d = new String("abcd");

System.out.println(c == d);  // False

System.out.println(c.equals(d)); // True


本文转载自:http://tomcat-oracle.iteye.com/blog/2074080

共有 人打赏支持
完美世界
粉丝 10
博文 151
码字总数 134011
作品 0
西城
高级程序员
【Java小工匠聊密码学】--消息摘要--概述

1、消息摘要概述   数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。...

追梦着
06/10
0
0
IJCAI 2018 | 北京大学提出新型分层式端到端模型,整合文本摘要和情感分类

  选自arXiv   作者:Shuming Ma、Xu Sun、Junyang Lin、Xuancheng Ren   机器之心编译   参与:Panda      目前在自然语言处理任务中,文本摘要和情感分类通常是分开解决的。北...

机器之心
05/17
0
0
BosonNLP新闻自动摘要算法简介

自动摘要(或摘要技术Automatic Summarization),顾名思义,是指从单篇或者多篇文章中,摘取要点来概括文章大意的技术。它在机器学习和数据挖掘中有着重要的地位。 在这篇文章中,将要详细谈...

BosonNLP
2016/01/07
832
0
IJCAI 2018 | 腾讯知文等提出新型生成式摘要模型:结合主题信息和强化训练生成更优摘要

  选自arXiv   作者:Li Wang、Junlin Yao、Yunzhe Tao、Li Zhong、Wei Liu、Qiang Du   机器之心编译   参与:Panda      让机器能根据文章的主题思想生成人类能够读懂的文本摘...

机器之心
05/18
0
0
VC++网络安全编程范例(8)-摘要签名和验证编程实现

是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数, 数字摘要 也就是Hash函数。 数字摘要就是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密...

junwong
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

180.mariadb 主从复制

参考:https://blog.csdn.net/chengxuzaza/article/details/62042920 睡觉睡觉,明天写 1.效果 当主库中数据有变化的时候,从库就自动同步 2. 环境要求 至少两台 linux服务器 (教程:https...

Lucky_Me
1分钟前
0
0
erlng file id3v1 id3v1.1

%% ---%% Excerpted from "Programming Erlang",%% published by The Pragmatic Bookshelf.%% Copyrights apply to this code. It may not be used to create training material, %% ......

xueyuse0012
2分钟前
0
0
RabbitMq的安装

环境Centos6.5 32位 JDK 1.7.8 Jdk的卸载 rpm -qa|grep jdk yum –y remove 上边的安装包 JDK的安装 Rpm –ivh jdk安装包 配置环境变量 export JAVA_BIN=/usr/java/jdk1.7.0_80/bin export J......

DemonsI
6分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
13分钟前
0
0
vue内引入语音播报功能

在vue项目中引入语音播报,使用的科大讯飞语音接入, 具体思路为每次接收到语音信息后存入一个数组,然后监听这个数组,开始冲第一个索引播放,并且同时根据vuex getter 来动态删减数量 给a...

originDu
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部