一、Java基础知识

1.JDK、JRE、JVM三者之间的关系

JDK是Java开发工具包
JRE是Java运行时环境
如果要开发Java程序要安装jdk,只是运行的话,仅安装JRE即可
JVM时Java虚拟机,jvm屏蔽了操作系统底层的差异,从而实现一次编译,到处运行
JDK包含JRE,JRE包含jvm

2.Java的三大特性(继承、封装、多态 重点说说对多态的理解)

继承:子类继承父类,拥有父类除构造方法之外的其他方法和属性,父类的私有属性和方法不见得可以直接访问
封装:将类信息包括属性和方法隐藏在类内部,不允许直接方法,而是通过特定的方法进行访问。
多态:同一个方法通过不同的对象调用有不同的展示。
多态形成的条件:子类继承父类、方法的重写、父类引用指向子类对象
子类中方法的访问权限大于等于父类
子类抛出的异常小于等于父类

3.八大基本数据类型

byte(-127~128) short int(-231~231 - 1) long float double boolean char

4.说下对类、对象、属性、方法的理解

举个例子:
类时具有相同属性和方法对象的集合
整个人类就可以看作一个类
其中的某个人就可以看作对象,对象时类的具体化
人具有姓名、性别、身高、体重等特性可以看作时属性
方法就是人吃饭、睡觉等动作就可以写成方法

5.成员变量、局部变量、类变量(静态变量)

静态变量从属于类
成员变量从属与对象,类内部方法外部
局部变量在方法或语句块内

6.普通类和抽象类

抽象类不能被实例化
抽象类中可以有抽象方法
抽象类中不一定有抽象方法,但是有抽象方法的一定时抽象类
抽象类不能声明为静态,不能被static、final修饰

7.接口和抽象类

接口和抽象类都不能被实例化
抽象类和接口中的抽象方法都没有方法体

抽象类只能单继承,接口可以多继承
jdk1.8之后接口中可以定义静态方法,静态方法要有方法体
抽象类中的普通方法要有方法题
子类继承抽象类,要实现抽象类中的抽象方法,否则继续为抽象类

8.final、finally、finalize

final 修饰变量为常量,值不能被改变;修饰方法,该方法不能被重写;修饰类,该类不能被继承
finally:抛出异常的时候用到,finally中的无论什么情况都会被执行
finalize:进行垃圾回收,在销毁该对象前,该方法会被自动调用

9.循环结构while do…while(这两个的区别) for(九九乘法口诀)

while 中的条件可能一次也不执行
do…while至少执行一次

public class JiuJiuTest {
    public static void main(String[] args) {
        for (int i = 1;i<=9;i++){
            for(int j = 1;j<=i;j++){
                System.out.print(j + "*" + i + "=" + i * j + "\t");
            }
            System.out.println();
        }
    }
}

10.分支结构 if…else switch…case(中条件可以为什么类型)

switch…case支持的数据类型byte、short、int、char和他们对应的包装类,jdk1.7之后支持String

11.super和this

this是当前对象的引用,this本质是执行当前对象的指针
super在Java子类中起到父类引用的作用
父类如果重写了无参构造器或者父类中没有有参构造器,那么子类的构造方法第一行就是super(),可以省略
子类重写父类方法后可以通过super来调用父类的变量和方法

12.方法重写和方法重载

方法重载:方法名相同,参数列表相同,返回值相同,方法体中的内容不同
方法重写:方法名相同,参数的类型和个数不同,与返回值没关系

13.克隆(浅拷贝和深拷贝)

克隆:想要将对象复制,又想保留原来的对象
如何实现深克隆:
1.继承Cloneable接口,重写clone方法
2.继承Serializable,通过序列化和反序列来进行克隆

BeanUtils、apache和Spring中的方法都是浅拷贝

深拷贝和浅拷贝的区别:
浅拷贝:仅克隆基本类型变量,不克隆引用类型变量
深拷贝:基本类型变量和引用类型变量都克隆

14.String StringBuffer StringBuilder

String是不可变对象,因为底层被final修饰
StringBuffer和StringBuilder是可变对象,StringBuffer线程安全,方法中被sythronized修饰,StringBuilder线程不安全
StringBuffer可以做同步检查,因此效率低;StringBuilder不做同步检查,效率高

15.初始化数组的方式

