本文目录
做JAVA开发,要会什么技术
java基础
- Java常用的类,String、集合、IO等相关的使用及理解
多线程的理解使用场景
String,StringBuilder,StringBuffer的区别
HashMap、Hashtable、ConcurrentHashMap的原理与区别
ThreadLocal的理解应用场景
抽象类和接口
LinkList和ArrayList的区别
重写与重载
反射的理解及应用
Java内存模型、内存管理、堆和栈、垃圾回收
sql常用语法、索引,sql优化
java常用关键字如static、final用法作用
web开发理解servlet的原理及生命周期
jsp之九大内置对象与四大域对象等等
开发框架
Spring:
- AOP(面向切面编程)的原理
- AOP的使用场景
- IOC(控制反转)的原理
- Spring框架中的单例bean是线程安全的吗?
- 常用的注解
- 用到的设计模式
- Spring的优点(解耦、很多主流框架的集成 低侵入式设计,代码的污染极低 等等)
- SpringBean的作用域
- 事务机制
- Spring的核心类,及作用 如BeanFactory、ApplicationContext、BeanWrapper
- Spring支持的ORM?
- BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
- 依赖注入的方式有几种:接口注入、Setter注入、构造方法注入
SpringMVC:
- 什么是Spring MVC ?简单介绍下你对springMVC的理解?
- SpringMVC的流程?
- Springmvc的优点
- SpringMVC和struts2的区别有哪些?
- 如何解决POST请求中文乱码问题,GET的又如何处理呢?
Mybatis:
- 什么是mybatis?
- MyBatis与Hibernate有哪些不同?
- Mybait的优缺点
- 常见的标签
- 分页及常用的分页插件
- #{}和${}的区别是什么?
- 一对一、一对多的关联查询 ?
- Mybatis的一级、二级缓存:
- Mybatis比IBatis比较大的几个改进是什么?
- IBatis和MyBatis在核心处理类分别叫什么?
- IBatis和MyBatis在细节上的不同有哪些?
- 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
- MyBatis与Hibernate有哪些不同?
- 什么是SpringBoot
- SpringBoot的优点
- 常用的starter有哪些
- Spring Boot 的配置文件有哪几种格式?它们有什么区别?
- Spring Boot 的核心注解是哪个?常用的注解?常用的starter
- Spring Boot 需要独立的容器运行吗?( 可以不需要,内置了 Tomcat/ Jetty 等容器。)
- 运行 Spring Boot 有哪几种方式?
- SpringBoot与SpringCloud的关系
- SpringCloud的各类组件的理解及使用
Hibernate:
- Hibernate工作原理
- Hibernate是如何延迟加载(懒加载)?
- 缓存机制(一级缓存、二级缓存)
- Hibernate的查询方式有几种
- Hibernate中save、persist和saveOrUpdate这三个方法的不同之处?
- get()与load()的区别
- Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?
消息MQ:Kafka、RabbitMQ
版本控制工具:SVN、Git
项目管理工具:Maven、Gradle
Nginx使用,常见的liunx命令等等
总之,学无止境,坚持就是胜利
什么样的业务场景适合用多线程,请举例
首先了解下什么是多线程吧!多线程就是“人海战术”,伴随着摩尔定律的失效(单核心的计算能力不能再成倍的增长,而改为横向扩展),CPU变为了多核心的模式,而每一个CPU在同一时间能处理一个线程,也就是说同一时间线程的执行数可以为CPU核心数(超线程不讨论)!效率为以前单核心的N倍!
JAVA这门编程语言,可谓是让多线程技术变得老生常谈,那么多线程使用在什么地方呢?
1,web服务器:web服务器的请求数往往是非常大的,而且自从有了HTTP1.1之后,TCP默认是长连接模式,一般像tomcat这样的服务器会开多个线程保持与客户端的连接,所以需要多线程!
2,异步调用:比如电商平台,在主线程处理完订单等主业务之后,需要发短信,邮件等非主要的业务代码,这个时候可以新起一个线程,异步调用,而主线程可以直接返回,避免长时间的等待!
3,上传下载大文件处理:比如迅雷,如果是单线程,那么同一时候,它就只能写一个下载任务的数据,但是多线程就可以同时进行更多任务!
4,分布式计算:比如1+2+...+100000,你可以分为十个任务,然后汇总即可,比单线程可以省大约9/10的时间!
还有更多场景可以适用于多线程环境,具体问题具体分析!
但是多线程其实绝对是魔鬼,从jdk中的并发包就可见端倪,不管是synchronize,lock,threadlocal,线程池,countbatchdown,forkjoin,future,callable,valatile哪一个多线程的关键字,都可以让我们JAVA编程人员生不如死!
只能说不到万不得已,不要盲目的使用多线程,比如redis就能靠着单线程一枝独秀,linux之父Linus Tonvard说过:忘掉那该死的并发吧!可见这个多线程多么的不可取,只是如果我们JAVA程序员如果不会多线程,应该就失业了吧!
反正不管多线程有多痛苦,以后我还是会发多线程的技术分享的,敬请关注!
java开发2年,后面该如何提升自己
由于Java语言有广泛的应用场景,所以目前整个IT领域有大量的Java程序员,对于这些程序员来说,要想在开发的道路上走得更远就一定要不断提升自己的研发能力,同时不断丰富自己的知识结构。
对于具有两年开发经验的Java程序员来说,要想提升自己可以通过以下几个途径:
第一:丰富Java知识结构。Java语言由于具有广泛的应用场景,所以可以通过岗位任务来不断拓展自身的知识结构,从而具备Java全栈开发能力。从移动端(前端)到服务端再到大数据,Java语言都有对应的解决方案,而掌握这些知识结构会明显提升自身的岗位竞争力。
第二:紧跟技术发展趋势。IT行业的技术更新速度是比较快的,目前是大数据时代,与大数据关系密切的技术包括云计算、物联网、人工智能等内容都应该系统的了解一下。如果平时工作中不能接触到这些内容,那么就需要通过自主学习来完成对这些技术的掌握。另外,可以在日常的开发任务中使用一些新的技术,从而积累一定的应用经验。
第三:走研发级路线。相对于应用级程序员来说,研发级程序员的职业生命周期往往要长很多,同时成长空间也比较大,所以走研发级路线是Java程序员一个不错的选择。研发级程序员往往对于基础学科有较高的要求,尤其是数学基础,同时要具备一定的创新能力和掌握有效的研发方法,所以目前不少研发级程序员都具有研究生以上学历。因此,通过读研来完成岗位升级是不少程序员的选择,但是读研一定要趁早,越早越好。
对于大量的应用级程序员来说,在工作中积累一定的行业知识也是非常重要的,因为未来可以通过积累的行业知识和解决方案从事行业资讯工作,行业资讯专家在未来产业互联网时代将有广阔的发展空间。
我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。
如果有互联网方面的问题,也可以咨询我,谢谢!
如何去理解ThreadLocal
ThreadLocal是什么?
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景.
ThreadLocal特点:就是在一个线程里放一个数据,不管中间执行了什么操作。只要想获取出来的时候,调用get就可以得到保存进去的数据.
ThreadLocal内部结构图
从上面的结构图中,我们可以看到ThreadLocal的核心机制
- 每个Thread 内部都有一个Map。
- Map里面存储线程本地对象(key) 和线程的变量副本(value)。
- Thread 内部的Map是由 ThreadLocal为的,由ThreadLocal负责向map获取和设置线程的变量值。
Thread线程内部的Map在类中描述如下:
ThreadLocal 为什么会内存泄漏
我们先分析一下ThreadLocalMap
我们可以知道每个Thread 维护一个 ThreadLocalMap,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object,也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value。仔细观察ThreadLocalMap,这个map是使用 ThreadLocal 的弱引用作为 Key 的,弱引用的对象在 GC 时会被回收。
这样,当把threadlocal变量置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收。这样一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -》 Thread -》 ThreaLocalMap -》 Entry -》 value,而这块value永远不会被访问到了,所以存在着内存泄露。
其实java 开发者,也考虑到了此问题,所以在get(),set()的时候,调用了expungeStaleEntry方法用来清除Entry中Key为null的Value,但是这是不及时的,也不是每次都会执行的,所以一些情况下还是会发生内存泄露。只有remove()方法中显式调用了expungeStaleEntry方法。
下面看下ThreadLocal 的get()方法的实现:
下面继续看 map.getEntry方法
当key 为null 时,调用getEntryAfterMiss方法
当key 为null 时,调用expungeStaleEntry 方法
也许有人会好奇,有上面方法,为什么还会导致内存泄漏呢?
- 一般我们设置的ThreadLocal设置为static的,static 变量可以作为GCRoot的根节点,所以会一直存在
- 初始化了ThreadLocal, 调用set ,get 而没有调用remove方法,所以会导致内存泄漏。
比如get方法,只有ThreadLocalMap中没有所需要的key时,才会调用清除方法
Java后端和Java web面试时如何展示自己非技术方面的能力
多看看基础知识点,多问自己几个为什么;只把基础掌握扎实,什么面试都不怕!!!
还记得,上大学那会儿,那时 Java 并没有现如今这么火。在网上,学 Java 一般会被 C++ 鄙视,因为他们学习 C++的小伙伴会有天生的优越感,认为 Java 不用自己管理内存,什么事情都不用你亲自管,JVM 都帮你搞定,“笨蛋”都能学会!而我当时就是哪些“笨蛋”中的一员,那个时候,就在心理默默问自己:Java 真的有那么简单吗?这么多年过去了,自己对 Java 的认识也越来越深刻,工作中接触过很多编程语言,包括很老的 Delphi ,以及最新的 Go ,在这么多的编程语言中,我还是独爱着 Java ,也认识到任何一门语言都并非你想象的那么简单!
在我的圈子里,常有小伙伴问,为什么本来自己懂的知识点,却面试的时候回答不出来?我给的答案是,你问一下自己是否真的懂了?你回答不出来,说明你真的没有理解透彻某个知识点,在大型互联网公司技术面试中,面试官都会从一个小的知识点作为切入点,来不断进行深挖,从而来得知你整个知识体系的深度与广度。
下面给大家分享一些我们的原创精品面试题分析文章,希望对你的面试与工作起到抛砖引玉的作用。
Java基础
- Java 8系列之瞎说开发语言
- Java8系列之 Lambda表达式(一)
- Java 8系列之Lambda实践步骤(二)
- Java 8系列之 Lambda的函数式接口(三)
- Spring AOP之初探黄龙
- Spring AOP之我若为王
待续中...
面试题列表
- 面试题1解析 你真的理解Java异常吗?
- 面试题2解析 揭开“finally”的神秘面纱
- 面试题3解析 来,一起了解一下Java中常见字符串区别!!!
- 面试题4解析 深度探秘String类
- 面试题5解析 你真的懂了Java的那些修饰词吗?
- 面试题6解析 这就是String常量池啊?
- 面试题7解析 细谈javac编译器
- 面试题8解析 JVM到底怎么进行类加载器的呢?
- 面试题9解析 线程到底是怎么回事
- 面试题10解析 怎么唤醒线程呢,你真的会用吗?
- 面试题11解析 线程和进程到底怎么区分?
- 面试题12解析-多线程之间的协调示例
- 面试题13解析-CAS与ABA
- 面试题14解析-ThreadLocal原理、应用场景及内存泄漏
- 面试题15-守护线程
- 面试16解析-深挖锁(上)
- 面试题16解析-深挖锁(下)
- 深挖锁(补充篇)
- 面试17解析-死锁
- 面试题18解析-同步容器
- 面试题19解析-线程池(上)
- 面试题19解析-线程池(下)
- 面试题20解析-Executor框架(上)
- 面试题20解析-Executor框架(下)
- 面试题21解析-浏览器背后的秘密
- 面试题22解析-CDN分析
- Java Socket与TCP/IP协议栈
- 面试题24解析-详谈DNS域名解析过程
- 以Java的视角来聊聊BIO、NIO与AIO的区别?
待续中...
面试经验分享
这是咱们圈子里面试成功的小伙伴分享的面试经历,也许对你有帮助。
- 成都的互联网大厂,你知道几个?
- 圈内小伙伴美团点评校招面试经验分享
- 圈内小伙伴(非科班)的秋招面试经历分享
- 圈内小伙伴百度(实习)面试经历分享
待续中...
安全防御
作为一个开发人员应该懂得的安全知识,希望能够帮助你在工作中写出更健壮的代码。
- Google应该这样玩,你知道这些技巧吗?
- “暗网”背后的秘密
- 以Java的视角来聊聊SQL注入
- 你的 Java web 配置安全吗?
- 站在Java的视角,深度分析防不胜防的小偷——“XSS”
- 一起来学习用JNI加固你的Java代码,文末有彩蛋哦
待续中...
忠言逆耳:重视基础;重视基础;重视基础;重要的话说三遍。学技术不是为了炫技,而是实实在在的解决问题。