Android面试题

本文深入讲解了Java中的基本数据类型、引用类型、流程控制、集合框架等关键知识点,包括各种关键字的用法、数据结构的选择与使用、并发编程的基础以及网络编程的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。

 八大基本数据类型

数据类型

关键字

内置类

内存占用字节数

布尔型

boolean

Boolean

1字节

字符型

char

Character

2字节

字节型

byte

Byte

1字节

短整型

short

Short

2字节

整形

int

Integer

4字节

长整型

long

Long

8字节

单精度型

float

Float

4字节

双精度型

double

Double

8




2.instanceof是什么,作用是什么?


instanceof是比较运算符,判断某个对象是否属于某个类,返回的结果是boolean类型。


3.break和continue的区别


break:跳出循环体

continue:忽略本次循环,进行下次循环


4. String 类能被继承吗,为什么。

String 类是被final修饰,所以不能被继承。


5. final的用途。 

final类不能被继承,没有子类,final类中的方法默认是final的。 

final方法不能被子类的方法覆盖,但可以被继承。

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

final不能用于修饰构造方法


6.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

 

静态内部类:使用static修饰的内部类

内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类

匿名内部类:使用new生成的内部类

因为内部类的产生依赖于外部类,持有的引用是类名.this

 

7.Java中try catch finally的执行顺序

 

先执行try中代码,如果发生异常执行catch中代码,最后一定会执行finally中代码

 

8.equals与==的区别:

 

==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相


9.String、StringBuffer与StringBuilder的区别

 

String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 StringBuffer和StringBuilder底层是 char[]数组实现的 StringBuffer是线程安全的,而StringBuilder是线程不安全的


10.Java的四种引用的区别

 

强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想 中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象

软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象

虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。


11,数组和链表的特点


数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。


12.说说hashMap是怎样实现的


哈希表:由数组+链表组成的

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。


13.ArrayList,LinkedList的区别


ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。


14.ArrayList和Vector的主要区别是什么?


ArrayList 和Vector底层是采用数组方式存储数据

Vector:

线程同步

当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍,

ArrayList:

线程不同步,但性能很好

当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小


15.HashMap和 HashTable 的区别:


HashMap不是线程安全的,HashTable是线程安全。

HashMap可以让你将空值作为一个表的条目的key或value,而Hashtable不允许。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。

Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。


16.wait()和sleep()的区别


sleep来自Thread类,和wait来自Object类

调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒


17.请介绍下 AsyncTask的内部实现,适用的场景是


AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来

执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,

比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有

线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题。


18.为什么TCP是可靠的,UDP早不可靠的?为什么UDP比TCP快?


TCP/IP协议高,因为其拥有三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

但是就速度来说,还是UDP协议更高,毕竟其无需重复返回验证,只是一次性的


19.http协议了解多少,说说里面的协议头部有哪些字段?

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议;http请求由三部分组成,分别是:请求行、消息报头、请求正文。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头


20.https了解多少

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。


21.谈谈 HTTP 中Get 和 Post 方法的区别

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连。POST把提交的数据则放置在是HTTP包的包体中。

2."GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据

3.POST的安全性要比GET的安全性高。通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录


22.请说出作用域public,private,protected,以及不写时的区别。

  • private修饰的成员变量和函数只能在类本身和内部类中被访问。
  • protected 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。
  • public修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问。
  • 默认情况(不写)下,属于一种包访问,即能被类本身以及同一个包中的类访问。
  • 下面这个表能清楚的说明java中作用域操作符的作用:
  •  作用域       当前类    同一package      子孙类     其他package
     public            √                √                   √                √
     protected      √                √                    √                ×
     friendly         √                 √                    ×                ×
     private          √                 ×                    ×                ×


23.Overload和Override的区别

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。

子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。


24.Integer与int的区别

int是java提供的8种原始数据类型之一。

Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况


25.说说&和&&的区别。 

&和&& 都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,

例如,对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 &++y>0) y会增长, If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。 备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。


26.在JAVA中如何跳出当前的多重嵌套循环? 

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。

例如, ok: for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { System.out.println(“i=” + i + “,j=” + j);if(j == 5) break ok;}}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值