`

java编程那些年常见的问题

 
阅读更多

1、Array 与  ArrayList的转化


    通常情况下,数组转list,我们会用这样的方式去转换。

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

       最终会得到一个ArrayList,但是这不是一个java.util.ArrayList的类对象,而是java.util.Arrays.ArrayList内部类对象,而它只有get、set、contains方法。也就是说只可以读不能修改,并且大小固定。这样当你再想去修改这个list的时候就会悲剧了。。。

        ArrayList如果是转成Integer[ ],那用ArrayList.toArray()没有问题,转成int[ ]就不行了,这个建议使用

int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0])),Apache  Commons中的工具包。

 

 2、在list的循环中修改list的元素

 

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],因为在循环的过程中修改list,index也会变化,导致最终的结果出乎意料。

        你可能想使用for each循环来修改,能够解决问题。看看下面这块代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
 
for (String s : list) {
	if (s.equals("a"))
		list.remove(s);
}

       会抛出ConcurrentModificationException这样的异常。其实for-each的底层实现用的就是iterator,所以改用iterator还是有可能报这个异常,只是可能。因为如下做法才是正确的:

        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之前调用,而for-each的实现中next方法在remove之后调用了,所以报错,可以查看ArrayList.iterator().源码便一目了然。

 

3、HashMap vs. TreeMap vs. HashTable vs. LinkedHashMap

 

HashMap:哈希结构存储,按key取值比较快

TreeMap :增加了按key排序的功能

HashTable:是同步安全的保证,但是因此也会损害一部分性能

LinkedHashMap:对于冲突的键值对链式存储,可以保证按照插入的顺序保存

 

4、泛型与类型擦除

public class Main {
	public static void main(String[] args) throws IOException {
		ArrayList<String> al = new ArrayList<String>();
		al.add("a");
		al.add("b");
 		accept(al);
	}
 	public static void accept(ArrayList<Object> al){
		for(Object o: al)
			System.out.println(o);
	}
}

        上面的代码编译就报错了,因为ArrayList<Object> al并不能用于ArrayList<String> al参数,前者并不是后者的父类型,如果换成数组就没问题了。究其原因,泛型是基于编译时的,运行时泛型信息会被擦除。上面的代码在编译时,判断泛型不匹配,所以报错。

public static void main(String args[]) {
    	ArrayList<Object> al = new ArrayList<Object>();
    	al.add("abc");
    	test(al);
    }
 
    public static void test(ArrayList<?> al){
    	for(Object e: al){
    		System.out.println(e); 
    	}
    }

    如果确实需要List可以放入任何参数,就应该将其定义为?,这样就可以放入任意类型了。? extends和 ? super也是一样的道理。 

 

5、异常

      异常的继承体系如下所示:



 

        最佳实践:如果一个异常能够被很好地控制住,它就应该被catch,否则就应该throws来告知使用者。

        Checked与Unchecked exceptions :简单来说Checked要么被catch,要么被声明throws,是必须处理的异常,而Unchecked是由一些严重的系统问题导致的,没有办法解决的,比如被0除等。

 

6、Collection的排序:

       TreeSet的排序,默认的无参构造函数或者参数为Collection<? extends E> 得到的set,其中的元素必须实现Comparable接口,从而实现按compareTo方法排序,而TreeSet(Comparator<? super E> comparator)理所当然地按传入的comparator的compare方法排序。同时Collections.sort()排序也是一样,对传入的list按comparator的实现来排序。

    Comparable与comparator的区别:Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作); 而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。Comparator的使用更加灵活。

        Collections.sort()与TreeSet排序差别:Collections.sort()是稳定的、一次性的排序,并且可以随机地取list中的任何元素,而TreeSet的排序是不稳定的并且排序只能获取其第一个或最后一个元素。

 

        当然TreeMap的排序是按照其中的key来排序,而key又是按照自己实现的排序接口来完成,就不多说了。

 

 7、通过六张图来理解java

 

 1>String的不可变性



 

 2> java中hashcode的实现


 3> Collection集合的结构



 4> java中的同步

具体细节请参阅:http://rainforc.iteye.com/admin/blogs/2039501

 

5> java中的堆与栈

 

6> jvm运行时数据区的结构

具体细节请参阅:http://rainforc.iteye.com/admin/blogs/2015693

 以上每张图具体去解释,可以延伸到很多东西,全部弄懂就能使java融会贯通。

 

 

 

 

 

 

 

  • 大小: 60.6 KB
  • 大小: 25 KB
  • 大小: 22.4 KB
  • 大小: 46 KB
  • 大小: 11.7 KB
  • 大小: 13.8 KB
  • 大小: 25.9 KB
分享到:
评论

相关推荐

    Java编程那些事儿系列文章.pdf(全)

    《Java编程那些事儿》系列文章,由IT教育专家陈跃峰撰写,旨在通俗易懂地讲解Java编程的基础知识与实践技巧,特别强调了程序设计的基本概念及其对初学者的重要性。以下是从该系列文章中提炼出的关键知识点: ### ...

    JAVA编程那些事那些事

    java编程那些事 1.1. 程序设计是什么? 程序设计,俗称编程,是一个比较专业的概念。初学者,甚至一部分开发人员,都不能很简单的解释这个概念,所以使初学者觉得程序设计是一件很有科技含量,或者是很高深的学科,...

    Java编程的逻辑

    15. **设计模式**:23种经典设计模式是解决常见问题的最佳实践,如工厂模式、单例模式、观察者模式等,它们在Java编程中广泛应用。 通过学习和实践这些Java编程的逻辑,开发者能够创建出高效、可靠且易于维护的软件...

    Java网络编程案例教程习题参考答案 .pdf

    Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程中最基本的组件,用于实现网络通信。...

    50道Java常见编程题(有精力的同学看看).rar

    Java是一种广泛使用的面向...总的来说,这份Java编程题集是一份非常实用的资料,适合有一定Java基础的学习者进行自我挑战和提升。通过系统的练习,可以逐步熟悉和精通Java语言,为将来更高级的开发工作打下坚实的基础。

    Java并发编程常见问题

    Java并发编程常见问题说明,包括Lock,synchronized,volatile等

    JAVA编程题全集(100题及答案)——直接打印

    JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...

    java并发编程实战源码,java并发编程实战pdf,Java

    7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些现象,以确保程序的正确性。 8. **Future与Callable接口**:这些接口允许我们异步计算结果,并能够获取任务的执行状态。 9. ** Fork/Join框架*...

    java编程200例(附:JAVA文档完全解读中文版)

    Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems公司于1995年推出,目前广泛应用于各种领域,如Web开发、移动应用、企业级应用、大数据处理等。"Java编程200例(附:JAVA文档完全解读中文版)"是一...

    Java经典编程50道

    《Java经典编程50道》是一份集合了Java编程中具有代表性和挑战性的题目资源,包含完整的源码,旨在帮助开发者提升Java编程技能。通过学习和实践这些题目,开发者可以深入理解Java语言的核心特性和常见设计模式,...

    java编程常见报错问题处理文档资源

    java编程常见报错问题处理文档资源

    Java网络编程/Java网络编程实例

    7. **网络安全**:Java网络编程也涉及网络安全问题,包括加密(SSL/TLS)、身份验证(证书、数字签名)和授权(访问控制)。Java的JSSE(Java Secure Socket Extension)库提供了这些功能。 8. **多线程处理**:在...

    华为JAVA编程规范、编程军规

    以上只是部分基于华为JAVA编程规范的知识点,具体细节需要参考《JAVA编程军规.doc》《JAVA十大低级错误.doc》《华为_Java编程规范.pdf》《华为JAVA编程规范.doc》等文档。这些规范旨在提升代码质量和团队协作效率,...

    java编程思想 help文件

    java编程思想, java编程基本技能和常见问题查询

Global site tag (gtag.js) - Google Analytics