动态初始化:int[] arr1 = new int[长度];
静态初始化:int[] arr1 = new int[]{1,2,3}; 可以简化为int[] arr2 = {1,2,3};

16.冒泡排序

public class BlobTest {
    public static void main(String[] args) {
        //冒泡排序外层循环控制循环的轮数
        //内层循环控制每轮比较的次数
        int[] arr = new int[]{9,4,3,6,1,7};
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        for (int i : arr) {
            System.out.println(i);
        }
    }
}

17.遍历数组的两种方式

for循环
foreach
iterator迭代器

18.常见的异常类

编译时异常 RuntimeException
ArrayIndexOutOfBoundsException
ArithmeticException
NullPointerException
ClassNotFoundException
ClassCastException
NumberFormatException
NoSuchMethodException

IOException包括
IOException
FileNotFoundException
EOFException

Error
NoClassDefFoundError:一个类在编译的时候可以找到,在运行的时候找不到
OutOfBoundsException

19.序列化和反序列化

序列化:将Java对象转化成字节流的过程
反序列化:将字节流转化成Java对象

为什么要用序列化和反序列化
两个进程进行网络通信,可以传输各种类型的数据,例如:视频、文件、音频,但这些东西要以二进制的形式在网络间传输。Java的序列化和反序列化实现对象间的网络传送。

20.泛型说一下

在类定义的时候,不会确定类的属性或方法参数的具体类型,而是在类使用的时候再进行类型的定义

上限通配符:extends 类,必须是后面类的子类
下限通配符:super 类,必须是后面类的父类

21.Java中的反射机制

在程序的运行状态中,对于任意一个类,能够知道其属性和方法;对于任意一个对象,能调用其属性和方法。这种动态获取信息和动态调用对象方法的功能称为Java中的反射机制。

22.Java中的IO流(字节流和字符流)

根据流向的不同,可以分为输入流、输出流。
根据传输单位又分为字节流、字符流

字节流:传输字节、字节数组,存储的是二进制文件
字符流:传输字符、字符数组、字符串

缓存流:BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter

23. ==和equals的区别

比较的类型是基本数据类型,==比较的是值;比较的是引用数据类型,比较的是地址
equals不能用于基本数据类型的比较,只能用于引用数据类型,比较的是地址;但是有些Java类重写了equals方法,比较的就是值是否相等。例如:String类

24.八大基本数据类型对应的包装类(包装类的缓存机制)

Byte Short Int Long四种类型的值在[-128,127]之间创建相应类型的缓存机制,Character的范围是[0,127]

以Integer为例,通过自动装箱机制创建对象的时候,判断数值是否在[-128,127]之间,则会去缓存中寻找该值,找到了,不会创建新对象,找不到会创建新对象。因此在缓存范围内的数值,可以通过==来进行判断。

public class Test11 {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;
        System.out.println(a==b);//true
        Integer c = 129;
        Integer d = 129;
        System.out.println(c==d);//false
    }
}

25.日期(日期格式和字符串互相转化)

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date转字符串:sdf.format
字符串转date:sdf.parse

26.Collection和Collections的区别

Collection是接口,Collections是集合的工具类,提供一些方法

27.Arraylist和LinkedList的区别

ArrayList底层是数组,查询快,增删慢
LinkedList底层是链表,查询慢,增删快

28.list和set的区别

list是有序集合,可以存放重复的数据
set是无序集合,不可存放重复的数据

29.集合类中哪些线程安全

Vector、HashTable都会进行同步检查

30.JVM的内存模型

包括 程序计数器、虚拟机栈、本地方法栈 、堆、方法区

31.垃圾回收机制

32.垃圾回收算法

33.类的执行顺序

父类静态代码块
子类静态代码块
父类普通方法
父类构造方法
子类普通方法
子类构造方法

34.&和&&的区别

&是短路与:左边的不正确,右边的不用判断
&&:左右两边都需要判断

35.抽象类一定要有抽象方法吗?有抽象方法一定是抽象类吗?

抽象类不一定有抽象方法;有抽象方法一定是抽象类

36.面向对象和面向过程

面向过程是执行者思维,将问题拆分成小的步骤,依次进行调用
面向对象是创建者思维,通过创建对象,对象具有相应的属性和方法,调用对象来做这件事

