JAVA基础面试复习

JAVA基础面试复习


1、Java基本类型8种:byte\char\boolean\ short\int\float\long\double

2、计算机中最小的存储单位:byte(字节)占8位 -27-27-1
byte\boolean占1个字节、char\short占2个字节、int\float占4个字节、long\double占8个字节

3、装箱:让基本数据类型,拥有一些对数据处理的能力(方法)
byte-Byte、short-Short、int-Interger、long-Long、float-Float、double-Double、char-Char、boolean-Boolean

4、标识符:名字的字符序列,就是标识符。组成:英文字母大小写、数字、下划线(_)、美元符号($)
命名定义规则:不能以数字开头、区分大小写、有些名字不能用。关键字全是小写

5、类型转换:
自动(隐式)转换:大小类型四则运算,自动提升为打类型
强制(显示)转换:手动指定数据类型的转换

6、逻辑运算符,运算顺序:NOT>AND>OR
eg、!true||false && true 结果:false

7、三目运算符:(关系表达式)? 表达式1:表达式2;

8、流程图:

do{}while()
while(){}

9、JDK链接: https://docs.oracle.com/en/java/javase/11/docs/api/index-files/index-1.html

扫描二维码关注公众号,回复: 16715550 查看本文章

10、无论是哪种计算机语言编写的程序加载到内存中,都被划分为4个部分,分别是code、data、stack和heap,具体介绍如下:

  1. code:表示代码段区,用于存储方法的二进制数据。 class文件(001100)在code区
  2. data:表示数据区,通常存放一些静态、不可变的数据。
  3. stack:表示栈,用于存放方法中定义的临时变量或者参数。 栈内存,运行代码的地方,基本类型的数据存储,复杂类型的地址,用小线牵着堆内存中的对应数据,没有线牵了,堆内的变量就可能要被回收了
  4. heap:表示堆,Java中所有new关键字创建的数据都存在堆内存。 复杂类型的数据都放在堆里了
public static void main(String[] args) {
    
    
    int a = 3;
    int b = 5;
    swap(a, b);
    System.out.println("a=" + a + "b=" + b);
}
private static void swap(int a, int b) {
    
    
    int c = 0;
    c = a;
    a = b;
    b = c;
}
结果依然是a=3,b=5  值传递
复杂类型,引用传递(实际传的是地址),修改堆里的值,地址没变。其他方法对其修改会影响该值
方法执行完,会进行该方法的出栈操作

11、面向对象。eg.老师具有的静态属性和动态行为如下:
⚫ 静态属性:姓名、职称、学科
⚫ 动态行为:出试卷、改试卷

12、类是抽象的,对象才是具体的

13、与普通方法相比,构造方法是一个特殊的方法,它具有以下特点:
(1)构造方法的名称和类名相同。
(2)构造方法没有返回值。注意,没有返回值和返回值是void是两个概念。
在构造方法中进行初始化的好处是,可以防止程序员在创建对象的时候,忘记给对象的静态变量进行赋值。为此,我们可以在构造方法中完成类静态属性的初始化工作。构造方法可以重载

14、使用this关键字可以方便的引用当前对象的成员变量或者方法,它最主要的一个用处就是可以更清楚的指明这个变量

15、静态方法只能访问静态成员,因为非静态成员需要先创建对象才能访问,即随着对象的创建,非静态成员才会分配内存。而静态方法在被调用时可以不创建任何对象。
16、访问修饰符范围

17、对数据封装之后,想要访问或者设置私有数据可以创建getter和setter方法

18、如果父类的某个属性使用private修饰,那么继承的子类是拥有这个属性的,但是无法看到这个属性的。你爸有个保险箱,你继承了你爸的财产,拥有了保险箱,但是由于保险箱是私有的,没有拿到保险箱的钥匙,就无法看到保险箱中存放的东西。 方法的重写

19、
(1)使用final修饰的类不能有子类。
(2)使用final修饰的方法不能被子类重写。
(3)使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改。

