Java学习索引

转载请注明出处,转载时请不要抹去原始链接,
我把我找到的资料,个人认为写得比较靠谱的贴出来,
基本上均为原文链接,如侵立删。

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

http://cmsblogs.com/?p=94


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

http://cmsblogs.com/?p=155

arrayList
http://wiki.jikexueyuan.com/project/java-collection/arraylist.html

http://cmsblogs.com/?p=108

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 源码

漫画:什么是HashMap?

漫画:高并发下的HashMap

图解HashMap(一)

图解HashMap(二)

*linkedHashMap
搞懂 Java LinkedHashMap 源码

concurrentHashMap
点击打开链接

漫画:什么是ConcurrentHashMap

图解ConcurrentHashMap

concurrentHashMap的扩容是个细节
concurrentHashMap的扩容,是
第一个执行的线程会首先设置sizeCtl属性为一个负值,然后执行transfer(tab,null),其他晚进来的线程会检查当前扩容是否已经完成,没完成则帮助其进行扩容,完成了则直接退出。

该ConcurrentHashMap的扩容操作可以允许多个线程并发进行,那么就要处理好任务的分配工作。每个线程获取一部分桶的迁移任务,如果当前线程的任务完成,查看是否还有未迁移的桶,若有则继续领取任务执行,若没有则退出。在退出时需要检查是否还有其他线程在参与迁移工作,如果有则自己什么也不做直接退出,如果没有了则执行最后的收尾工作。

几个策略

1。感知策略 sizeCtrl ,低16位存着 当前参与扩容的线程数+1,高16位存的是数组扩容前的容量信息。

有线程进来就 CAS ,sizeCtl+1,完成了就CAS -1

2.判断策略,有三个判断,判断是否需要加入线程来帮忙扩容。

  1. 处理策略,有点复杂,桶里的第一个元素为 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/
其中举了两个例子,

obj2变成了无用不可达,没什么用处,且没有引用

当内存紧张的时候,就进行回收(这里可以拓展内存新生代,老年代,GC的知识,后续会讲)

而另一个例子


o指向的那个对象没有被回收

代码本意可能是 用完了对象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图结构点击打开链接,图的广度优先、深度优先遍历点击打开链接

大根堆小根堆

一亿个数找最大一万个

消费者问题 点击打开链接

几个小算法题,可以练手点击打开链接

单链表反转点击打开链接,判断是否为对称链表点击打开链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容