----------------虚拟机部分 start -----------------
谈谈对ClassLoader(类加载器)的理解
虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)
JVM内存模型,内存区域
----------------虚拟机部分 end -----------------
2,java中==和equals和hashCode的区别
==比较的两个变量的值是否相等如果比较的数引用行变量那么他比较的是内存地址,并不是里面的对象里面的数值
所有的java类都继承自Object,Object提供了equals方法。如果此方法没有被java类重写那么他跟==是一个意思比较的是引用
如果被重写了,那么根据重写的规则比较的是数值
hashCode是Object类中的方法,用于鉴定两个对象是否相等,返回对象在内存中地址转换成的一个int值,所以没有重写,任何对象的hashCode()方法都不相等
equals是给人调用的,hashCode用户一般不会调用他,比如hashMap他比较的是hashCode和equals,这种情况要都重写hashCode和equals
3,int、char、long各占多少字节数byte 1字节
boolean 1字节
char 2字节
short 2字节
int 4字节
long 8字节
float 4字节
double 8字节
int与integer的区别
int基本数据类型。初始值为0
integer是对象。初始值为Null
5,String、StringBuffer、StringBuilder区别
静态内部了,非静态内部类比喻
7,抽象类和接口区别
8,抽象类的意义
10,抽象类是否可以没有方法和属性?
抽象类可以不包含抽象方法,包含抽象方法的类一定是抽象类。
11,接口的意义
13,父类的静态方法能否被子类重写
父类的静态方法不能被子类继承,更谈不上重写,就算是子类中有一个和父类一模一样的静态方法,那也是子类本身的,和父类的那个静态方法不是一回事。方法加静态后就属于类不属于对象了。
14,进程和线程的区别
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。
16,Serializable 和Parcelable 的区别
17,静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.
原因:1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。
2). 多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。
3). 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。
18,内部类的设计意图
1).完善多继承,Java只支持单继承,比如每一个人都是同时继承父亲和母亲两个类,要不然你的身体里怎么能留着父母的血呢?
2).内部类是面向对象的闭包,因为它不仅包含创建内部类的作用域的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。一般使用一个库或类时,是你主动调用人家的API,这个叫Call,有的时候这样不能满足需要,需要你注册(注入)你自己的程序(比如一个对象),然后让人家在合适的时候来调用你,这叫Callback。
3).当父类和实现的接口出现同名函数时,你又不想父类的函数被覆盖,回调可以帮你解决这个问题。
静态内部类可以带来更好的代码聚合,提高代码可维护性。
把只和这个类相关的类型放到这个类内部是很合理的
20,成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
解析数据使用成员内部类
建造者模式静态内部类
回调匿名内部类
public class Test {
public static void main(String[] args){
Bean1 bean1 = new Test().new Bean1();
Bean2 bean2 = new Test.Bean2();
Bean.Bean3 bean3 = new Bean().new Bean3();
}
class Bean1{
public int I = 0;
}
static class Bean2{
public int J = 0;
}
}
class Bean{
class Bean3{
public int k = 0;
}
}
21,谈谈对kotlin的理解
//-------自有发挥
22,闭包和局部内部类的区别
http://blog.youkuaiyun.com/yuwenhao07/article/details/53607117
23,string 转换成 integer的方式及原理
String s = "1";
Integer i = Integer.valueOf(s);//这里要有异常处理,将字符串装换成字符然后在转换成int类型返回,在装箱成Integer
(二) java深入源码级的面试题(有难度)
2,讲一下常见编码方式?
7,修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
//HashMap
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
会调用原方法,比较的是key值
9,如何将一个Java对象序列化到文件里?File aFile=new File("e:\\c.txt");
Stu a=new Stu(1, "aa", "1");
FileOutputStream fileOutputStream=null;
try {
fileOutputStream = new FileOutputStream(aFile);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(a);
objectOutputStream.flush();
objectOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fileOutputStream!=null)
{
try {
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
```java
FileInputStream fileInputStream=new FileInputStream(aFile);
ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
Stu s=(Stu)objectInputStream.readObject();
System.out.println(s);
```
在 Java 和 Android 开发中,一般情况下下面几种场景会用到反射机制:
1)需要访问隐藏属性或者调用方法改变程序原来的逻辑,这个在开发中是很常见的,由于一些原因,系统并没有开放一些接口出来,这个时候利用反射是一个有效的解决办法。
2)自定义注解,注解就是在运行时利用反射机制来获取的。
3)在开发中动态加载类,比如在 Android 中的动态加载解决65k问题等等,模块化和插件化都离不开反射。
12,说说你对依赖注入的理解
15,String为什么要设计成不可变的?字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。
16,Object类的equal和hashCode方法重写,为什么?
(三) 数据结构1,常用数据结构简介
数据元素相互之间的关系称为结构。
有四类基本结构:集合、线性结构、树形结构、图状结构。
集合结构:除了同属于一种类型外,别无其它关系。
线性结构:元素之间存在一对一关系常见类型有:?数组,链表,队列,栈,它们之间在操作上有所区别。
例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,
栈只能在栈顶进行插入,删除操作.
树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等)。
图形结构:元素之间存在多对多关系,图形结构中每个结点的前驱结点数和后续结点多个数可以任意。
2,并发集合了解哪些?
http://youyu4.iteye.com/blog/2352846
5,容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections),具体的可以看看这篇博文 Java容器类)
6,List,Set,Map的区别
List有序,可重复Set无序,不可重复
Map key value形式存储 key唯一 value可重复
7,List和Map的实现方式以及存储方式
List 有序可重复 常用实现类是两个一个是ArrayLits和LinkedList
ArrayList 线程不安全 数组形式存储 查快
LinkList 线程不安全 链表形式存储 增删快
Set 无序不可重复 常用实现类HashSet TreeSet
HashSet 线程不安全 可以快速定位 存放其中的数据要实现hashCode()方法,使用了哈希算法
TreeSet 线程不安全 有序存放 存入其中的数据要可排序 这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口
Map 键值对的形式存储 key唯一 value可不唯一 HashMap TreeMap
HashMap 线程不安全 key实现hash算法可快速查找一个键
TreeMap 线程不安全 key值有序排列
8,HashMap的实现原理,HashMap数据结构,HashMap源码理解,HashMap如何put数据(从HashMap源码角度讲解),HashMap怎么手写实现?
12,TreeMap具体实现
13,HashMap和HashTable的区别
(1)基类不同:HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。(2)null不同:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。
(3)线程安全:HashMap时单线程安全的,Hashtable是多线程安全的。
(4)遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式
14,HashMap与HashSet的区别,HashSet与HashMap怎么判断集合元素重复?
16,ArrayList和LinkedList的区别,以及应用场景
17,数组和链表的区别
数组 分配内存连续,长度固定,插入,删除操作效率低
链表 分配内存不连续,长度不固定,插入,删除操作效率高
19,堆的结构
20,堆和树的区别
21,堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?
22,什么是深拷贝和浅拷贝
23,手写链表逆序代码
链表翻转(即:翻转一个单项链表)
24,讲一下对树,B+树的理解
25,讲一下对图的理解
26,判断单链表成环与否?
27, 合并多个单有序链表(假设都是递增的)(四) 线程、多线程和线程池
2,线程和进程的区别?
1)进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。2)线程是在进程中的,一个进程可以有多个线程,多个线程共享进程中的代码和数据
为什么要有线程,而不是仅仅用进程?
5,在Java中wait和sleep方法的不同,谈谈wait/notify关键字的理解
7,线程如何关闭?
http://blog.youkuaiyun.com/wisgood/article/details/19563245
9,数据一致性如何保证?//后端分布式数据一致的问题,果然变态,初步分析考的是乐观锁,还有待继续调查
10,如何保证线程安全?
11,两个进程同时要求写或者读,能不能实现?如何防止进程的同步?//这个太鸡巴难了
12,线程间操作List
//暂定
13,Java中对象的生命周期
14,Java中类的生命周期
15,单列模式与垃圾回收
http://cmsblogs.com/?p=2071
18,谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解
19,static synchronized 方法的多线程访问和作用
20,同一个类里面两个synchronized方法,两个线程同时访问的问题
对象锁,对象是同一个持有锁相同不可同时访问,对象不同持有锁不同可同时访问
21,volatile的原理
volatile轻量级synchronized,多线程共享可见
22,谈谈volatile关键字的用法,谈谈volatile关键字的作用
23,谈谈NIO的理解
24,synchronized 和volatile 关键字的区别
26,ReentrantLock 、synchronized和volatile比较
//说一下每个锁的特点,使用方式在说一下区别即可
https://blog.youkuaiyun.com/yanyan19880509/article/details/52345422
CAS算法Compare and Swap
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
28,lock原理
不会互相影响,
31,什么是线程池,如何使用?
线程模型
https://blog.youkuaiyun.com/daybreak1209/article/details/51366647
https://blog.youkuaiyun.com/daybreak1209/article/details/51372929
https://blog.youkuaiyun.com/daybreak1209/article/details/51378055
34, 谈谈对多线程的理解
37,谈谈你对多线程同步机制的理解?
就是说一下synchronized关键字,Lock应用,volatile他们的用法和区别
38,如何保证多线程读写文件的安全?
读的时候可以不加锁,写的时候一定要加锁39, 多线程断点续传原理,断点续传的实现
https://blog.youkuaiyun.com/qq_23174861/article/details/49925193
https://blog.youkuaiyun.com/SEU_Calvin/article/details/53749776
(五)并发编程有关知识点(这个是一般Android开发用的少的,所以建议多去看看):
平时Android开发中对并发编程可以做得比较少,Thread这个类经常会用到,但是我们想提升自己的话,一定不能停留在表面,,我们也应该去了解一下java的关于线程相关的源码级别的东西。
学习的参考资料如下:
1,Java 内存模型
3,线程状态:一张图让你看懂JAVA线程间的状态转换
锁机制:synchronized、Lock、Condition
并发编程:
Java并发编程:Thread类的使用
Java多线程编程总结
Java并发编程的总结与思考
Java并发编程实战-----synchronized
深入分析ConcurrentHashMap