`

常犯错误总结(一)

阅读更多
常犯错误总结(一)


一、Arrays.asList 与 java.util.ArrayList

1.常用代码:
// 将数组转化为集合
int [] intArray = new int[]{1,2,3,4};
List<int[]> asList = Arrays.asList(intArray);


此时 Arrays.asList 转化过程中使用到了一个ArrayList 但此ArrayList 非 java.util.ArrayList 而是 Arrays 内部的一个静态类

2.java.util.Arrays.ArrayList(Arrays的私有内部静态类)
源码分析

    // Arrays类中的asList方法
    public static <T> List<T> asList(T... a) {
	return new ArrayList<T>(a);
    }

    // 上面的ArrayList 是Arrays 的内部定义的静态类,而非java.util.ArrayList
    private static class ArrayList<E> extends AbstractList<E>
	implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
	private final E[] a;

	ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
	    a = array;
	}
    }
 
    // 此ArrayList 继承 AbstractList 
    // 而AbstractList 实现 List 
    // 所以 asList 方法可以将 ArrayList 返回给 List
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    /**
     * Sole constructor.  (For invocation by subclass constructors, typically
     * implicit.)
     */
    protected AbstractList() {
    }
}


常用方法
    // 定义的私有内部静态类支持常用的方法调用,基本等同于java.util.ArrayList
    private static class ArrayList<E> extends AbstractList<E>
	implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
	private final E[] a;

	ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
	    a = array;
	}
        // 注意此处的size是数组的个数,而不是数组中元素的格式
 	// int [] intArray = new int[]{1,2,3,4};
	// List<int[]> asList = Arrays.asList(intArray);
	// System.out.println(asList.size());
        // 输出结果是1而不是4
	public int size() {
	    return a.length;
	}

	public Object[] toArray() {
	    return a.clone();
	}

	public <T> T[] toArray(T[] a) {
	    int size = size();
	    if (a.length < size)
		return Arrays.copyOf(this.a, size,
				     (Class<? extends T[]>) a.getClass());
	    System.arraycopy(this.a, 0, a, 0, size);
	    if (a.length > size)
		a[size] = null;
	    return a;
	}

	public E get(int index) {
	    return a[index];
	}

	public E set(int index, E element) {
	    E oldValue = a[index];
	    a[index] = element;
	    return oldValue;
	}

        public int indexOf(Object o) {
            if (o==null) {
                for (int i=0; i<a.length; i++)
                    if (a[i]==null)
                        return i;
            } else {
                for (int i=0; i<a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

        public boolean contains(Object o) {
            return indexOf(o) != -1;
        }
    }



3.与 java.util.ArrayList 的转化

List<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(integerArray));



4.java.util.Arrays.ArrayList.size()方法

                // asList 的参数是 T 泛型,int 是基本数据类型,
                // 但 int [] 数组是泛型
		int [] intArray = new int[]{1,2,3,4};
		List<int[]> asList = Arrays.asList(intArray);
		System.out.println(asList.size()); // 1
		// asList 的参数是 T ... a  ,多个泛型 T 
                // 而Integer 是引用数据类型,此处被解析为传入了多个参数
		Integer [] integerArray = new Integer[]{1,2,3,4};
		List<Integer> asList2 = Arrays.asList(integerArray);
		System.out.println(asList2);// 4



二、判断集合中是否包含某个元素

1.常用代码
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);


可以改为:
// 因为 java.util.Arrays.ArrayList 有 contain 方法,无需再转为Set
Arrays.asList(arr).contains(targetValue);



for(String s: arr){
if(s.equals(targetValue)) // Objects.equals(s,targetValue)
    return true;
}
return false;



三、删除List中的元素

1.三种想法
		List<String> listString = new ArrayList<String>(Arrays.asList("a","b","c","d"));
                // 删除元素后不会出现异常,但要注意删除元素后原来元素的索引会有变化,比如删除a后,此时b的位置要变为0;此时再想删除b已经不可能了,因为index 已经变为1了。即:删除一个特定元素可以
		for(int index = 0 ; index < listString.size() ; index ++){
			if("a".equals(listString.get(index))){
				listString.remove(index);
			}
		}
		
		for(String str : listString){
			if("a".equals(str)){
				listString.remove(str);
			}
		}
		
                // 使用此方式进行删除
		Iterator<String> iterator = listString.iterator();
		while(iterator.hasNext()){
			if("a".equals(iterator.next())){
				iterator.remove();
			}
		}



博文参考:
JAVA中循环删除list中元素的方法总结

四、hashMap 与 hashtable

Hashtable

hashMap 线程不安全
hashtable 线程安全

五、使用原始类型的集合

集合与集合泛型
即  List 与 List<?> 的区别
在使用过程中,如果未指定具体的泛型实现,在对集合进行增删改操作时会因为类型的

1.代码样例
public class ListMainTest {

	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


2.异常分析
对 list.get(0) 来说,此时的结果为 Object ,而此时的Object 是通过Integer 类型进行复制的,而接受值的类型却定义为 String ,类型对应错误;

3.总结问题
使用Set<?> 方式在操作时可以起到类型校验的作用,从而避免上述的问题

六、访问权限

编程习惯,通常定义接口或service 时顺手直接public;
按照编码规范,应该限制用户的访问权限,直接默认即可

七、ArrayList vs. LinkedList

数组;链表
便于查找,而不利于增删改;后者相反;
ArrayList 实现 RandomAccess ,大量数据遍历时使用 for,随机访问;后者,实现 Deque 双向链表,遍历时 使用 Iterator

博文转载:
十个JAVA程序员容易犯的错误
分享到:
评论

相关推荐

    Java编码常犯错误

    ### Java编码常犯错误 #### 一、字符串拼装SQL **问题描述**:在Java开发过程中,直接使用字符串拼接的方式构造SQL语句是一种常见的做法。然而这种方式存在明显的安全隐患和性能问题。 - **安全漏洞**:直接拼接...

    C语言高手总结的新手容易犯的错误

    C语言高手总结的新手容易犯的错误 C语言是一门经典的编程语言,对于新手来说,易犯的一些错误是非常普遍的。这些错误不仅影响代码的正确性,也会浪费大量的时间和精力。因此,了解和避免这些错误是非常重要的。 1....

    CSS 初学者常犯错误汇总

    ### CSS初学者常犯错误汇总 #### 一、概述 对于初学者而言,在学习和使用CSS(层叠样式表)的过程中经常会遇到各种各样的问题。这些问题不仅会降低工作效率,还可能导致网页布局出现意料之外的结果。本文将针对CSS...

    C语言编程易犯错误分析.pdf

    本文将对C语言编程中常见的易犯错误进行分析,旨在为初学者提供一份参考,帮助他们少走弯路,提高编程技能。 首先,C语言是一种区分大小写的编程语言。这意味着,在书写标识符时,如变量名、函数名和宏定义等,必须...

    06880 职业经理人常犯错误的培训(PPT 31页).ppt

    【职业经理人常犯错误的培训】是针对企业管理者常见问题的一个专题培训,旨在帮助职业经理人提升管理效能,避免常见的管理误区。以下是对这些错误的详细解释: 1. **拒绝承担责任**:优秀的管理者应该勇于承担工作...

    总结AngularJS开发者最常犯的十个错误

    以下总结了AngularJS开发者最常犯的十个错误,帮助大家避免这些陷阱,提升开发效率。 1. MVC目录结构不清晰: 开发者通常按照文件类型(如模板、控制器、指令、服务和过滤器)来组织代码,但这可能导致随着项目...

    老外写的:中国工程师写英文时最常犯的错误

    基于对超过200篇由中国工程学研究生撰写的英文技术论文的研究,本文总结了以下几种常见的写作习惯和错误: 1. **词汇选择不当**: - **例子**:“This paper introduces a new algorithm which is used to solve ...

    总结seo常犯的错误.docx

    例如,代码优化、网站静态化、结构设计、美工创意和内容编辑都需要协作完成,形成一个高效的团队。 4. **忽略数据分析与效果追踪**:持续分析网站SEO数据,如排名变化、IP流量、跳出率和转化率,对优化策略调整至关...

    SABER仿真中6种常犯错误的解决

    Saber是目前电子设计领域当中应用较为广泛的也是功能最为全面的仿真软件之一。但对于新手来说,在Saber软件的使用过程中总会遇到这样或那样的问题,阻碍设计与学习。在本文中,小编特意为大家总结了一些在saber仿真...

    犯错误以后作文.doc

    【标题】:“犯错误以后...总结来说,这篇“犯错误以后”的故事,通过作者的亲身经历,阐述了犯错、反思、成长以及友谊的价值,提醒我们在生活和成长过程中,应学会理智处理情感,珍视身边的人,并从错误中汲取教训。

    数据库开发者常犯的十大错误.doc

    【数据库开发者常犯的十大错误】是每个数据库从业者必须警惕的陷阱。首先,选择错误的数据库是常见问题。开发者必须根据实际需求分析数据量和性能要求,选择合适的数据库系统,如Access适合小型任务,SQL Server ...

    面试官的面试技巧和易犯错误.pdf

    以下是关于面试官的面试技巧和易犯错误的详细阐述。 首先,行为面试法是面试官常用的一种评估方法。这种方法基于行为的连贯性原理,认为一个人过去的行为可以预测未来的行为。面试官应采用开放式问题,让应聘者通过...

    细数java中Long与Integer比较容易犯的错误总结.docx

    ### Java中Long与Integer比较易犯错误总结 #### 一、引言 在Java编程过程中,经常需要对数值进行比较操作。对于基本数据类型如`int`和`long`,可以直接使用`==`进行比较。然而,当涉及到它们的包装类`Integer`和`...

    数据挖掘十大易犯错误

    的总结,关于数据挖掘中十大易犯错误的深入探讨。 ### 0. 缺乏数据(Lack Data) 数据是数据挖掘的基础,没有足够或高质量的数据,任何分析都将成为无源之水。特别是在分类问题或预测问题中,如欺诈侦测和信用评分...

    c语言易犯错误

    ### C语言易犯错误 C语言作为一门基础且强大的编程语言,在学习过程中,初学者往往会遇到各种常见的陷阱和误区。本文将根据前人的经验和教训,总结出一系列在编写C语言程序时容易出现的问题,并对这些问题进行详细...

    中国人写文章常犯的错误

    ### 中国人写英文文章常犯的错误及改进指南 #### 引言 随着全球化的深入发展,越来越多的中国学者、工程师和技术人员需要在国际期刊上发表论文或撰写技术文档,以便与世界各地的专业人士进行交流与合作。然而,在...

    程序员准备面试时常犯的错误总结

    程序员在准备面试时,往往会出现一系列的错误,这些错误可能会严重影响到面试的表现和最终结果。以下是对这些常见错误的详细分析: 1. **只在电脑上练习编程**:程序员习惯于在IDE或编译器中编写代码,但在面试中,...

    中国人写英文文章最常犯的错误

    ### 中国人写英文文章最常犯的错误 #### 概述 本文主要针对中国研究生群体在撰写英文技术论文时常见的语言习惯与错误进行了系统性的分析与归纳。通过对超过200篇由中国工程专业学生撰写的英语技术论文的研究,作者...

Global site tag (gtag.js) - Google Analytics