面向对象和面向过程是相辅相成的,面向过程离不开面向对象,面向对象也离不开面向过程

37.三种修饰符(public private protected default)

private 本类
default 本类、本包
protected 本类、本包、子类
public 所有都可访问

38.创建线程的两种方式

继承Thread的类,重写run方法;
实现runnable接口,重写run方法

40.继承和实现的区别

继承是将多个类相同的部分抽取出来,可以作为其父类进行继承
实现是多个类方法相同,但是方法体不同,就可定义为接口,来实现这个接口

类是单继承,但可以实现多个接口;接口时多继承
继承使用关键词extends,接口使用关键词implements
实现接口之后,要重写里面的抽象方法;继承之后,想调用哪个方法都可以
继承中可以定义属性、方法、变量和常量;接口中只可定义全局变量和抽象方法

41.break和continue的区别

break跳出整个循环;continue结束本次循环,进行下一次循环

42.Comparator与Comparable有什么区别

他们两个都是接口
实现Comparator接口,重写CompareTo方法
实现Comparator接口,重写Compare方法

43.String s = new String(“jay”); 和 String s1 = “jay”; 的区别

String s = new String(“jay”); 创建了两个变量,一个在字符串常量池,一个在堆内存,堆内存的对象是字符串常量池对象拷贝的副本。
String s1 = “jay”; 直接是字符串常量池中的jay指向了s1变量。因此创建出来的s和s1的地址是不同的

String a1 = “a”; String a2 = “b”; String a3 = a1 + a2; String a4 = “ab”; 请说出a3 和 a4的区别

a3 和 a4的地址是一样的,== 和equals都是相等的
这里的加号相当于StringBuffer.append()方法进行拼接

44.标识符的组成

标识符由字母、数组、下划线、美元符号组成,开头不能是数字

45.键盘输入next 和 nextLine的区别

next遇到空格停止
nextLine遇到回车停止
这两个都是用来接受String类型的

46. 继承和组合

继承可以看作 is a
组合可以看作 has a

47.ArrayList和HashMap HashSet底层源码研究

48.BIO、NIO、AIO 有什么区别

50.File中常用的方法

51.throw和throws的区别

throw用在方法体中,throws用在方法声明上
throw只能抛出一个异常,throws可以抛出多个
throw表示抛出异常,执行力throw就一定出现这个异常;throws表示可能出现的异常,并不一定出现这些异常
throw由方法体来处理异常,throws由方法的调用者来处理异常

52.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

先执行try catch finally,最后返回return中的内容
finally中的内容总是被执行

53.实例化对象的方式

通过new
使用克隆
序列化反序列化
使用反射机制

54.hashcode的作用

55.为什么不能从静态方法中访问非静态变量

静态方法被static修饰,从属于类,类一加载就会运行静态方法,非静态变量属于对象,此时还没有创建对象;因此静态方法不能调用非静态变量。

56.Java中的容器

单列集合Collection接口 双列集合Map
Collection接口下面有list set
list是有序集合,可以存储重复的值
set是无序集合,不可存储重复的值

双列集合中的Map存储的是键值对

57.数组和list之间的转化

数组转list Arrays.asList()
list转数组 list.toArray

58.队列和栈的区别

队列先进先出;栈后进先出

59.线程 run()和start()方法的区别

start()表示运行线程,run()表示执行线程的运行时代码;
start只能调用一次,run可以调用多次

60.sythronized和lock锁

sythronized是一个关键字,lock是一个接口
sythronized可以主动释放锁,lock需要手动上锁、解锁
sythronized无法判断是否获取到锁,lock可以判断是否已经获取到锁
sythronized不能响应中断,lock可以相应中断
sythronized是非公平锁,不能保证等待锁的线程们的顺序;lock默认是非公平锁,但是可以通过布尔参数的构造方法实例化出一个公平锁
sythronized是同步阻塞,采用悲观并发策略;lock是同步非阻塞,采用的是乐观并发策略

61. wait(), notify()和 notifyAll()

62.volatile

63.有几种设计模式(工厂模式)

CAS

1.tcp和udp的区别

2.OSI七层模型

3.tcp三次握手、四次挥手

1.jsp和servlet的区别

2.jsp的内置对象

3.forword和redirect的qubie

4.jsp的4中作用域

5.session和cookie token(以及session执行原理)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值