Java面试小结1

来源:互联网 发布:java中的set和get方法 编辑:程序博客网 时间:2024/05/17 02:16

Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。

        1、对象是按引用传递的。

        2、Java 应用程序有且仅有的一种参数传递机制,即按值传递。

        3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。

        4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。

String等类型特殊对待。

java equal()方法和==

                 1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。

                  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

java类的初始化顺序

              1.父类静态成员和静态初始化,按在代码中出现的顺序依次执行。

              2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

              3.父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。

              4.执行父类的构造方法。

              5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

              6.执行子类的构造方法。

接口与抽象类的区别

           第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。

           第二点. 接口可以多继承,抽象类不行

           第三点. 接口定义方法,不能实现(Java8新增加了默认方法),而抽象类可以实现部分方法。

           第四点. 接口中基本数据类型为static而抽类象不是的。

           第五点.  接口中不能含有静态代码块以及静态方法(Java8新增加了静态方法),而抽象类可以含有静态方法和静态代码块。

           接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的

什么时候使用抽象类和接口

• 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

• 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

访问控制 private protected public default(同一包中)



bool和Boolean 区别

bool是基本数据类型

Boolean是是bool的封装类,有属性有方法,可以new。

java常量池

常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。

用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。

 Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值还,还包含一些以文本形式出现的符号引用,比如:

  类和接口的全限定名;

  字段的名称和描述符;

  方法和名称和描述符。

Java中的常量池,实际上分为两种形态:静态常量池运行时常量池

     所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

     而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

java常量池技术  java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,常量池存在于方法区中。

String,StringBuffer,StringBuilder的区别及应用场景

 String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象

而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

String 字符串常量

StringBuffer 字符串变量(线程安全)tringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的

StringBuilder 字符串变量(非线程安全) StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

1.如果要操作少量的数据用 String

2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer

数组

数组是一组相关数据的集合,数组按照使用可以分为一维数组、二维数组、多维数组
要使用java的数组,必须经过两个步骤:(1)声明数组,(2)分配内容给该数组,这两个步骤的语法如下:

线程与进程的区别

12.创建线程

1.实现Runnable接口

2.继承Thread类(也是实现了Runnable接口)

3.实现Callable接口

13.启动线程

 

 

14.线程池(优点,实现)

 

 

15.反射机制

 

动态加载类

Class.forName(“com.a.Test”).getConstructor().newInstance();

16.如果两个键的hashcode相同,你如何获取值对象 

HashMap在链表中存储的是键值对,找到哈希地址位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象









0 0