转载请注明出处,转载时请不要抹去原始链接,
我把我找到的资料,个人认为写得比较靠谱的贴出来,
基本上均为原文链接,如侵立删。
JAVA题目
常见的数据结构的特点、优缺点、实现原理,应用场景。
回答这类问题,一定要回归原点,回归该数据结构的底层实现,搞清它的构造方法,几个增删改查方法,无论谁和谁比,都很简单。
问题诸如:
1.xx的适用场景?/xx是否线程安全?/xx怎样保证线程安全?/ConcurrentHashMap和HashTable相比为什么更高效?
2.xx的扩容机制/xx的扩容阈值/hashMap的扩容在java 1.7 和1.8有什么不同?
java的基本数据类型,占几位?
http://www.cnblogs.com/doit8791/archive/2012/05/25/2517448.html
Java魔法堂:String.format详解
http://www.cnblogs.com/fsjohnhuang/p/4094777.html
Java byte 你必须要知道的相关问题
https://mp.weixin.qq.com/s/qZO3Z4aPBtJ21-WVCEgz3Q
Java 中 char 与 byte 相关知识点解析
https://mp.weixin.qq.com/s/PR7MkqCyEehmiwcul0ineg
数组array
http://cmsblogs.com/?p=92
Java 集合框架不再懵逼快速指南
https://mp.weixin.qq.com/s/dqEDvGNx6HYZwNyakEBMAw
列List
回答在何种场景选择何种list
http://cmsblogs.com/?p=1201
linkedList
http://wiki.jikexueyuan.com/project/java-collection/linkedlist.html
arrayList
http://wiki.jikexueyuan.com/project/java-collection/arraylist.html
vector
http://cmsblogs.com/?p=1180
stack
http://cmsblogs.com/?p=1190
我是一个“栈”
https://mp.weixin.qq.com/s/DWuIREoz4yrfxo1pbXSACg
copyOnWriteArrayList
http://www.cnblogs.com/skywang12345/p/3498483.html
表Map
map的小总结
http://cmsblogs.com/?p=1212)
*hashMap
搞懂 Java HashMap 源码
*linkedHashMap
搞懂 Java LinkedHashMap 源码
concurrentHashMap
点击打开链接
concurrentHashMap的扩容是个细节
concurrentHashMap的扩容,是
第一个执行的线程会首先设置sizeCtl属性为一个负值,然后执行transfer(tab,null),其他晚进来的线程会检查当前扩容是否已经完成,没完成则帮助其进行扩容,完成了则直接退出。
该ConcurrentHashMap的扩容操作可以允许多个线程并发进行,那么就要处理好任务的分配工作。每个线程获取一部分桶的迁移任务,如果当前线程的任务完成,查看是否还有未迁移的桶,若有则继续领取任务执行,若没有则退出。在退出时需要检查是否还有其他线程在参与迁移工作,如果有则自己什么也不做直接退出,如果没有了则执行最后的收尾工作。
几个策略
1。感知策略 sizeCtrl ,低16位存着 当前参与扩容的线程数+1,高16位存的是数组扩容前的容量信息。
有线程进来就 CAS ,sizeCtl+1,完成了就CAS -1
2.判断策略,有三个判断,判断是否需要加入线程来帮忙扩容。
- 处理策略,有点复杂,桶里的第一个元素为 forwardNode,,发现是这个元素就知道这里要做扩容。
hashTable
点击打开链接
treeMap
点击打开链接
sparseArray
https://www.jianshu.com/p/30a2bfb202b4
集Set
HashSet & LinkedHashSet
搞懂 HashSet & LinkedHashSet 源码以及集合常见面试题目
treeSet
点击打开链接
多线程,进程,高并发,java内存模型,jvm
这里单独写了一篇讲线程的
https://www.jianshu.com/p/fb07e8b77eb1
对象。
java的精髓就是对象,对象里可供展开的也不少。
1.面向对象编程有三大特性:封装、继承、多态
封装
http://cmsblogs.com/?p=41
继承
http://cmsblogs.com/?p=48
多态
http://cmsblogs.com/?p=52
类的加载
https://blog.csdn.net/briblue/article/details/54973413
2.Java 对象的生命周期
https://blog.csdn.net/sodino/article/details/38387049
讲到声明周期就一定会讲内存管理,就一定涉及到内存回收及内存泄露
什么是java的内存泄露?
https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/
其中举了两个例子,
当内存紧张的时候,就进行回收(这里可以拓展内存新生代,老年代,GC的知识,后续会讲)
而另一个例子
代码本意可能是 用完了对象o,就置空,等着回收,而实际上o是一个指针,指向了一个堆内存块new Object(),vector.add进去的就是这个堆内存块的指针,单独看这一段代码只能说明该内存块仍旧被vector引用,并没有出现泄露。
第二个例子引发的讨论
http://bbs.csdn.net/topics/330232357
其实代码贴全,后续代码会告诉我们,这个o就没有用到了,
v也不会用到它,所以应当回收o,但实际没有回收o,所以认为是泄露了
解决方案就是vector.remove(o)
怎么防止内存泄露?
http://blog.csdn.net/renfufei/article/details/14138099
说到的第1点就是上方例子,o没有被使用,但是依旧活着
1. 当心集合类,比如 HashMap,ArrayList等,因为这是最容易发生内存泄露的地方.当集合对象被声明为static时,他们的生命周期一般和整个应用程序一样长。
2. 注意事件监听和回调.当注册的监听器不再使用以后,如果没有被注销,那么很可能会发生内存泄露.
3. "当一个类自己管理其内存空间时,程序员应该注意内存泄露." 常常是一个对象的成员变量需要被置为null 时仍然指向其他对象,
讲白了泄露就是 对象处于无用可达的状态,无法被gc回收。
你写了一个单例,引用了某个activity的context,这个activity已经destroy了(无用),但是单例是static它的生命周期是application的生命周期没被回收,于是这个activity仍旧被单例引用(可达),最终gc无法回收context,gg,泄露。
这一篇是个大杂烩,讲了强弱软需引用,讲了内存老年代,先这样看着先。
http://blog.csdn.net/zhangerqing/article/details/8214365
3.对象之间的关系有哪些?
这里会涉及到 extends,implement,接口,抽象类,内部类,不可变类的概念及区别的问题。
回答这种题,正好复习UML图,结合UML图理解对象与对象之间的关系
https://blog.csdn.net/xiehuimx/article/details/53427452
接口和抽象类的区别/作用?
https://www.cnblogs.com/dolphin0520/p/3811437.html
各种内部类的概念/区别/作用?
https://blog.csdn.net/u010248330/article/details/52292214
Java内部类详解
https://www.jianshu.com/p/a20cac9e94ac
怎样获取Java匿名内部类持有的外部类对象
https://www.jianshu.com/p/9335c15c43cf
static关键字作用
http://cmsblogs.com/?p=61
从而进一步解释了enum为什么占内存
http://www.open-open.com/lib/view/open1462022872314.html
(static也是classLoader机制的一个重要组成,解释了为什么饿汉,enum线程安全)
不变类和可变类的概念
http://www.blogjava.net/hilor/articles/150610.html
讲了==和equals(还可以引申hashCode三者的区别)
final关键字的作用/意义http://cmsblogs.com/?p=80
其中最典型就是string为什么要设计成不可变类
http://cmsblogs.com/?p=863
以上链接有个题目,总结一下
String a = "fei";
String b = a + new String("ji");
可能创建几个string对象?
最多的情况,字符串常量池里啥都没有,所以新池里创建 fei,ji,feiji3个对象,然后加上堆内存new String("ji")共四个。
如果池里有fei,ji,feiji,则只有new String("ji")一个被创建,因为new一定要分配一个新的堆内存。
new String("ji")对象,里面的value指向了字符串常量池的ji
a和b实际上只是一个引用,并不是对象。
所以最少1个,最多4个
进一步会涉及到反射
把栈,堆,编译期,运行期了解一下
https://blog.csdn.net/wtxwd/article/details/52703640
反射的一些题目参考
https://www.jianshu.com/p/bc942e5c0399
再涉及到反射及反射的底层原理
http://blog.csdn.net/u012235132/article/details/45697307
序列化/反序列化的原理/意义/底层实现
http://blog.sina.com.cn/s/blog_4e345ce70100rt86.html
及其使用
http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html
java对象的序列化与反序列化
https://mp.weixin.qq.com/s/QS9e_lVxr5vuphql5O3xhA
进一步设计到transient关键字
http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html
https://mp.weixin.qq.com/s/gRJarDyo8M9wZjHnAbQyDQ
注解
https://www.jianshu.com/p/948549b92e0a
https://blog.csdn.net/briblue/article/details/73824058
java内存管理/优化的学习是一个系列,参考
https://www.jianshu.com/p/5cbdb3d3d924
Android相关
整理了一份framework学习脑图
https://www.jianshu.com/p/1a333fa8e42d
view绘制
Android绘图技术详解,带你轻松绘出各种图形
http://blog.csdn.net/scott2017/article/details/51564308
自定义View
http://blog.csdn.net/huachao1001/article/details/51577291
http://blog.csdn.net/E_mKs/article/details/72951866
Android学习系列(40)--Android主题和样式之系统篇
http://www.cnblogs.com/qianxudetianxia/p/3996020.html
Android阴影颜色样式
https://www.aliyun.com/jiaocheng/3833.html
Android学好Shape不再依赖美工
http://blog.csdn.net/lovexjyong/article/details/22292753
ImageView的属性android:scaleType
http://www.cnblogs.com/yejiurui/archive/2013/02/25/2931767.html
animation动画--不过我建议用airBnb的开源库Lottie
http://www.360doc.com/content/13/0102/22/6541311_257754535.shtml
写给Android App开发人员看的Android底层知识http://www.cnblogs.com/Jax/p/6864103.html
dalvik虚拟机启动及运行原理的研究
https://mp.weixin.qq.com/s/v9goze52Z2XkrMxC7zL39w
Monkey测试简介
http://www.cnblogs.com/bixiaopeng/articles/2149904.html
android数据库的简单Demo(原生版+Google版)
https://www.jianshu.com/p/b5ff80941fab
android中的文件操作详解以及内部存储和外部存储
http://blog.csdn.net/androidwifi/article/details/17725989/
安卓基础之数据存储
http://blog.csdn.net/faith_boys/article/category/1416943
利用URLConnection来发送POST和GET请求
http://blog.csdn.net/iijse/article/details/6201101
IO 流涉及的设计模式相关面试题解析
https://mp.weixin.qq.com/s/-O0EyGzOZJU2vGz2Hxs-Ag
网络
单独整理到
《Android 网络学习索引》
https://www.jianshu.com/p/2100897f6670
数据库
ER图,数据库的基础题,常问的就是 学生选课系统的数据库,
结合看ER图 http://blog.csdn.net/shuxiao9058/article/details/7525447
第一范式第二范式第三范式是什么?https://www.zhihu.com/question/24696366
如何创建索引,优缺点http://www.aspku.com/database/mysql/179603.html
设计模式
23种设计模式,分4章,按顺序看吧http://blog.csdn.net/zhangerqing/article/details/8194653
设计模式选择的方式
http://www.lightskystreet.com/2016/11/23/design-summary/
MVP架构开发,一篇让你从看懂到会使用https://mp.weixin.qq.com/s/y4bYrYP59jTem9h2RYSS9g
你真的理解了MVC, MVP, MVVM吗?
https://mp.weixin.qq.com/s/apNpcWsB4ujiuqbIdsF-jg
Android MVC,MVP,MVVM模式入门——重构登陆注册功能http://www.cnblogs.com/Liang-Blog/p/5801414.html
算法相关
Android程序员面试会遇到的算法 part 1
https://mp.weixin.qq.com/s/msj314u5U2v5477cgkzojg
Android程序员面试会遇到的算法 part 2
https://mp.weixin.qq.com/s/d03jcMWY0zjxtw4KLmCxrw
排序算法有哪些?说说堆排序的实现原理,并推导他的时间复杂度。
二叉树相关,先序后序中序遍历。
二叉树的广度遍历,深度遍历点击打开链接
伪代码实现点击打开链接
java图结构点击打开链接,图的广度优先、深度优先遍历点击打开链接
大根堆小根堆
一亿个数找最大一万个
消费者问题 点击打开链接
几个小算法题,可以练手点击打开链接