整理并学习stackOverFlow上的热门回答

基础Java知识

平常没事的时候会逛逛stackOverFlow,上面有很多非常基础的问题,并且回答者讲解的非常的透彻,我想通过整理上面的热门回答来梳理一下自己的Java基础知识。

热门

什么是NullPointerExpection,如何去尽可能的避免

当你声明一个引用变量(对象)的时候,实际上是创建一个指向该对象的指针。参考如下代码

1
2
int x ;
x = 10 ;

在例子中,我们声明了变量 x 。因为是原始类型,系统会默认付给变量x初始值是0。但是第二行使用x=10,将数值10付给变量x,实际过程是将10写入变量x所指向的内存位置。
然而,当我们声明一个引用类型,对于int来说也就是其包装类型。会出现不一样的情形。

1
2
Integer num;
num = new Integer(10);

当你创建num的时候,系统不会默认创建一个默认值,因为他引用对象,然而,他会包含一个指针,这个指针虽然存在,但是他没有初始值,所以java会将变量的指针指向空(null)。
在第二行使用new关键字实例化了num,这时,会将变量num指针指向这个实例对象。

在当用到这个变量之前未给变量做实例化时,也就是变量的指针还指向空时,运行后会出现NullPointerExpection 这个问题。

可能觉得在实际codeing的时候不会出现上面的问题,但是实际上,每个方法的引用对象如果不判断传进来的值是否非空,都可能会出现这个问题

错误的示范:

1
2
3
4
5
public void doSomething(SomeObject obj) {
//do something to obj
}
// 调用的时候 传递null值时,会出现空指针异常
doSomething(null);

正确的示范:

1
2
3
4
5
6
7
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}

尽量在每次开发的过程当中,仔细斟酌变量是否可能为空,当可能为空时一定要做这种判断来预防空指针。保证代码的健壮性。

如何比较字符串

在当使用 == 比较字符串是可能会出现bug,这时可以用equals解决。所以引出一个问题,什么时候使用 == 什么时候使用equals

主要有两方面的差异:

  1. == 是比较对象引用,也就是真正的比较两个对象或者变量的地址是否是相同的。而equals比较的是值是否相等。

  2. == 没有非空的判断,而equals如果比较的对象如果是空则会出现异常,所以一般使用equals的方法都是使用已知的非空对象.equals(Object) 如 "hello".equals(x)

equals是Object的方法,大部分类中也重写了equals方法,所以在比较对象的时候应该使用equals,而当比较基本数据类型如int的时候可以使用 ==

Java是传值还是传引用

Java是传值的 。但是,通常我们定位值的时候称他为 “引用” 。具一个非常典型的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
Dog aDog = new Dog("Max");
// we pass the object to foo
foo(aDog);
// aDog variable is still pointing to the "Max" dog when foo(...) returns
aDog.getName().equals("Max"); // true
aDog.getName().equals("Fifi"); // false
}

public static void foo(Dog d) {
d.getName().equals("Max"); // true
// change d inside of foo() to point to a new Dog instance "Fifi"
d = new Dog("Fifi");
d.getName().equals("Fifi"); // true
}

虽然foo方法内改变了传进来的aDog的值,注意这里是 ,所以在调用完foo方法之后再去判断变量aDog的时候他的引用到的值没有变,变的只是当时传进去的值而不是变量的应用,所以可以说,对象的引用是按值传递的。如果这样还是迷糊的话,
还可以逆向来想,如果是传引用的话,在当foo方法改变了aDog的时候,也就是说明改变了aDog所引用到的真正的这个值。这样是不能成立。

所以不管怎么想:Java是传值的!!

怎样快速打印出array数组内的值

因为array并没有实现toString()方法,所以当使用array.toString()的时候会打印出类似 [I@17f052a3 的地址信息,在jdk1.5之后可以使用

1
2
3
4
int[] x = new int[]{1,2,3,4,5};
String arrayString = Arrays.toString(x);
System.out.println(arrayString);
//结果: [1, 2, 3, 4, 5]

这样的方式可以非常方便的打印出数组内所有元素,嵌套数组可以使用deepToString方法。

1
2
3
4
System.out.println(Arrays.toString(deepArray));
//output: [[Ljava.lang.String;@106d69c, [Ljava.lang.String;@52e922]
System.out.println(Arrays.deepToString(deepArray));
结果:[[John, Mary], [Alice, Bob]]
-------------本文结束感谢您的阅读-------------

本文标题:整理并学习stackOverFlow上的热门回答

文章作者:NanYin

发布时间:2018年07月25日 - 15:07

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2018/07/25/2018-07-25-stackOverFlow%E4%B8%8A%E7%9A%84%E7%83%AD%E9%97%A8%E9%97%AE%E9%A2%98/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。