基础Java知识
平常没事的时候会逛逛stackOverFlow,上面有很多非常基础的问题,并且回答者讲解的非常的透彻,我想通过整理上面的热门回答来梳理一下自己的Java基础知识。
热门
什么是NullPointerExpection,如何去尽可能的避免
当你声明一个引用变量(对象)的时候,实际上是创建一个指向该对象的指针。参考如下代码
1 | int x ; |
在例子中,我们声明了变量 x
。因为是原始类型,系统会默认付给变量x
初始值是0。但是第二行使用x=10
,将数值10付给变量x,实际过程是将10写入变量x所指向的内存位置。
然而,当我们声明一个引用类型,对于int来说也就是其包装类型。会出现不一样的情形。
1 | Integer num; |
当你创建num的时候,系统不会默认创建一个默认值,因为他引用对象,然而,他会包含一个指针,这个指针虽然存在,但是他没有初始值,所以java会将变量的指针指向空(null)。
在第二行使用new关键字实例化了num,这时,会将变量num指针指向这个实例对象。
在当用到这个变量之前未给变量做实例化时,也就是变量的指针还指向空时,运行后会出现NullPointerExpection 这个问题。
可能觉得在实际codeing的时候不会出现上面的问题,但是实际上,每个方法的引用对象如果不判断传进来的值是否非空,都可能会出现这个问题
错误的示范:
1 | public void doSomething(SomeObject obj) { |
正确的示范:
1 | public void doSomething(SomeObject obj) { |
尽量在每次开发的过程当中,仔细斟酌变量是否可能为空,当可能为空时一定要做这种判断来预防空指针。保证代码的健壮性。
如何比较字符串
在当使用 ==
比较字符串是可能会出现bug,这时可以用equals解决。所以引出一个问题,什么时候使用 ==
什么时候使用equals
主要有两方面的差异:
==
是比较对象引用,也就是真正的比较两个对象或者变量的地址是否是相同的。而equals比较的是值是否相等。==
没有非空的判断,而equals如果比较的对象如果是空则会出现异常,所以一般使用equals的方法都是使用已知的非空对象.equals(Object) 如"hello".equals(x)
equals是Object的方法,大部分类中也重写了equals方法,所以在比较对象的时候应该使用equals,而当比较基本数据类型如int的时候可以使用 ==
Java是传值还是传引用
Java是传值的 。但是,通常我们定位值的时候称他为 “引用” 。具一个非常典型的例子
1 | public static void main(String[] args) { |
虽然foo方法内改变了传进来的aDog的值,注意这里是 值
,所以在调用完foo方法之后再去判断变量aDog的时候他的引用到的值没有变,变的只是当时传进去的值而不是变量的应用,所以可以说,对象的引用是按值传递的。如果这样还是迷糊的话,
还可以逆向来想,如果是传引用的话,在当foo方法改变了aDog的时候,也就是说明改变了aDog所引用到的真正的这个值。这样是不能成立。
所以不管怎么想:Java是传值的!!
怎样快速打印出array数组内的值
因为array并没有实现toString()方法,所以当使用array.toString()的时候会打印出类似 [I@17f052a3
的地址信息,在jdk1.5之后可以使用
1 | int[] x = new int[]{1,2,3,4,5}; |
这样的方式可以非常方便的打印出数组内所有元素,嵌套数组可以使用deepToString方法。
1 | System.out.println(Arrays.toString(deepArray)); |