java面试常问问题总结---java技术基础篇

java基础部分

1.java的数据类型及所占字节(byte)大小

分为4类:整数型、浮点型、布尔型、字符型。

  整数型:byte、short、int、long(1、2、4、8)  默认值全为:0

  浮点型:float、double(4、8)  默认值全为:0.0

  布尔型:boolean(1)默认值:false

  字符型:char(2)默认值:'\u0000' 即空值

【Java核心技术卷】深入理解Java的char类型:
https://blog.csdn.net/qq_42322103/article/details/88907950
计算机的基本单位:bit . 
一个bit代表一个0或1 1byte = 8bit

2.访问修饰符的权限

java的访问修饰符有四种:private、protected、public、default.
1.private:及私有的,对访问权限限制最窄的修饰符。被private修饰的属性以及方法只能被该类的对象访问。它的子类也不可以访问,更不支持跨包访问。

2.protected:及保护访问权限,是介于public和private之间的一种访问修饰。被protected修饰的属性及方法只能被类本身的方法和子类访问。(子类在不同的包中也可以访问)

3.public:及共有的,是访问权限限制最宽的修饰符。被public修饰的类、属性、及方法不仅可以跨类访问,而且可以跨包访问。

4.default:及默认的,不加任何访问修饰符。常被叫做“默认访问权限”或者“包访问权限”。无任修饰符时,只支持在同一个包中进行访问。

3.final关键字与static关键字

final关键字:

1、final 变量。如果用final 修饰一个基本数据类型的变量的话,其数据一旦在初始化后变不能更改;如果是引用类型的变量的话,在对其初始化后则不能让其再指向另一个对象,而其引用的对象本身还是可以变的。例如:创建一个StringBuffer的对象,用final修饰,还可以使用append方法修改对象本身,但是指向的对象并没有改变,还是这个StringBuffer对象。

2、final 方法。如果在方法前面加final 关键字,则表示该方法不能被子类重写。使用final 修饰方法的原因有两个:一是将方法锁定,防止其子类重写,二是提高效率,final 方法比非final 方法要快。

3、final 类。使用final 修饰的类叫final 类。final 类的功能通常比较完整,因而不能被继承。

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

简而言之:就是在没有创建对象的情况下也能调用,通过类名就可以访问。没有this。

static 方法一般称作静态方法。静态方法是不能访问类的非静态成员变量和非静态成员方法,但是非静态成员方法中是可以访问静态成员方法和变量的。

2、static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。

3、static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

详情:https://www.cnblogs.com/Melinni/p/7588624.html
4.抽象类与接口的区别:
共同点:
1.接口与抽象类都不能实例化,他们都位于继承的顶端,用于被其他类继承或者实现;
2.接口与抽象类都可以包含抽象方法,实现或者继承他们的那些子类必须都实现这些抽象方法;
差别:
1.接口中没有构造方法,抽象类有构造方法;
2.接口中只有抽象方法,抽象类既有抽象方法也有非抽象方法;
3.接口中只有公共的静态常量,抽象类既有成员变量和静态常量;
4.接口不能包含初始化块,抽象类可以包含初始化块;
5.一个类可以实现多个接口,但一个类只能继承一个抽象类;
5.内部类相关知识掌握(java疯狂讲义中也有详细讲解,下面博客也是从java疯狂讲义中总结)
详情查看
在这里插入图片描述

6.super()与this()的区别

This():当前类的对象,super父类对象。
Super():在子类访问父类的成员和行为,必须受类继承规则的约束
而this他代表当前对象,当然所有的资源都可以访问.
在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.
而在方法中super和this使用的方法就差不多了.只不过super 要考虑是否能访问其父类的资源.

7.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

重写Override,子类覆盖父类的方法,将子类传与父类的引用调用的还是子类的方法。
重载Overloading 一个类多个方法,名称相同,参数个数类型不同。
两者都是Java多态性的不同表现。
Overloaded的方法是可以改变返回值的类型。

8.&和&&的区别?

 &:与: 左边若为false右边还执行。
&&:短路与,左边若为false右边不执行。

9.final, finally, finalize的区别?

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

10.String和StringBuffer的区别 及其StringBuffer、StringBuilder区别
三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。

String和StringBuffer的区别:点击查看

StringBuffer、StringBuilder区别:
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;

StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;

StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

详情:https://www.cnblogs.com/weibanggang/p/9455926.html
11.“==”与“eaquls”区别?

