Android常见面试问题及其答案

1024答题时发现自己很多基础知识都遗忘了,可能是以前背过或者怎样,没有深刻了解的知识都容易遗忘,所以在这里回顾下各种问题,以及结合经验谈下自己的见解

常见问题Java篇

1、谈谈java三大特性

Java三大特性分为 继承,封装,多态

思考:继承是通过对父类属性和函数的复用表示类之间逻辑上的联系,封装是每个类不对外暴露的属性或函数及业务逻辑部分,是实现自身特性的方式,通过继承得到多个子类,每个子类通过封装实现自身特性,并在外部对于同一函数调用时表现为不同的行为

答:继承和封装是为了实现多态,即任何使用父类的地方,都可以使用子类来替代,并且对同一函数的调用会根据子类的不同而变化

2、讲下对String的了解

思考:这个问题比较广泛,首先需要知道String不是java基础类型,它的值是存储在常量池中的,它的引用有可能是在java堆里面,它在常量池里是以byte数组形式存在的

例如:

String a = "hello" (常量池)

String b = "he"+"llo" (常量池)

String b1 = "he"

String b2 = "llo"

String c = b1+b2 (java 堆 这里使用了StringBuilder字符串拼接)

String d = new String("hello") (java堆)

a == b != c != d

答:String在常量池里以byte数组存在,new String()对象指向java堆,但是它的值指向常量池

3、String StringBuilder StringBuffer三者的区别

思考:我们上面已经知道String是指向常量池的,它的值是不可变的,变更时其实是使用了StringBuilder进行拼接,再将拼接后的值在常量池中的地址指向给String,StringBuilder和StringBuffer的区别是前者线程不安全,效率高,后者线程安全

答:String的值无法变更,变更的实质是指向了其他地址,StringBuilder和StringBuffer的区别是两者线程是否安全

4、String为什么要设计成不可变的?

思考:String不可变的代码层原因是它的本质是一个设置为final的byte数组,内容不可变更,设计上是基于稳定考虑,毕竟不可变的对象是原子性的,线程安全的,避免了变化引起的问题

答:为了保证数据是原子性的,线程安全的,避免了变化引起的问题

5、各种数据类型的大小

思考:1Byte(字节) = 8bit(比特)

bit是计算机存储的最小单位,是二进制位(Binary digit)的简称,可以表示二进制中的0或1,Byte(字节)简写为B 是计算机处理的最小单位 

字是计算机处理二进制代码的位数,由多个Byte组成,例如64位计算机就是64bit(比特)也就是8个Byte(字节)

答:byte为1字节,char和short为2字节,int和float及bolean为4字节,long和double为8字节

注意:JVM规范中,boolean变量作为int处理,也就是4字节;boolean数组当做byte数组处理

6、int和Integer的区别是什么

思考:除了简单的Integer是int的包装类,它们的值也有所区别,在装箱的时候,Integer.valueOf()方法会缓存值为-128~127之内的数,所以为同一个数,在拆箱的场景下,int和Integer可以相等

即:

int a = 127

Integer b = new Integer(127)

Integer c = 127

Integer d1 = new Integer(128)

Integer d2 = new Integer(128)

a=b=c

d1!=d2

答:Integer是int的包装类,初始值为null,int初始值为0,同为装箱的情况,Integer -128~127之内的数值可以相等,拆箱情况下,int和Integer可以相等

7、equals和==的区别

答:如果是同一个对象的引用,可以使用==来作判断,但是如果是两个地址不同的对象进行比较,需要重写hashCode方法,并通过equals方法来判断内容是否相同

8、sleep和wait的区别

答:sleep是在线程中使用的,在设定的时间结束后会自动醒来,也可以调用interreput打断,它不会释放线程锁,wait是object中使用,可以用notify唤醒,它会释放线程锁

9、内部类和闭包的关系

思考:5.java内部类与内部类的闭包和回调 - 简书

答:内部类是用来解决java无法多继承而使用的技术,可以很好的隐藏,可以用来实现多个同名函数的调用,闭包是使用接口+内部类的形式,利用了内部类可以调用外部类参数及函数的功能来实现的,

10、谈谈对线程和进程的看法

思考:线程是进程的一部分,是进程最小的执行单元

11、谈谈反射

思考:程序运行时允许改变结构和成员类型,这种语言被称为动态语言,而Java虽然不是动态语言,但是它有动态机制——反射,任何一个类都是Class类的实例化对象

答:我们可以通过类的反射实现在运行时实例化对象的架构设计,来实现动态加载,可以获取类不允许外部访问的方法及变量进行操作

12、谈谈注解

思考:浅谈Java中的注解 - 简书

答:注解处理器利用反射获取注解中的属性并处理,使得业务逻辑在代码层面更直观简洁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值