面向对象的特征

  封装:把抽象的数据和数据的操作封装在一起,提供一个接口操作。

  继承:在现有功能的基础上,对原生类的属性和方法进行扩展。

  多态:一个引用(类型)在不同的情况下具有不同的操作。

  多态的机制:动态绑定机制也称为“运行时绑定”,由引用变量的实际类型决定了与哪个方法匹配,编译时,编译器根据参数的个数,参数的类型和参数的顺序匹配方法。

 

重载与重写的区别

  重载:在一个类里,方法名相同,而参数不同(独一无二)。返回类型可以相同也可以不同(但是不能作为重载的标准)。访问修饰符可以改变。

  重写:子类的参数列表必须与父类的完全相同,访问权限不能比父类中被重写的方法的访问权限更低。声明为 final 的方法不能被重写。构造器不能被重写(默认static)。

 

求奇偶数的方法

  public static boolean idOdd(int num) {

     return (num & 1) == 0;
   }

  理论上,位运算比对2取模要快,但实际操作时会发现两者其实效率差不多,这是因为编译器会将对2的指数的取模操作,优化成位运算操作,也就是说对于程序中的对2n的取模,编译器会将其自动优化,所以实际测试时感觉性能差不多!

 

单例模式(双重检查)

class A{
  private A() { }
  private volatile static A a = null;
  public static A getInstance() {
    if(a == null) {
      synchronized(A.class){
        if(a == null) {
          a=new A();
        }
       }
    }
    return a

  }
}

  1、第一个if (instance == null),只有instance为null的时候,才进入synchronized的代码段。

  2、第二个if (instance == null),为了防止可能出现多个实例的情况。

String和StringBuffuer、StringBuilder的区别

 

  String:字符串数值不可变;

  StringBuffer:字符串可修改,可以通过Append()来修改值。线程安全

  StringBuilder:字符串可修改,可以通过Append()来修改值。线程不安全

  三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

 

sleep()和wait()有什么区别

  sleep是线程被调用时,占着cpu休眠,其他线程不能占用cpu,不会让出系统资源。

  wait是进入等待池等待,让出系统资源,其他线程可以占用cpu。

 

synchronized和lock的区别

 

  1、synchronized修饰的代码在执行异常时,jdk会自动释放线程占有的锁,不需要程序员去控制释放锁,因此不会导致死锁现象发生;
  Lock发生异常时,如果程序没有通过unLock()去释放锁,则很可能造成死锁现象,因此Lock一般都是在finally块中释放锁;
  2、Lock锁仅适用于代码块范围,而synchronized可以锁住代码块、对象实例、类;
 

String  s =new  String (“syz”);创建了几个String对象

 

  1.如果String常理池中,已经创建"xyz",则只创建了一个对象new String("xyz");

  2.如果String常理池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String("xyz")。

 

 访问修饰符的作用域

 

默认情况下,属于访问,即能被类本身以及同一个包中的类访问。

 

冒泡排序

public static void sortArray(int[] arr) {

  int temp;
  for(int i=0;i<arr.length-1;i++) {
    for(int j=0;j<arr.length-1;j++) {
      if(arr[j]>arr[j+1]) {
        temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp;
      }
    } 
  }
}

 

HashMap与HashTable的区别

  HashMap:允许null键值(key = null,hash值为0),由于非线程安全,在只有一个线程访问的情况下,效率高于Hashtable。但是在多线程环境下一般使用CurrentHashMap,它的扩展性比HashTable好。

  HashTable:不能将null作为key或者value。方法是同步的,线程安全。

 

List、Set和Map的区别

 

  List:是存储单列数据的集合,存储有顺序,允许重复。继承Collection接口。

    常见的方法:add( )、remove( )、clear( )、get( )、contains( )、size( )

    1、ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。 JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句newCapacity = oldCapacity +           (oldCapacity >> 1)(即1.5倍扩容)计算容量,然后调用Arrays.copyof()方法进行对原数组进行复制。    

    2、LinkedList :采用链表数据结构,插入和删除速度快,但访问速度慢。

  Set:是存储单列数据的集合,存储无顺序,不允许重复。继承Collection接口。

    常见的方法:add( )、remove( )、clear( )、get()、contains( )、size( )

    1、HashSet: HashSet按照哈希算法来存取集合中的对象,存取速度比较快。当HashSet中的元素个数超过数组大小*loadFactor(默认值为0.75)时,就会进行近似两倍扩容(newCapacity =       (oldCapacity << 1) + 1)
    2、TreeSet :TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。

  Map:存储键和值这样的双列数据的集合,存储无顺序,键(key)不能重复。

    常见的方法:put( )、get( )、remove( )、clear( )、containsKey( )、containsValue( )、keySet( )、values( )、size( )

 

Java对象的创建方式

  1、使用new关键字

  2、使用反射机制创建对象:

    (1)使用Class类的newInstance方法

    (2)java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。

  3、使用clone方法:即将实例化的类先实现Cloneable接口并实现其定义的clone方法

  4、使用反序列化(ObjectInputStream,ObjectOutputStream)

 

error和exception有什么区别

  Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。

  Exception(违例)表示需要捕捉或者需要程序进行处理的异搜索常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。

 

  Exception又分为运行时异常,受检查异常。

         运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。

         受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。