Java开发者易犯错误Top10 java: 错误: 不支持发行版本 5
lipiwang 2024-10-23 14:02 6 浏览 0 评论
本文总结了Java开发者经常会犯的前十种错误列表。
Top1. 数组转换为数组列表
将数组转换为数组列表,开发者经常会这样做:
List<String> list = Arrays.asList(arr);
Arrays.asList将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set、 get、 contains方法,但是没有任何加元素的方法,因此它的大小是固定的。你应该这么做来创建一个真正的数组:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
ArrayList的构造函数能够接受一个集合类型,这也是java.util.Arrays.ArrayList的超级类型。
Top2. 检查一个数组包含一个值
开发者经常这么做:
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
代码可以工作,但是没有必要首先转换列表到Set,转换一个列表到一个Set需要额外的时间。因此你可以把它简化为:
Arrays.asList(arr).contains(targetValue);
或
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
第一个比第二个更具可读性
Top3. 在一个循环中从一个列表里删除一个元素
考虑下面删除元素的代码在迭代中的结果:
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]
该方法有一个严重的问题,当一个元素被删除时,列表收缩的大小以及指针改变了。所以想要在循环内利用指针删除多个元素是无法正常进行的。
这种情况下使用迭代器才是正确的方法,foreach循环在Java中的工作像是一个迭代器,但实际上并不是,考虑下面的代码:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a"))
list.remove(s);
}
相反下面这个就可以正常工作。
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;
}
}
.next必须在.remove之前被调用。在foreach循环中,编译器将在删除元素操作之后调用.next,这也是导致ConcurrentModificationException异常的原因,你可以查看ArrayList.iterator的源代码。
Top4. Hashtable vs HashMap
根据算法的常规,Hashtable是对数据结构的称呼。但是在Java中,数据结构的名称是HashMap。Hashtable和HashMap关键不同之一是Hashtable是同步的。
关于这一点可查看以下两个链接:
Top5. 使用集合的原始类型
在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 ...
使用原始类型集合是危险的,因为原始类型集合跳过了泛型类型检查,也不安全。Set、Set<?>和Set<Object>之间有很大的不同。详细可查看
Top6. 访问级别
开发者经常对类域使用public,这很容易通过直接引用获得域值,但这是一个非常糟糕的设计。根据经验来说是给予成员的访问级别越低越好。
详细情况可点击查看Java中成员访问级别:public、protected、private
Top7.ArrayList VS LinkedList
相关推荐
- 超越JSON.parse:JavaScript中高效反序列化的艺术
-
当我们需要在网络间传输数据或将数据存储到本地存储时,我们通常会将JavaScript对象转换为字符串,然后在需要时再将其转换回对象,这就是数据序列化与反序列化。虽然JSON.parse()和JSON....
- 如何给别人网页上增加内容通过Chrome扩展为网页添加快速滚动功能
-
ContentScripts来看开发网站的介绍,ContentScripts是一类在网页上下文中运行的文件。它们可以使用标准的DOM接口,实现读取浏览器访问的网页的详细信息,比如网页的DOM结构...
- JavaScript执行栈和执行上下文(js 执行上下文与执行栈)
-
在JavaScript中,执行栈和执行上下文是理解代码执行流程和作用域链的关键概念。它们决定了代码如何执行以及变量和函数如何被查找和访问。本文将详细介绍执行上下文的生命周期、执行栈的工作原理以及它们在...
- 防止浏览器缓存特定JS文件的常用方法
-
防止浏览器缓存特定JavaScript文件的常用方法:1.添加版本号或时间戳在引用JavaScript文件时,在URL中添加一个版本号或时间戳作为查询参数。这样每次更新文件后修改这个参数值,就能让浏...
- 前端面试:JavaScript 字符串的常用方法?
-
JavaScript字符串是一种不可变的数据类型,因此在使用字符串时需要注意以下几个方法:charAt(i):返回指定索引位置的字符。concat(str[,start[,end]]):连接...
- Sequelize 在 Node.js 中的详细用法与使用笔记
-
1.Sequelize简介Sequelize是一个基于Promise的Node.jsORM(Object-RelationalMapping)工具,支持PostgreSQL、My...
- 前端js加密解密常用的六种方法(js加密解密源代码)
-
一、MD5加密可以使用md5插件进行加密插件地址:github.com/blueimp/JavaScript-MD5计算给定字符串值的(十六进制编码)MD5哈希值:计算给定字符串值和键的(十六进制编...
- javascript深拷贝浅拷贝原理分析(js深拷贝和浅拷贝如何实现)
-
用js处理数据的时候经常遇到这样一个问题,需要保留原始数据不变情况下,进行一系列数据操作,这时候需要制作一份原始数据的副本数据来进行操作注意的是引用数据类型和基本数据类型在内存中存储方式是不一样的,只...
- 1、从零开始了解和使用WPS的js宏(JSA)
-
最近使用了一下wps的宏本地客户端功能进行了数据查询,与vba相比感觉还是比较好用的。(所谓本地客户端就是指单机使用运行的wps程序)VBA因为长时间的发展,胜在功能比较强大,支持一些Active...
- JavaScript字符串查找方法总结(js查找子串)
-
在JavaScript中,查找字符串的常用方法有以下几种,根据不同的需求选择合适的方式:1.indexOf()/lastIndexOf()作用:查找子字符串首次出现的位置(indexOf)或...
- JavaScript 合并数组的三种方法(js数组合并的几种方法)
-
数组作为一种数据结构,表示索引项的有序集合。经常会使用到数组,尤其是将多个数组进行合并,比如将数组[1,2,3]和数组[4,5,6]合并,最终得到数组[1,2,3,4,5,6]。数组的合并分不...
- JS短文,如何正确理解Splice() 函数与Slice() 函数
-
转载说明:原创不易,未经授权,谢绝任何形式的转载Splice()函数与Slice()函数都是JavaScript数组中常用的方法之一。虽然它们的名称很相似,但它们的作用却截然不同。在这篇文章...
- JavaScript字符串concat()方法教程
-
一、简介JavaScript中的字符串是一种基本数据类型,它可以用单引号或双引号括起来。concat()方法用于将一个或多个字符串连接起来,并返回连接后的新字符串。concat()方法不会改变原始字符...
- 手把手教你常用的59个JS类方法(js几种类型)
-
前言前端开发有时会处理一部分后台返回的数据,或者根据数据判断做一些处理;这个时候就非常有必要将一些常用的工具类封装起来;本文根据常用的一些工具类封装了59个方法,当然还有很多用的较少前期没有录...
- js数组常用方法总结(js数组的使用)
-
首先说明,本文没技术含量,都是js的知识,只是为以后查阅方便。另外我们开了一个免费的讲解web前端课程,有兴趣的朋友可以去看,详情地址:http://fe.qietu.com/forum.php1、创...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)