Java基础知识小结(5)

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);
    
    }
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值