欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java的一些基础知识小结

程序员文章站 2022-03-20 11:25:30
...

1.a=a+b和a+=b有什么不同?
在Java中,当参与运算的两个数是byte、short或int时,它们首先会都被转换为int类型,然后再进行计算。然后把计算的结果赋值给用来存储结果的变量。如果用来存储结果变量的类型是byte或short,这意味着需要把int类型转换为byte或short类型。a+=b会隐式地把运算结果转换为a的类型。而a=a+b不会把a+b运算结果的类型隐式转换为a的类型。

2.使i+1<i得数是否存在? 存在
假设变量i为int类型,当i能表示的最大整数时,i+1就会溢出为负数,此时就满足i+1<i。例如:
public class Test{
public static void main (String [] args){
int i = Integer.MAX_VALUE;
if(i>i+1){
System.out.println(“存在”);
}
}

3.Java语言中,二维数组声明有以下三种方法:
(1)type arrayName [][];
(2) type [][] arrayName;
(3)type [] arrayName [];
例如:
(1)int[][] arr = new int[2][];
arr[0] = new int{1,2};
arr[1] = new int{3,4,5};
(2)int[][] arr = {{1,2},{3,4,5}};
String类有length()方法可以求解字符串的长度,数组的length属相可以求解数组大小。

4.String StringBuffer StringBuilder
String是不可变类,String字符串修改实现原理:当使用String字符串进行修改时,实现方法是首先创建一个StringBuffer,然后调用StringBuffer的append方法,最后调用StringBuffer的toString方法把结果返回。
例如:String s = “Hello”;
s += “world”; 等价于
String s = “Hello”;
StringBuffer sb = new StringBuffer(s);
sb.append(“world”);
sb.toString();
StringBuilder与StringBuffer类似,但是StringBuilder不是线程安全的。
在执行效率方法,StringBulider最高,StringBuffer次之,String最低。一般而言,如果要操作的数据量比较小,可以使用String类;如果是在单线程下操作大量数据,优先使用StringBuilder;如果是在多线程下操作大量数据,优先使用StringBuffer。

5.instanceof
instanceof的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

6.语句String s = “Hello world”;声明了什么?
分以下两种情况来讨论:
(1)在此之前没有定义过字符串常量"Hello world"
对于这种情况,实际做了两件事:1)在常量区创建了字符串"Hello world",2)声明了一个字符串对象的引用s,这个变量s引用的是常量区中的字符串常量"Hello world"
(2)在此之前已经定义过字符串常量"Hello world"
如果在执行代码之前,已经定义过字符串常量"Hello world",那么这行代码不会创建新的字符串,只创建一个字符串对象的引用s,让s指向常量池中已经存在的字符串常量"Hello world"。

7.throw和throws的区别
throw语句用来抛出一个异常,语法如下:
throw(异常对象);
throw e;
throws是方法可能抛出异常的声明,语法如下:
public void method(int a)throws Exception1,Exception3{……}
(1)throws通常出现在函数头;throw则通常出现在函数体。
(2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,即如果执行throw,则一定抛出了异常。
(3)两者都是消极处理异常的方式,只能抛出或者可能抛出异常,但是不会由函数处理异常,真正的处理异常由函数的上层调用处理。

8.序列化
序列化是一种将对象转换成字节序列的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库系统里,并在需要的时候把该流读取出来重新构造成一个相同的对象。
如何实现序列化呢?首先,所有要实现序列化的类都必须实现Serializable接口,Serialzable接口位于java.lang包中,它里面没有包含任何方法。使用一个输出流来构造一个ObjectOutputStream对象,然后,使用该对象的writeObject(Object object)方法就可以将obj对象写出,要恢复的时候就卡可以使用其对应的输入流。
序列化有以下几个特点:
(1)如果一个类能被序列化,那么它的子类也能够被序列化。
(2)由于static代表类的成员,transient代表对象的临时数据,因此,被声明为这两种类型的数据成员是不能够被序列化的。
(3)子类实现了Serializable接口,父类没有,父类中的属性不能序列化,但是子类中的属性仍能正确序列化。

9.下面的代码是否可以优化?
for(int i = 0;i<1000;i++){
Object obj = new Object();
System.out.println("object name is " + obj);

}
可以优化,优化后如下;
Object obj;
for(int i = 0;i<1000;i++){
  obj = new Object();
  System.out.println("object name is " + obj);

}