总结一下最近做的东西中遇到的问题
1. Java 中的 int 与 Integer 用于 List<Integer> 时
两者之间的关系都是很清楚的,int 是基本数据类型,存储的是值,而 Integer 是引用数据类型,存储的是指向数值的地址。 Integer 是在类层面上对 int 的封装。然后 Java 提供了自动装包拆包机制,使得两者之间可以转换。这里主要是测试了下它们用于 List 时候的疑惑。
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package readdxflunwenyh; import java.util.LinkedList; import java.util.List; /** * * @author User */ public class test_Integer { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here List<Integer> lst=new LinkedList(); lst.add(new Integer(1)); lst.add(3); lst.add(5); lst.add(7); lst.add(9); //test1 for(int i=0;i<10;++i){ if(lst.contains(i)==false) lst.add(i); else System.out.println("true:"+i);//结果显示,直接用int型的i值来判断包含关系,可以正确判断 } for(int i=0;i<lst.size();++i){//输出 System.out.print(lst.get(i)+" "); } System.out.println(); //test2 lst.remove(1);//结果显示,删除了索引1号位的元素 for(int i=0;i<lst.size();++i){//输出 System.out.print(lst.get(i)+" "); } System.out.println(); //test3 lst.remove(new Integer(1));//结果显示,删除了值为1的元素 for(int i=0;i<lst.size();++i){//输出 System.out.print(lst.get(i)+" "); } System.out.println(); } }
结果:
true:1 true:3 true:5 true:7 true:9 1 3 5 7 9 0 2 4 6 8 1 5 7 9 0 2 4 6 8 5 7 9 0 2 4 6 8 5 7 9 0 4 6 8
通过测试发现,在 List<Integer> lst 判断包含关系 contains 时,可以用 int 型的变量正确判断是否包含了;而在删除 remove 时,用 int 型变量的话,删除的是相应索引的元素,而不是那个值的元素。究其原因,猜测应该是 contains 方法没有被重载,它只有一种参数,就是 Object 类型,这时用 int 型变量做实参,就自动转换为 Integer 类型;而 remove 方法被重载了,不仅有 int 型形参,还有 Object 型形参,这样的话,当用 int 型变量做实参时,匹配的就直接是那个删相应索引的元素,即
int 型形参,不会转换为 Integer 变量。这样想来,也是显然的了。有 remove 的那个困惑,可能主要因为你在 add 的时候是可以直接用 int 型变量的,(而且常常都是用 int 型变量),处于对等的想法,就会以为在 remove 的时候用 int 型变量就可以删除值为它的元素。
不过还有一点疑惑的是,List<Integer> 中存的是引用,程序中之前存的 1 或 2 的引用,和后来要删除时自己临时 new 的新的 1 或 2 的引用。就算 1 的因为都是常量,但 2 第一次加入的时候是由 int 型变量转换而来,之后删除时 2 是临时 new 出来的 Integer 变量,这样的两个引用是一样的吗?
2. Netbeans 程序框和程序计数
之前一个程序跑了好久,然后过程中没有输出,看着 Netbeans 就是一直不动,以为程序哪里出问题卡死了呢。Netbeans 右下角有一个进度条,它在程序有输出时会连续跑 4 圈,然后变蓝色暂停不再跑。(这样的话,不要以为程序出问题了~~~)
有一个小技巧就是,如果是递归调用的函数,可以添加一个静态变量记录该函数调用的次数,并每次输出它,不仅可以看到该函数被调用次数,也可以知道程序在运行~~意思就是通过打印变量去检测程序运行到哪了,特别是在递归的时候~