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;}}