基于面试题的Java基础

一: java基础

1.1 java的8种基本数据类型 装箱 拆箱
1.1.1 8种基本数据类型
  • Byte short int long double float char Boolean
1.1.2.装箱和拆箱
  • 自动装箱是java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。如:把int转化为 Integer,double转化成 Double,等等,反之就是自动拆箱。
  • 原始类型:boolean,char,byte,short,int,long,float,double
  • 封装类型:Boolean,Character,Byte,Short,Integer, Long,Float,Double
1.1.3 java基本类型和引用类型的区别
  基本类型保存原始值,引用类型保存的是引用值(引用值就是指对象在堆中所处的位置/地址)
2.1Java语言的三大特性
  1. 封装:
    将属性和方法封装到一个类中,我认为就是私有化 private,将对象内部方法实现的细节隐藏,然后对外提供访问的接口
  2. 继承
    继承遵循里氏替换原则,子类可以扩展父类的功能,但不能修改父类原有的功能,继承后的子类自动拥有父类的属性和方法,私有的属性和构造方法除外,继承实现了代码的复用
  3. 多态
    是以封装和继承为基础,父类的变量指向子类的对象。
    注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

多态的定义与使用格式
定义: 父类类型 变量名 = new 子类类型();

//在多态中: 成员变量:编译运行看左边
Fu f = new Zi();
System.out.printIn(f.num); //这里取的是变量,所有看父类,所有 f.num 取到的是父类中定义的 num

//成员方法:编译看左边,运行看右边
Fu f = new Zi();
System.out.printIn(f.eat());// 这里是方法,所有看子类,所有 f.eat() 取到的是子类中重写后的方法
2.2. == 和 equals 的区别
  • ==比较的是内存地址
  • equals比较的值本身
  • equals如果不重写,和 == 是等价的
2.2.1 hashCode() 和 equals() 的区别
  1. 性能分析:重写的equals() 里面一般比较的比较全面复杂,这样效率就比较低,而hashCode() 进行对比时,只要生成一个hash值进行比较就可以了,效率很高。
  2. 可靠性分析:hashCode() 并不是完全可靠,有时候不同的对象生成的hashCode也会不一样,所有hashCode() 只能说大部分时候可靠,并不是绝对可靠。so
  1. equals() 相等的两个对象他们的hashCode() 肯定相等,也就是说用equals() 对比时绝对可靠的。
  2. hashCode() 相等的两个对象他们的equals() 不一定相等,也就是说用hashCode()对比不是绝对可靠。
2.3 操作字符串的类

String 、StringBuilder、StringBuffer

String 和 StringBuffer、StringBuilder的区别在于String声明的是不可变对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。

StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

2.3.1 String str = “a” 与 String str = new String(“a”)一样吗

不一样,因为内存的分配方式不一样。

String str = "a"; //这里把a存在常量池中
String str = new String("a"); //这里是存在堆内存
2.3.2 抽象类能使用final修饰吗?

不能,定义抽象类就是让其他类继承的,而final修饰的类不能被继承。

2.3.3关于static的那些事

1. 抽象的(abstract)方法是否可同时是静态的(static)?
答:不行,抽象方法将来是要被重写的,而静态方法是不能重写的。
2. 是否可以从一个静态(static)方法内部发出对非静态方法的调用?
答:不能,静态方法只能访问静态成员,非静态方法的调用要先创建对象。
3. static 可否用来修饰局部变量?
答:不允许
4. Java中是否可以覆盖(override)一个private或者是static的方法?
答:Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所有概念上不适用。

2.3.3 重载(Overload)和重写(Override)

方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则为重载;**重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。**重载对返回类型没有特殊的要求,不能根据返回类型区分。

2.4 序列化和反序列化

Java 序列化就是将对象转换为字节序列的过程,反序列化是将字节序列转换成目标对象的过程

2.4.1 什么情况下需要Java序列化

当Java对象需要在网络上传输 或者 持久化存储到文件中时需要序列化。

2.4.2 序列化如果实现

让类实现Serializable接口,标注该类对象是可被序列的。

2.4.3 某些数据不想序列化,如何处理?

在字段前面加 transient 关键字,比如:

transient private String num; //该字段不参与序列化

二:Java 集合(后续补充目前数据结构暂未熟悉)

1.1.1. Java 集合框架的基础接口

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

  1. Set 是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就像一副扑克牌。
  2. List 是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态变换的数组。
  3. Map 是一个将key映射到value的对象,一个Map不能包含重复的key:每个key最多只能映射一个value。
  4. 还有一些其他的接口:Queue、Dequeue、SortedSet、SortedMap、和ListIterator。
1.1.2Collection 和Collections 有啥区别?
  • Collection 是一个集合接口,它提供了集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如:List、Set 等。
  • Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法:Collections.sort(list)
1.1.3 List 、Set 、Map 是否继承自Collection接口

List、Set 是,Map不是。Map 是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许重复的元素(数学中的集合也是如此),List 是线性结构的容器,适用于按数值索引访问元素的情况。

1.1.3.1为何Map 接口不继承Collection接口

尽管Map接口和他的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。
如果Map继承Collection接口,那么元素去哪了?Map包含Key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。

三:异常和反射

1.1. error和exception有什么区别?

error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。

exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。

1.1.1. 说出5个常见的RuntimeException?

(1) Java.lang.NullPointerException空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
(2)Java.lang.NumberFormatException字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
(3)Java.lang.IndexOutOfBoundsException数组角标越界异常,常见于操作数组对象时发生。(4)Java.lang.IllegalArgumentException方法传递参数错误。
(5)Java.lang.ClassCastException数据类型转换异常。

1.2. throw和throws的区别?

throw:

  1. throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  2. throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

throws:

  1. throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  2. throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的
  3. throws表示出现异常的一种可能性,并不一定会发生这种异常。
1.2.1 Java中异常的处理

首先处理异常主要有两种方式:一种try catch,一种是throws。

  1. try catch:
  • try{}中放入可能发生异常的代码。catch{}中放入对捕获到异常之后的处理。
  1. throw throws:
  • throw是语句抛出异常,出现于函数内部,用来抛出一个具体异常实例,throw被执行后面的语句不起作用,直接转入异常处理阶段。
  • throws是函数方法抛出异常,一般写在方法的头部,抛出异常,给方法的调用者进行解决

四:IO(TODO)

五:多线程(TODO)

1.1.什么是进程

进程是系统中正在运行的一个程序,程序一旦运行就是进程。

进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

1.1.2 什么是线程?

是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

1.2. 线程的实现方式
  1. 继承Thread类
  2. 实现Runnable接口
  3. 使用Callable和Future

文章哪里有问题请指正,后面会继续更新
最后,如果对你有帮助的话,点个赞吧  ̄︶ ̄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值