20、访问修饰符abstract 返回值类型抽象方法名(参数);
注意:
(1) 抽象类里面的抽象方法只需要声明,不需要去实现。
(2) 一个抽象类可以含有一个或者多个抽象方法。
(3) 抽象类可以包含普通的方法。
(4) 抽象类不能实例化,也就是说不能用new的方式产生对象。
(5) 我们只能new抽象类的子类,这个抽象类的子类需要实现抽象方法。 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类

21、需要注意的是,默认情况下,接口中定义的变量默认都是被public static final修饰的,也就是说,接口中定义的数据都是静态常量,这些接口中的静态常量的数据是不允许被修改的。

22、父类的静态方法能否被子类重写?
不能
因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。
子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。

23、// 匿名内部类

new Thread(new
Runnable(){
    
     @Override
public void run()
{
    
     System.out.println(new
Outside().i); System.out.println(j);
}
}).start();;

24、在面向对象编程时,先思考一下事物的本质,将本质定义为一个抽象类,将其拥有的能力定义为接口,一个事物可以同时拥有多个接口的。例如,上面充电宝的例子,可以按照下面思路进行设计:
(1)本质: 充电宝,容量cap,品牌logo,返回当前电量方法getRemainingPower,充电的方法charge。
(2)能力:给Android手机充电的能力,给华为品牌手机充电的能力,给苹果品牌手机充电的能力,发光的能力。
Java的解决方案是不允许多重继承。在Java中,可以通过接口解决多重继承的问题
eg.房车,既有房子的功能,也有汽车的功能。如果我们想要得到一个房车类,如果先定义一个房子类,再定义一个汽车类,是无法通过多继承同时拥有房子和汽车功能的。所以最好的做法是设计两个接口,其中一个接口是Liveable,具有居住的功能,另外一个接口是Moveable,具有移动的功能

25、集合:可以存储任意类型的对象,并且存储的长度可变,被统称为集合

26、
List:List是一个接口,List有一个特点就是元素有序,即元素的存入顺序和取出顺序一致,并且可以通过索引来访问集合中的指定元素
ArrayList集合内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组
LinkedList内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式记录它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来
ArrayList查找数据的效率更快,但是添加和删除元素的效率却不及LinkedList

下面我们看一下List接口中常见方法,具体如下。
⚫ add(E element):添加一个元素
⚫ add(int index, E element):在指定位置添加一个元素
⚫ get(int index):返回某个位置的元素
⚫ contains(Object o):判断list里面是否包含某个元素
⚫ remove(int index):删除某个位置的元素
⚫ size():查看list集合里面元素的个数
⚫ clear():清空集合的元素

27、栈的特点是后进先出,队列的特点是先进先出
1.栈–Stack
⚫ push(E item):在栈顶添加一个元素,入栈。
⚫ pop():移除栈顶一个元素,出栈。
⚫ peek():读取栈顶的元素。
⚫ empty():检查栈是否为空。
⚫ search(Object o):检查栈中是否包含某个元素,返回元素的位置。
2. 队列–Queue
⚫ add(E element):在队列中添加一个元素。
⚫ poll():获取队首的元素,并把他从队列中移除。

28、
1.谈一下HashMap的特性?
1.HashMap存储键值对实现快速存取,允许为null。key值不可重复,若key值重复则覆盖。
2.非同步,线程不安全。
3.底层是hash表,不保证有序(比如插入的顺序)

2.谈一下HashMap的底层原理是什么?
基于hashing的原理,jdk8后采用数组+链表+红黑树的数据结构。我们通过put和get存储和获取对象。当我们给put()方法传递键和值时,先对键做一个hashCode()的计算来得到它在bucket数组中的位置来存储Entry对象。当获取对象时,通过get获取到bucket的位置,再通过键对象的equals()方法找到正确的键值对,然后在返回值对象。

3、谈一下当两个对象的hashCode相等时会怎么样?
会产生哈希碰撞,若key值相同则替换旧值,不然链接到链表后面,链表长度超过阙值8就转为红黑树存储

猜你喜欢

转载自blog.csdn.net/qq_32670947/article/details/121702697