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

Java基础(1)--面试

程序员文章站 2022-05-05 22:49:14
...

1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。

数据类型 关键字 内置类 内存占用字节数
布尔型 boolean Boolean 1字节
字符型 char Character 2字节
字节型 byte Byte 1字节
短整型 short Short 2字节
整形 int Integer 4字节
长整型 long Long 8字节
单精度型 float Float 4字节
双精度型 double Double 8字节

2.&和&&的区别。
&是位运算符;不管前面对与错,后面都参与运算。
&&是布尔逻辑运算符;只要前面第一个为true,则后面的就不进行运算。

3. String 类能被继承吗,为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。

4.String,Stringbuffer,StringBuilder的区别?

  • 1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String
    String:字符串常量
    StringBuffer:字符串变量
    StringBuilder:字符串变量

从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码:

String s = "ABCabc";  
System.out.println("s = " + s);  

s = "123456";  
System.out.println("s = " + s); 

打印结果为:
s = ABCabc
s = 123456

首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。
也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。
内存结构如下图所示:
Java基础(1)--面试
所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

  • 2.StringBuilder与 StringBuffer
    StringBuilder:线程非安全的
    StringBuffer:线程安全的
    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
    对于三者使用的总结:

    1.如果要操作少量的数据用 = String
    2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。

  • Java中的初始化顺序:

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是
(静态变量、静态初始化块)>(变量、初始化块)> 构造器。
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

  • 类的实例化顺序:

初始化顺序:先初始化父类的静态代码—>初始化子类的静态代码–>
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码(变量定义等)—>初始化父类构造函数—>初始化子类非静态代码(变量定义等)—>初始化子类构造函数

6.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者是 public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

7.谈谈final, finally, finalize的区别。
final:
修饰符(关键字) 修饰类,则该类不能被继承;修饰方法,不能被重写;修饰成员变量,不能被二次赋值(所以说必须给定初始值);
不能和abstract同时使用;
finally:
专门用于在try-catch块之后,一般用于关闭某些流之类的。
finalize:方法名。
专门用在垃圾回收机制的时候;每一个对象都有一个finalize()方法;
当回收对象的时候,在进行可达性分析后发现没有与GC Roots相连接的引用链,会被第一次标记且进行一次筛选,筛选的条件就是是否有必要执行该方法,当对象没有覆盖该方法或者已经被调用过,就不会再执行该方法了;

相关标签: java 基础