==:是一个比较运算符
1.基本数据类型比较的是值。
2.引用数据类型比较的是对象的地址。
equals()方法:一个判断值内容或地址的方法,继承祖宗类Object
1.如果没有对equals()方法进行重写,则比较的是两个对象的地址。
2.被重写后的equals()方法比较的是对象的内容的值

String类对equals()方法重写的源码如下:

public boolean equals(Object anObject) {
 		//判断是否同一对象
 2     if (this == anObject) {
 3         return true;
 4     }
 		//判断是否引用类型
 5     if (anObject instanceof String) {
 6         String anotherString = (String)anObject;
 7         int n = count;
 8         if (n == anotherString.count) {
 9         char v1[] = value;
10         char v2[] = anotherString.value;
11         int i = offset;
12         int j = anotherString.offset;

			//截取两边的字符串内容一 一比对
13         while (n-- != 0) {
14             if (v1[i++] != v2[j++])
15             return false;
16         }
17         return true;
18         }
19     }
20     return false;
21     }

12.java中I/O流的相关知识
https://blog.csdn.net/ly823260355/article/details/86527448
13.java异常面试题
点击查看

throw 和 thorws的区别
         thorws 是在方法声明上进行异常的抛出,可以抛出多个异常类
         throw 是在方法内部抛出,一般只能抛出一个异常对象
         throw 如果有异常抛出,这个异常一定是发生了的
         thorws 的抛出只是抛出一种可能性
throw的概述:
   在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
    
throws和throw的区别
        a:throws
        1.用在方法声明后面,跟的是异常类名
        2.可以跟多个异常类名,用逗号隔开
        3.表示抛出异常,由该方法的调用者来处理
        4.throws表示出现异常的一种可能性,并不一定会发生这些异常
        b:
        throw
        1.用在方法体内,跟的是异常对象名
        2.只能抛出一个异常对象名
        3.这个异常对象可以是编译期异常对象, 可以是运行期异常对象
        4. 表示抛出异常,由方法体内的语句处理
        5.throw则是抛出了异常,执行throw则一定抛出了某种异常

举例常见的异常:

  • NullPointerException - 空指针引用异常
  • ArithmeticException - 算术运算异常
  • IndexOutOfBoundsException - 下标越界异常

14.Java中的内存分配以及栈和堆的区别?
https://blog.csdn.net/ly823260355/article/details/88552830
15.java集合超详解
https://blog.csdn.net/feiyanaffection/article/details/81394745
HashSet如何保证元素唯一性的原理(为什么要重写equal和hashcode方法)
https://blog.csdn.net/xiao9469/article/details/88991811
数组

数组是java语言内置的数据类型,他是一个线性的序列,所有可以快速访问其他的元素,数组和其他语言不同,当你创建了一个数组时,他的容量是不变的,而且在生命周期也是不能改变的,还有JAVA数组会做边界检查,如果发现有越界现象,会报RuntimeException异常错误,当然检查边界会以效率为代价。

集合

JAVA还提供其他集合,list,map,set,他们处理对象的时候就好像这些对象没有自己的类型一样,而是直接归根于Object,这样只需要创建一个集合,把对象放进去,取出时转换成自己的类型就行了。
1、数组声明了它容纳的元素的类型,而集合不声明。

2、数组的长度是固定的,集合长度是可以改变的。

数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

3、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。

4、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。

5、集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。
16.集合面试题整理
https://www.jianshu.com/p/939b8a672070
17.Java中的内存分配以及栈和堆
点击查看

18.垃圾回收机制和内存分配机制
点击查看
19. sleep和wait的区别

  • 1、sleep是线程中的方法,但是wait是Object中的方法。
  • 2、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字
  • 3、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。

20. volatile和synchronized的区别

  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
  • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

21.JDBC 介绍
JDBC:Java Data Base Connectivity Java 连接数据库
JDBC,其实就是Java定义的一套和数据库建立连接的规范(接口),那么各家数据库厂商,想要Java去操作各家的数据库,必须实现这套接口,我们把数据库厂商写的这套实现类,称之为数据库驱动。

jdbc 编程步骤
1. 导入数据库的驱动jar包
2. 加载驱动jar包
3. 获取连接对象
4. 获取操作对象
5.开始操作
6.释放资源

22.数据库连接池
连接池概述:
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
常见数据库连接池:
1.DBCP: (apache组织) 没有自动回收空闲连接的功能
2. c3p0 有自动回收空闲连接功能
3. druid(阿里的): 它配置加密过后的数据库密码

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值