一、StringBuffer与StringBuilder的区别?

  当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和String 类不同的是,StringBuffer和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象
  StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于StringBuilder 不是线程安全的(不能同步访问)。此外 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

二、Java中的泛型的理解

  泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
  使用泛型的意义在于:
  1.适用于多种数据类型执行相同的代码(代码复用)
  2.泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

  使用泛型的边界(局限)在于:
  1.不能实例化泛型类
  2.静态变量或普通方法不能引用泛型类型变量,但是静态泛型方法是可以的
  3.基本类型无法作为泛型类型,要使用包装类(例如Integer)
  4.无法使用instanceof关键字或==判断泛型类的类型
  5.泛型类的原生类型与所传递的泛型无关,无论传递什么类型,原生类是一样的
  6.泛型数组可以声明但无法实例化
  7.泛型类不能继承Exception或者Throwable
  8.不能捕获泛型类型限定的异常但可以将泛型限定的异常抛出

三、Java序列化与反序列化的过程

1.定义

  Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;

2.作用

  (1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
  (2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
  (3)通过序列化在进程间传递对象;

3.序列化步骤

  (1)将对象实例相关的类元数据输出。
  (2)递归地输出类的超类描述直到不再有超类。
  (3)类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
  (4)从上至下递归输出实例的数据

四、equals和hashCode方法的关系

1.定义

  equals(): 用来判断两个对象是否相同,在Object类中是通过判断对象间的内存地址来决定是否相同
  hashCode(): 获取哈希码,也称为散列码,返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

2.关系

  (1)hashCode主要用于提升查询效率提高哈希表性能,来确定在散列结构中对象的存储地址
  (2)重写equals()必须重写hashCode()
  (3)哈希存储结构中,添加元素重复性校验的标准就是先检查hashCode值,后判断equals()
  (4)两个对象equals()相等,hashcode()必定相等
  (5)两个对象hashcode()不等,equals()必定也不等
  (6)两个对象hashcode()相等,对象不一定相等,需要通过equals()进一步判断。

五、Java和C++的区别有哪些

  1.关于对象。C++创建对象之后,需要再使用完将其调用delete方法将其销毁;Java有垃圾回收机制,用来监视new出来的所有对象,辨别不会再被引用的对象,然后释放内存空间。
  2.Java不可以将一个非布尔值当做布尔值在逻辑表达式中使用,C++可以
  3.当变量作为类的成员使用时,Java才确保给定默认值,以确保那些基本类型的成员变量得到初始化,但是C++没有此功能。而对于局部变量,C++编译器会对其予以警告,Java则会视为错误。
  4.C++引入了操作符重载机制,Java不支持
  5.Java没有Sizeof()。在C\C++中,sizeof()操作符可以告诉我们为数据项分配的字节数,因为C++中不同的数据类型在不同的机器上可能有不同的大小。但是Java中所有数据类型在所有机器中大小都是相同的。
  6.C++中析构函数是提供一个在对象删除前可以释放这个对象所占用的资源的机会,但是Java并未提供“析构函数”或者类似的概念。在Java里,对象却并非总是被垃圾回收。
  7.如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。而C++若要在子类中引入一个新的重载方法,则需要屏蔽基类方法。
  8.C++中有多继承,Java中只有单一继承。Java可以通过接口实现多继承。
  9.Java是半解释和半编译的,运行速度比C++慢。
  10.Java没有Struct或者Union
  11.C++有指针,Java没有。

六、静态与非静态的区别

1.解释

  static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。

2.static变量和非static变量的区别

  1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。非static修饰的成员变量是在对象new出来的时候划分存储空间,是与具体的对象绑定的,该成员变量仅为当前对象所拥有的。
  2. static修饰的变量在加载的时候先于main方法加载在内存中的数据共享区-------方法区,而非static的变量在加载的时候,是要创建变量才加载在堆内存中的。
  3.一个static变量单独划分一块存储空间,不与具体的对象绑定在一起,该存储空间被类的各个对象所共享。static变量值在方法区加载一次,而非static在创建对象时会加载很多次。每次创建都会拷贝一份。
  4.对象在引用成员变量是直接通过类名.变量名调用,对象在引用实例变量时只能通过对象名.变量名调用。
  5.在类中调用成员变量时直接调用或者以类名.变量名方式调用,实例变量则用this或者直接调用。

3.static方法和非static方法的区别

  1. static修饰的方法也和static一样。先于main方法被加载到方法区,以便共享使用。
  2. static方法中不能使用this或者super关键字,因为static方法是先于对象创建之前就已经加载的方法,是属于类的方法,而this和super指向的是本类的对象或者父类的对象,非静态的方法是属于对象的,方法里可以用this和super。
  3. static方法可以用对象.方法名来调用,也可以用类名.方法名来调用。而非静态的方法只能创建对象后调用。
  4. static方法是加载一次,被所有的对象所共享。而非静态方法是有多少个对象就拷贝多少次,每个对象只能调用自己的拷贝的方法。
  5. 对象调用非静态的方法时,不考虑线程安全性的问题,而调用静态方法时,要考虑安全性的问题。因为静态方法只有一份。而对象的方法是自己有自己的。
  6. 同一个类中,静态方法中只能访问类中的静态成员。而非静态方法可以访问静态的成员也可以访问非静态成员(使用类名调用,或者创建本类的对象调用)。

七、Java中equals方法和==的区别

  1. equals 是判断两个变量或者实例指向同一个内存空间的值是不是相同
  2. ==是判断两个变量或者实例是不是指向同一个内存空间
  通俗来说,==是判断两个人是不是住在同一个地址,而equals是判断同一个地址里住的人是不是同一个