精华内容
下载资源
问答
  • java后端实例

    2018-07-23 15:28:02
    java后端实例java后端实例java后端实例java后端实例
  • Java后端开发框架

    万次阅读 多人点赞 2019-09-09 15:31:22
    Java web开发框架了解 ...后端–对外提供(类)RESTful风格的API—数据库交互-- web应用服务器(tomcat)-- Spring 技术栈开发 交互–HTTP协议通信-- JSON格式–RESTful 风格 java web开发框架的变迁 ...

    Java web开发框架了解

    web开发

    • 前端–页面的设计、路由、展示—静态资源(HTML、CSS、JS)–web服务器(nginx)-- Vue 技术栈开发

    • 后端–对外提供(类)RESTful风格的API—数据库交互-- web应用服务器(tomcat)-- Spring 技术栈开发

    • 交互–HTTP协议通信-- JSON格式–RESTful 风格

    java web开发框架的变迁

    1. SSH ——Struts、Spring、Hibernate
    2. Spring +SpringMVC + Hibernate/ibatis
    3. SSM —— Spring+SpringMVC+Mybatis—— 主流
    4. Springboot+Mybatis——兴起
    5. 微服务框架——springboot+dubbo、springcloud—— 前沿

    后端服务器的主要功能

    接收外界的API请求,解析后去执行数据库操作,最后将数据包装好返回给调用者(当然,中间还包含其他业务逻辑)

    和数据操作有关的

    这类框架一般负责和数据库进行连接,负责SQL的处理,以及将查询到的数据映射成指定的java对象。

    1. mybatis:易学,SQL手动编写,移植性差,支持动态SQL,数据量大、高并发、表关联复杂度高、要求对数据库可控性好可深度调优的项目,半智能效率快些

    2. hibernate:难学,SQL封装好,移植性好,不支持动态SQL,中小企业变化不多的项目,全智能效率慢

    和API请求响应有关的

    这类框架一般负责根据不同的API请求来调用程序中不同的处理方法,负责将调用者传入的数据映射成java对象,也负责处理程序返回给客户端的响应数据格式等。

    1. struts2: 类级别的拦截,每次发一次请求都会实例一个action,每个action都会被注入属性。
    2. springmvc: 方法级别的拦截,是单例的,一个方法对应一个request上下文,而方法同时又跟一个url对应,性能好开发效率高零配置。

    和业务逻辑有关的

    这类框架主要用到了两个特性,以此来简化程序的复杂性:控制反转(IOC)和依赖注入(DI)。在程序中结合这类框架,写出来的程序具有更好的维护性扩展性,也更加清晰简洁。

    1. spring: 非侵入性的方式,以一种完全外部化的方式来对待对象依赖关系。在 Spring 里,你可以使用 XML、SpringJavaConfig 或者 Groovy-Spring DSL 来连接对象依赖关系,也可以使用其它的方案。一站式解决方案,能够解决绝大部分框架类问题。
    2. guice:代码将和容器紧密耦合在一起。

    常用的框架

    • 数据层:mybatis
    • API层:spring mvc
    • 业务层:spring
    • 外加重要的:spring boot——进一步简化基于 spring 框架的项目的构建工具

    web后端开发框架

    企业最常用

    1. Spring:是 Java 后端框架家族里面最强大的一个框架,其拥有 IOC(控制反转) 和 AOP(面向切面) 两大利器,大大简化了软件开发复杂性。并且,Spring 现在能与所有主流开发框架集成,可谓是一个万能框架,Spring 让 JAVA 开发变得更多简单。
    2. SpringMVC:API层,处理|响应请求,获取表单参数,表单校验等。HTTP协议中的请求/响应特性,在该框架中,用户的每一个请求都声明了一个需要执行的动作。而这主要是通过将每个请求URI映射到一个可执行的方法来实现。同时,也将请求参数映射到对应方法的参数。
    3. SpringBoot:Spring 组件一站式解决方案,简化使用 Spring 框架的难度,简省繁重的配置。
    4. SpringCloud:微服务框架首选,它利用Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等
    5. Mybatis:一种轻量级的对象关系映射持久层(ORM)框架,数据层,数据库相关,连接、处理、映射。
    6. Swagger-UI:前后端协作的利器,解析代码里的注解生成JSON文件,通过Swagger UI生成网页版的接口文档,可以在上面做简单的接口调试 。
    7. ApachePOI:POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    关系型数据库

    1. MySQL:中小型数据库
    2. Oracle:大型数据库,大并发,大访问量

    NoSQL

    1. Redis:内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,配合关系型数据库做高速缓存,一个key-value型的数据库,解决应用服务器的cpu和内存压力、减少io的读操作、减轻io的压力,适用于数据高并发的读写、海量数据的读写、对扩展性要求高的数据等场景。
    2. MongoDB:更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。

    消息中间件

    解决分布式系统之间消息的传递,异步处理(放入消息队列,提高吞吐量)、应用解耦(写入-订阅)、流量削峰(秒数或者团抢活动),大型电子商务类网站消除高并发访问高峰,加快网站的响应速度

    1. ActiveMQ:中小型公司,万级,非常成熟,功能强大,在早些年业内大量的公司以及项目中都有应用,主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用。
    2. RabbitMQ:万级,延时很低,是erlang语言本身带来的问题。很难读源码,很难定制和掌控。
    3. RocketMQ:大型公司,十万级,阿里,接口简单易用,可以做到大规模吞吐,性能也非常好,分布式扩展也很方便,社区维护还可以,可靠性和可用性都是ok的,还可以支撑大规模的topic数量,支持复杂MQ业务场景。
    4. Kafka:十万级,大数据领域的实时计算、日志采集,超高的吞吐量,ms级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。

    SOA(面向服务)相关

    系统集成—有序,系统的服务化—复用,业务的服务化—高效

    1. SpringCloud.Dubbo:阿里,分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案。RPC 指的是远程调用协议,也就是说两个服务器交互数据。透明化的远程方法调用,像调用本地方法一样调用远程方法,配置简单,无API侵入;软负载均衡以及容错机制,可在内网替代F5等硬件负载均衡器,降低成本;服务的自动注册与发现,不需要写死服务提供方的地址,注册中心基于接口名查询服务提供着的IP地址,并且可以平滑的添加或者删除服务提供者;采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需要Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

    2. Zookeeper: 分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。zookeeper=文件系统+监听通知机制,客户端注册监听它关心的文件目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

      假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到zookeeper 的通知,然后从zookeeper 获取新的配置信息应用到系统中。

    搜索相关

    全文搜索搜索引擎,计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

    1. Elasticsearch: 一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。分布式、多租户、某些节点出现故障时会自动分配其他节点代替其进行工作、接近实时的搜索。自身带有分布式协调管理功能、仅支持json文件格式、在处理实时搜索应用时效率明显高于Solr、适用于新兴的实时搜索应用。
    2. Solr: 基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面。成熟、稳定;不考虑建索引的同时进行搜索,速度更快;建立索引时,搜索效率下降,实时索引搜索效率不高。用 Zookeeper 进行分布式管理、支持更多格式的数据、传统的搜索应用中表现好于 Elasticsearch、传统搜索应用的有力解决方案。互联网巨头,如Netflix,eBay,Instagram和亚马逊(CloudSearch)都使用Solr,因为它能够索引和搜索多个站点。
    3. Lucene:一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。一个Java全文搜索引擎,完全用Java编写。Lucene不是一个完整的应用程序,而是一个代码库和API,可以很容易地用于向应用程序添加搜索功能。

    通讯相关

    1. Netty: 异步高性能的通信框架,往往作为基础通信组件被 RPC 框架使用。典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。大数据领域,经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,它的 Netty Service 基于 Netty 框架二次封装实现。

    文件存储

    1. FastDFS: 一个轻量级分布式文件系统,对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)。

    项目构建类

    1. Maven:主要功能主要分为5点,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。

    1. Gradle:构建包括编译主代码、处理资源、编译测试代码、执行测试、上传归档等,基于灵活的任务模型,因此很多事情包括覆盖现有任务,跳过任务都非常易于实现。

    Gradle作为一款基于Groovy语言的构建工具,已经吸引众多的ant,maven使用者转投gradle的怀抱,和Gradle相比,ant显得冗余复杂,maven显得有些死板落后,而gradle基于DSL语法,特点明显:简洁、灵活、可读性强。Gradle和maven有很多相似点,gradle充分考虑到maven库的价值,在jar包管理上完全支持mavenRepository,很多属性乍眼一看就能反应过来maven中对应的是什么标签,大大降低maven到gradle的迁移难度,并在构建方面改善了很多maven的不足,,同时,gradle对比maven更好的面向ant用户,使用maven时,虽然能通过plugin来跑ant的命令,但是maven在任务实现主要靠的是插件以及自身的固定框架,Gradle在定义任务方面思想与ant非常相似,做了很好的集成。

    IDE

    1. IntellijIDEA: 更好的调试、更高的开发效率、更智能的重构、目录分层少而清。
    2. Ecplise: 最大化控制台、项目结构支持更强大、插件编写更容易、免费。
    展开全文
  • 一名Java开发工程师不仅要对Java语言及特性有深层次的理解而且需要掌握与Java相关的框架、生态及后端开发知识本文涉及多种后端开发需要掌握的技能对于帮助提高开发能力非常有帮助NO.1《Java工程师修炼之道》杭建 著...

    一名Java开发工程师

    不仅要对Java语言及特性有深层次的理解

    而且需要掌握与Java相关的

    框架、生态及后端开发知识

    本文涉及多种后端开发需要掌握的技能

    对于帮助提高开发能力非常有帮助

    NO.1《Java工程师修炼之道》

    杭建 著

    dc2663853ea8

    Java 开发一直是当前互联网领域最火热的开发技能之一,Java 工程师也一直是需求量非常大的开发职位。

    本书主要针对一名合格的Java 工程师的必备技能做了大纲性的总结和阐述。内容包括了工程化、常用开发框架、数据存储、数据传输、Java 编程高级知识、性能优化、安全技术等内容,基本涵盖了Java 工程师需要掌握的绝大部分技能点。

    本书可以看作一本Java 工程师的入职指南,也可以看作一本串联Java 后端技能点的参考手册。通过精心编排的内容,刚入门的Java 工程师能够体系化地学习相关开发技能,有经验的Java 工程师能够查漏补缺,巩固自己的相关开发技能,进一步完善自身的Java 技术体系。

    了解详情:京东、当当、亚马逊

    NO.2《揭秘Java虚拟机:JVM设计原理与实现》

    封亚飞 著

    dc2663853ea8

    Java是一门非常流行的程序语言,但是,Java程序到底是如何运行的?如何写出更高效的Java代码……?这些令人困扰的问题,都可以从本书中找到答案。

    本书从源码角度解读HotSpot的内部实现机制,主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型。通过直接对源代码的分析,从根本上梳理和澄清Java领域中的关键概念和机制。

    了解详情:京东、当当、亚马逊

    NO.3《轻量级Java EE企业应用实战(第5版)》

    李刚 编著

    dc2663853ea8

    本书介绍了Java EE领域的四个开源框架和技术:Struts 2、Spring、Hibernate和JPA。重点介绍了如何整合Struts 2.5+Spring 5.0+Hibernate 5.2进行Java EE开发。

    本书主要包括三部分。第一部介绍了Java EE开发的基础知识,以及如何搭建开发环境。第二部分详细讲解了Struts 2.5、Spring 5.0、Hibernate 5.2、JPA的用法。第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,希望让读者理论联系实际,将三个框架真正运用到实际开发中。

    了解详情:京东、当当、亚马逊

    NO.4《Spring+MyBatis企业应用实战(第2版)》

    疯狂软件 编著

    dc2663853ea8

    本书介绍了Java EE(现已改名为Jakarta EE)领域的两个开源框架:Spring的MVC和MyBatis。

    本书重点介绍如何整合Spring MVC 5+MyBatis 3.4.5进行Java EE开发。本书操作步骤详细,编程思路清晰,语言平实易懂。只要读者认真阅读本书,并掌握书中知识,那么就完全可以胜任企业中Spring MVC+MyBatis项目开发的要求。

    了解详情:京东、当当、亚马逊

    NO.5《亿级流量网站架构核心技术:跟开涛学搭建高可用高并发系统》

    张开涛 著

    dc2663853ea8

    本书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。多方面详细介绍了亿级流量网站的架构核心技术,让读者看后能快速运用到实践项目中。

    了解详情:京东、当当、亚马逊

    展开全文
  • 编程之JAVA后端开发与python后端开发的区别及类的方法技巧[图] 今天总算闲了一会,趁着这个闲暇来写篇文章。 今天我想以个人观点来简单说说Java后端开发和Python后端开发的区别。 Java&PythonBackEnd 公众号老粉...

    编程之JAVA后端开发与python后端开发的区别及类的方法技巧[图]
    今天总算闲了一会,趁着这个闲暇来写篇文章。
    今天我想以个人观点来简单说说Java后端开发和Python后端开发的区别。
    Java&PythonBackEnd
    公众号老粉可能知道公众号以前的名称是JAVAandPython君,后面才改名为Python进击者。
    为什么起这个名称?
    其实很简单,因为我在高中时自学编程学的就是Java,当时Python还没现在这么火。之后进入大学,帮老师做项目就偶然学了Python。
    回归正题

    编程之JAVA后端开发与python后端开发的区别及类的方法技巧[图]

    Java和Python开发后端的区别,从我个人最直观的感受就是
    1、简易度
    Python后端框架最火的就是Django和flask,我也写过这两个框架的系列文章,感兴趣的可以去看看。就拿flask来说:
    fromflaskimportFlask
    app=Flask(__name__)
    @app.route("/hello",methods=["GET"])
    defhello1():
    return"hello1"
    if__name__=='__main__':
    app.run(debug=True)
    我们只需要这几行代码就能够写出一个简单的接口。而且只需要一个文件即可。
    但是在springboot中(微服务框架),我们首先需要创建一个微服务项目,然后创建controller包,然后创建一个Controller,再编写接口。
    /**
    *@authorkuls
    *@Desckuls
    *@date2020/10/2617:00
    */
    @Controller
    publicclassDemoController{
    @GetMapping("/")
    publicStringdemo(){
    return"123";
    }
    }
    从文件目录来看,Java项目的文件也相对于flask的一个文件来说多了许多。
    从上面来看,Java的复杂度是高于Python的。但是我们不能称之为Java的劣势,因为复杂度越高也侧面说明了Java的可塑性会更大,这个我们后面也会说。
    2、项目架构
    了解Python或者Java中任一web框架并且都开发过的朋友,应该有个很明显的感受,就是感觉Java的项目架构更加的清晰明了,仿佛是一种行业内的规定。
    但是在Python中我们的项目架构更多的是自己去定义甚至可以不需要。
    springboot项目架构
    flask项目架构
    java.io.File类的一个方法,可以移动并重新命名文件
    对文件的操作,我们日常开发中经常会要处理的。今天我们来聊一个将文件剪切到其他位置,并修改文件名的方法。
    是要靠各种输入输出流来做处理吗?今天说的这个不需要操作输入输出流的。那是要用什么第三方的工具类,还是要自己封装一些功能吗?也不需要哦。不卖关子了,其实这个功能java.io.File类自己就提供了这样一个方法了。就是java.io.File类的renameTo方法了。这个方法是非静态方法,方法需要一个入参,一个File对象,用来描述移动后的文件对象。返回一个boolean值,表示移动是否成功。
    演示代码非常简单,看下面。

    演示代码就三行,第一行是依据目前已经存在的文件“D:\a\a.txt”实例化File对象。第二行才是关键代码,用我们要移动的File对象f调用“renameTo”方法,开学第一课2020观后感(https://www.yuananren.com/guanhougan/7119.html)入参是File对象f移动并重命名后的文件名。至于第三行,其实就只是输出一下移动是否成功的结果而已。上图是执行移动方法之前时,文件在文件夹中的情况。我们来执行一下,看看执行后,是不是能把“D:\a\a.txt”移动到“D:\a1”目录下,并命名为“b.txt”。


    移动成功了,并且进行了重命名。
    今天的内容比较简单,就是File的一个方法。就介绍到这里了。
    欢迎大家长按“点赞”按钮,来个三连支持我。

    展开全文
  • 各大公司Java后端开发面试题总结

    万次阅读 多人点赞 2017-03-01 11:31:11
    4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。 5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。 6.运行时常量池:代表运行时每个class文件中...

    ThreadLocal(线程变量副本)

    Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。

    采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

    ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。

    ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。

    Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。

    友情链接:深入研究java.lang.ThreadLocal类


    Java内存模型:

    Java虚拟机规范中将Java运行时数据分为六种。

    1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。

    2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。

    3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。

    4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。

    5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。

    6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。

    友情链接: Java中JVM虚拟机详解


    “你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”

    在什么时候:

    1.新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minor GC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。

    2.大对象以及长期存活的对象直接进入老年区。

    3.当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次Full GC以尽可能地获得老年区的空间。

    对什么东西:从GC Roots搜索不到,而且经过一次标记清理之后仍没有复活的对象。

    做什么:
    新生代:复制清理;
    老年代:标记-清除和标记-压缩算法;
    永久代:存放Java中的类和加载类的类加载器本身。

    GC Roots都有哪些:
    1. 虚拟机栈中的引用的对象
    2. 方法区中静态属性引用的对象,常量引用的对象
    3. 本地方法栈中JNI(即一般说的Native方法)引用的对象。

    友情链接:Java GC的那些事(上)

    友情链接:Java GC的那些事(下)

    友情链接:CMS垃圾收集器介绍


    Synchronized 与Lock都是可重入锁,同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁。

    Synchronized是悲观锁机制,独占锁。而Locks.ReentrantLock是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
    ReentrantLock适用场景

    1. 某个线程在等待一个锁的控制权的这段时间需要中断
    2. 需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程,锁可以绑定多个条件。
    3. 具有公平锁功能,每个到来的线程都将排队等候。

    友情链接: Synchronized关键字、Lock,并解释它们之间的区别


    StringBuffer是线程安全的,每次操作字符串,String会生成一个新的对象,而StringBuffer不会;StringBuilder是非线程安全的

    友情链接:String、StringBuffer与StringBuilder之间区别


    fail-fast:机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
    例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件


    happens-before:如果两个操作之间具有happens-before 关系,那么前一个操作的结果就会对后面一个操作可见。
    1.程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
    2.监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
    3.volatile变量规则:对一个volatile域的写,happens- before于任意后续对这个volatile域的读。
    4.传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。
    5.线程启动规则:Thread对象的start()方法happens- before于此线程的每一个动作。


    Volatile和Synchronized四个不同点:
    1 粒度不同,前者针对变量 ,后者锁对象和类
    2 syn阻塞,volatile线程不阻塞
    3 syn保证三大特性,volatile不保证原子性
    4 syn编译器优化,volatile不优化
    volatile具备两种特性:
    1. 保证此变量对所有线程的可见性,指一条线程修改了这个变量的值,新值对于其他线程来说是可见的,但并不是多线程安全的。
    2. 禁止指令重排序优化。
    Volatile如何保证内存可见性:
    1.当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。
    2.当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。

    同步:就是一个任务的完成需要依赖另外一个任务,只有等待被依赖的任务完成后,依赖任务才能完成。
    异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,只要自己任务完成了就算完成了,被依赖的任务是否完成会通知回来。(异步的特点就是通知)。
    打电话和发短信来比喻同步和异步操作。
    阻塞:CPU停下来等一个慢的操作完成以后,才会接着完成其他的工作。
    非阻塞:非阻塞就是在这个慢的执行时,CPU去做其他工作,等这个慢的完成后,CPU才会接着完成后续的操作。
    非阻塞会造成线程切换增加,增加CPU的使用时间能不能补偿系统的切换成本需要考虑。

    友情链接:Java并发编程之volatile关键字解析


    CAS(Compare And Swap) 无锁算法:
    CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

    友情链接:非阻塞同步算法与CAS(Compare and Swap)无锁算法


    线程池的作用:
    在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程
    第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
    第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
    第三:提高线程的可管理性。
    常用线程池:ExecutorService 是主要的实现类,其中常用的有
    Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()。

    友情链接:线程池原理

    友情链接:线程池原理解析


    类加载器工作机制:
    1.装载:将Java二进制代码导入jvm中,生成Class文件。
    2.连接:a)校验:检查载入Class文件数据的正确性 b)准备:给类的静态变量分配存储空间 c)解析:将符号引用转成直接引用
    3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。

    双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成
    用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。

    友情链接:深入理解Java虚拟机笔记—双亲委派模型

    友情链接:JVM类加载的那些事

    友情链接:JVM(1):Java 类的加载机制


    一致性哈希:

    Memcahed缓存:
    数据结构:key,value对
    使用方法:get,put等方法

    友情链接:hashcode(),equal()方法深入解析


    Redis数据结构: String—字符串(key-value 类型)
    Hash—字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值
    List—列表 实现消息队列
    Set—集合 利用唯一性
    Sorted Set—有序集合 可以进行排序
    可以实现数据持久化

    友情链接: Spring + Redis 实现数据的缓存


    java自动装箱拆箱深入剖析

    谈谈Java反射机制

    如何写一个不可变类?


    索引:B+,B-,全文索引
    Mysql的索引是一个数据结构,旨在使数据库高效的查找数据。
    常用的数据结构是B+Tree,每个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子节点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能。
    什么时候使用索引:
    1. 经常出现在group by,order by和distinc关键字后面的字段
    2. 经常与其他表进行连接的表,在连接字段上应该建立索引
    3. 经常出现在Where子句中的字段
    4. 经常出现用作查询选择的字段

    友情链接:MySQL:InnoDB存储引擎的B+树索引算法

    友情链接:MySQL索引背后的数据结构及算法原理


    Spring IOC (控制反转,依赖注入)

    Spring支持三种依赖注入方式,分别是属性(Setter方法)注入,构造注入和接口注入。

    在Spring中,那些组成应用的主体及由Spring IOC容器所管理的对象被称之为Bean。

    Spring的IOC容器通过反射的机制实例化Bean并建立Bean之间的依赖关系。
    简单地讲,Bean就是由Spring IOC容器初始化、装配及被管理的对象。
    获取Bean对象的过程,首先通过Resource加载配置文件并启动IOC容器,然后通过getBean方法获取bean对象,就可以调用他的方法。
    Spring Bean的作用域:
    Singleton:Spring IOC容器中只有一个共享的Bean实例,一般都是Singleton作用域。
    Prototype:每一个请求,会产生一个新的Bean实例。
    Request:每一次http请求会产生一个新的Bean实例。

    友情链接: Spring框架IOC容器和AOP解析

    友情链接:浅谈Spring框架注解的用法分析

    友情链接:关于Spring的69个面试问答——终极列表


    代理的共有优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。
    Java静态代理:
    代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,代理对象可以在调用目标对象相应方法前后加上其他业务处理逻辑。
    缺点:一个代理类只能代理一个业务类。如果业务类增加方法时,相应的代理类也要增加方法。
    Java动态代理:
    Java动态代理是写一个类实现InvocationHandler接口,重写Invoke方法,在Invoke方法可以进行增强处理的逻辑的编写,这个公共代理类在运行的时候才能明确自己要代理的对象,同时可以实现该被代理类的方法的实现,然后在实现类方法的时候可以进行增强处理。
    实际上:代理对象的方法 = 增强处理 + 被代理对象的方法

    JDK和CGLIB生成动态代理类的区别:
    JDK动态代理只能针对实现了接口的类生成代理(实例化一个类)。此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑
    CGLIB是针对类实现代理,主要是对指定的类生成一个子类(没有实例化一个类),覆盖其中的方法 。
    Spring AOP应用场景
    性能检测,访问控制,日志管理,事务等。
    默认的策略是如果目标类实现接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理


    SpringMVC运行原理
    1. 客户端请求提交到DispatcherServlet
    2. 由DispatcherServlet控制器查询HandlerMapping,找到并分发到指定的Controller中。
    4. Controller调用业务逻辑处理后,返回ModelAndView
    5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
    6. 视图负责将结果显示到客户端

    友情链接:Spring:基于注解的Spring MVC(上)

    友情链接: Spring:基于注解的Spring MVC(下)

    友情链接:SpringMVC与Struts2区别与比较总结

    友情链接:SpringMVC与Struts2的对比


    一个Http请求
    DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如javascript、css、图片等) –> 浏览器对页面进行渲染呈现给用户

    设计存储海量数据的存储系统:设计一个叫“中间层”的一个逻辑层,在这个层,将数据库的海量数据抓出来,做成缓存,运行在服务器的内存中,同理,当有新的数据到来,也先做成缓存,再想办法,持久化到数据库中,这是一个简单的思路。主要的步骤是负载均衡,将不同用户的请求分发到不同的处理节点上,然后先存入缓存,定时向主数据库更新数据。读写的过程采用类似乐观锁的机制,可以一直读(在写数据的时候也可以),但是每次读的时候会有个版本的标记,如果本次读的版本低于缓存的版本,会重新读数据,这样的情况并不多,可以忍受。

    友情链接: HTTP与HTTPS的区别

    友情链接: HTTPS 为什么更安全,先看这些

    友情链接: HTTP请求报文和HTTP响应报文

    友情链接: HTTP 请求方式: GET和POST的比较


    Session与Cookie:Cookie可以让服务端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些Cookie,如果Cookie很多,则无形的增加了客户端与服务端的数据传输量,
    而Session则很好地解决了这个问题,同一个客户端每次和服务端交互时,将数据存储通过Session到服务端,不需要每次都传回所有的Cookie值,而是传回一个ID,每个客户端第一次访问服务器生成的唯一的ID,客户端只要传回这个ID就行了,这个ID通常为NAME为JSESSIONID的一个Cookie。这样服务端就可以通过这个ID,来将存储到服务端的KV值取出了。
    Session和Cookie的超时问题,Cookie的安全问题


    分布式Session框架
    1. 配置服务器,Zookeeper集群管理服务器可以统一管理所有服务器的配置文件
    2. 共享这些Session存储在一个分布式缓存中,可以随时写入和读取,而且性能要很好,如Memcache,Tair。
    3. 封装一个类继承自HttpSession,将Session存入到这个类中然后再存入分布式缓存中
    4. 由于Cookie不能跨域访问,要实现Session同步,要同步SessionID写到不同域名下。


    适配器模式:将一个接口适配到另一个接口,Java I/O中InputStreamReader将Reader类适配到InputStream,从而实现了字节流到字符流的准换。
    装饰者模式:保持原来的接口,增强原来有的功能。
    FileInputStream 实现了InputStream的所有接口,BufferedInputStreams继承自FileInputStream是具体的装饰器实现者,将InputStream读取的内容保存在内存中,而提高读取的性能。


    Spring事务配置方法:
    1. 切点信息,用于定位实施事物切面的业务类方法
    2. 控制事务行为的事务属性,这些属性包括事物隔离级别,事务传播行为,超时时间,回滚规则。
    Spring通过aop/tx Schema 命名空间和@Transaction注解技术来进行声明式事物配置。


    Mybatis
    每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。首先用字节流通过Resource将配置文件读入,然后通过SqlSessionFactoryBuilder().build方法创建SqlSessionFactory,然后再通过SqlSessionFactory.openSession()方法创建一个SqlSession为每一个数据库事务服务。
    经历了Mybatis初始化 –>创建SqlSession –>运行SQL语句,返回结果三个过程


    Servlet和Filter的区别:
    整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

    Filter有如下几个用处:
    Filter可以进行对特定的url请求和相应做预处理和后处理。
    在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
    根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
    在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
    根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

    实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。

    Filter和Servlet的生命周期:
    1.Filter在web服务器启动时初始化
    2.如果某个Servlet配置了 1 ,该Servlet也是在Tomcat(Servlet容器)启动时初始化。
    3.如果Servlet没有配置1 ,该Servlet不会在Tomcat启动时初始化,而是在请求到来时初始化。
    4.每次请求, Request都会被初始化,响应请求后,请求被销毁。
    5.Servlet初始化后,将不会随着请求的结束而注销。
    6.关闭Tomcat时,Servlet、Filter依次被注销。


    HashMap与HashTable的区别。
    1、HashMap是非线程安全的,HashTable是线程安全的。
    2、HashMap的键和值都允许有null值存在,而HashTable则不行。
    3、因为线程安全的问题,HashMap效率比HashTable的要高。

    HashMap的实现机制:
    1. 维护一个每个元素是一个链表的数组,而且链表中的每个节点是一个Entry[]键值对的数据结构。
    2. 实现了数组+链表的特性,查找快,插入删除也快。
    3. 对于每个key,他对应的数组索引下标是 int i = hash(key.hashcode)&(len-1);
    4. 每个新加入的节点放在链表首,然后该新加入的节点指向原链表首

    HashMap和TreeMap区别

    友情链接: Java中HashMap和TreeMap的区别深入理解

    HashMap冲突

    友情链接: HashMap冲突的解决方法以及原理分析

    友情链接: HashMap的工作原理

    友情链接: HashMap和Hashtable的区别

    友情链接: 2种办法让HashMap线程安全


    HashMap,ConcurrentHashMap与LinkedHashMap的区别

    1. ConcurrentHashMap是使用了锁分段技术技术来保证线程安全的,锁分段技术:首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问
    2. ConcurrentHashMap 是在每个段(segment)中线程安全的
    3. LinkedHashMap维护一个双链表,可以将里面的数据按写入的顺序读出

    ConcurrentHashMap应用场景

    1:ConcurrentHashMap的应用场景是高并发,但是并不能保证线程安全,而同步的HashMap和HashMap的是锁住整个容器,而加锁之后ConcurrentHashMap不需要锁住整个容器,只需要锁住对应的Segment就好了,所以可以保证高并发同步访问,提升了效率。

    2:可以多线程写。
    ConcurrentHashMap把HashMap分成若干个Segmenet
    1.get时,不加锁,先定位到segment然后在找到头结点进行读取操作。而value是volatile变量,所以可以保证在竞争条件时保证读取最新的值,如果读到的value是null,则可能正在修改,那么就调用ReadValueUnderLock函数,加锁保证读到的数据是正确的。
    2.Put时会加锁,一律添加到hash链的头部。
    3.Remove时也会加锁,由于next是final类型不可改变,所以必须把删除的节点之前的节点都复制一遍。
    4.ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对Hash表的不同Segment进行的修改。

    ConcurrentHashMap的应用场景是高并发,但是并不能保证线程安全,而同步的HashMap和HashTable的是锁住整个容器,而加锁之后ConcurrentHashMap不需要锁住整个容器,只需要锁住对应的segment就好了,所以可以保证高并发同步访问,提升了效率。

    ConcurrentHashMap能够保证每一次调用都是原子操作,但是并不保证多次调用之间也是原子操作。

    友情链接:Java集合—ConcurrentHashMap原理分析


    Vector和ArrayList的区别

    友情链接:Java中Vector和ArrayList的区别


    ExecutorService service = Executors….
    ExecutorService service = new ThreadPoolExecutor()
    ExecutorService service = new ScheduledThreadPoolExecutor();

    ThreadPoolExecutor源码分析

    线程池本身的状态:

    这里写图片描述

    等待任务队列和工作集:

    这里写图片描述

    线程池的主要状态锁:

    这里写图片描述

    线程池的存活时间和大小:

    这里写图片描述

    1.2 ThreadPoolExecutor 的内部工作原理
    有了以上定义好的数据,下面来看看内部是如何实现的 。 Doug Lea 的整个思路总结起来就是 5 句话:
    1. 如果当前池大小 poolSize 小于 corePoolSize ,则创建新线程执行任务。
    2. 如果当前池大小 poolSize 大于 corePoolSize ,且等待队列未满,则进入等待队列
    3. 如果当前池大小 poolSize 大于 corePoolSize 且小于 maximumPoolSize ,且等待队列已满,则创建新线程执行任务。
    4. 如果当前池大小 poolSize 大于 corePoolSize 且大于 maximumPoolSize ,且等待队列已满,则调用拒绝策略来处理该任务。
    5. 线程池里的每个线程执行完任务后不会立刻退出,而是会去检查下等待队列里是否还有线程任务需要执行,如果在 keepAliveTime 里等不到新的任务了,那么线程就会退出。

    Executor包结构

    这里写图片描述

    这里写图片描述

    这里写图片描述

    CopyOnWriteArrayList : 写时加锁,当添加一个元素的时候,将原来的容器进行copy,复制出一个新的容器,然后在新的容器里面写,写完之后再将原容器的引用指向新的容器,而读的时候是读旧容器的数据,所以可以进行并发的读,但这是一种弱一致性的策略。
    使用场景:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。


    Linux常用命令:cd,cp,mv,rm,ps(进程),tar,cat(查看内容),chmod,vim,find,ls


    死锁的必要条件
    1. 互斥 至少有一个资源处于非共享状态
    2. 占有并等待
    3. 非抢占
    4. 循环等待
    解决死锁,第一个是死锁预防,就是不让上面的四个条件同时成立。二是,合理分配资源。
    三是使用银行家算法,如果该进程请求的资源操作系统剩余量可以满足,那么就分配。


    进程间的通信方式

    1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    2. 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    3. 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    4. 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    5. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    6. 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    7. 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    进程与线程的区别和联系

    操作系统的进程调度算法

    计算机系统的层次存储结构详解


    数据库事务是指作为单个逻辑工作单元执行的一系列操作。

    这里写图片描述

    友情链接:数据库事务的四大特性以及事务的隔离级别


    MySQL数据库优化总结

    MYSQL 优化常用方法

    MySQL存储引擎--MyISAM与InnoDB区别

    关于SQL数据库中的范式


    Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveOrUpdate()等方法 及调用查询接口list,filter,iterate时,如Session缓存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候缓存也会消失。

    Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置一级缓存采用的是key-value的Map方式来实现的,在缓存实体对象时,对象的主关键字ID是Map的key,实体对象就是对应的值。

    Hibernate二级缓存:把获得的所有数据对象根据ID放入到第二级缓存中。Hibernate二级缓存策略,是针对于ID查询的缓存策略,删除、更新、增加数据的时候,同时更新缓存。


    更新于2017/3/9

    Java I/O 总结

    JVM(8):JVM知识点总览-高级Java工程师面试必备

    细数JDK里的设计模式

    Java中创建对象的5种不同方法

    关于Java Collections的几个常见问题

    类在什么时候加载和初始化

    两个栈实现队列 两个队列实现栈


    更新于2017/3/12

    java collection.sort()根据时间排序list

    单点登录原理与简单实现


    更新于2017/3/13

    AQS详解

    Java的concurrent包

    Java 并发工具包 java.util.concurrent 用户指南


    更新于2017/6/12

    进程和线程的区别:

      进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。

      线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

      线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

      多进程是指操作系统能同时运行多个任务(程序)。

      多线程是指在同一程序中有多个顺序流在执行。

    在java中要想实现多线程,有三种手段,一种是继续Thread类,另外一种是实现Runable接口,还有就是实现Callable接口。


    Switch能否用string做参数?

    a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其对应的封装类以及 Enum 类型。在Java 7中,String 支持被加上了。


    Object有哪些公用方法?

    a.方法equals测试的是两个对象是否相等

    b.方法clone进行对象拷贝

    c.方法getClass返回和当前对象相关的Class对象

    d.方法notify,notifyall,wait都是用来对给定对象进行线程同步的


    Java的四种引用,强弱软虚,以及用到的场景

    a.利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。

    b.通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用。

    c.强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

    d.软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

    e.弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。

    f.虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。


    Hashcode的作用,与 equal 有什么区别?

    a.同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上。


    Override和Overload的含义以及区别

    a.Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。

    b.就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

    具体可前往C++中重载、重写(覆盖)的区别实例分析查看


    抽象类和接口的区别

    a.一个类只能继承单个类,但是可以实现多个接口

    b.抽象类中可以有构造方法,接口中不能有构造方法

    c.抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

    d.抽象类中可以包含静态方法,接口中不可以

    e.抽象类中可以有普通成员变量,接口中不可以


    解析XML的几种方式的原理与特点:DOM、SAX、PULL

    a.DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机

    b.SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

    c.PULL:与 SAX 类似,也是基于事件驱动,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。


    wait()和sleep()的区别

    sleep来自Thread类,和wait来自Object类

    调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

    sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

    sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒


    JAVA 中堆和栈的区别,说下java 的内存机制

    a.基本数据类型比变量和对象的引用都是在栈分配的

    b.堆内存用来存放由new创建的对象和数组

    c.类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

    d.实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

    e.局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放


    JAVA多态的实现原理

    a.抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    b.实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM 通过参数的自动转型来找到合适的办法。


    具体更多资源可前往Java后端面试总结


    各种Java面经资源

    面试的角度诠释Java工程师(一)

    面试的角度诠释Java工程师(二)

    Java面试参考指南(一)

    Java面试参考指南(二)

    阿里面试回来,想和Java程序员谈一谈

    面试心得与总结—BAT、网易、蘑菇街

    2017年小米春招内推面试面经

    历年阿里面试题汇总(2017年不断更新中)

    最近5年133个Java面试问题列表

    Java的常见误区与细节

    Java9都快发布了,Java8的十大新特性你了解多少呢?


    更多内容欢迎关注我的个人公众号

    这里写图片描述

    QQ学习交流群(内有干货):

    这里写图片描述

    展开全文
  • JAVA后端开发浅谈

    千次阅读 多人点赞 2020-02-28 16:00:40
    两个阵营的开发基本上都是各自围绕着各自的开发语言(php/Java),选取最为兼容合适的框架结构和数据库,然后进行服务器端的开发。以下附上PHP和Java语言的区别介绍和原文链接: 《php和java的区别有哪些》 php中文...
  • 秋招面经总结(Java后端开发

    千次阅读 多人点赞 2020-10-26 10:59:11
    Java基础 Java和C语言有什么区别?Java好在哪里? 怎么理解Java的跨平台性,一次编译到处运行? 面向对象和面向过程的区别? 如何理解面向对象三大特性:封装、继承、多态? 类继承会有什么问题吗,一般什么情况...
  • 2020Java后端开发面试题总结(春招+秋招+社招)

    万次阅读 多人点赞 2020-12-21 16:44:52
    今天给大家分享一些Java面试中频繁被问到的一些面试题吧,在写之前先给大家说一声:冬至快樂,大家一定记得吃饺子喔~ 文章目录 Java基础——基础知识 Java基础——集合框架/泛型/容器 Java基础——多线程 Java基础...
  • 快速入门 Java 后端开发的正确姿势

    千次阅读 2018-04-29 10:51:14
    开发工具先聊下 Java 后端开发工具吧,我推荐使用 IntelliJ IDEA,这是被公认为最好用的 Java 开发工具,熟悉 Android Studio 的 Android 开发人员对它应该不陌生,其强大的功能和特性可以说是完虐 Eclipse 和...
  • 如何看待 2022 年秋招 Java 后端开发岗一片红海?这不仅让我想起脉脉上的一段话——来自某文豪。 划重点: 有后选后,无后选前 无后无前,算法也甜 条件允许,无脑后端 前途无量,预定高管 这里的后,Java 后端敢称...
  • Java后端开发工作 - 写接口

    千次阅读 多人点赞 2020-04-15 16:52:22
    我在公司的工作内容是,对于一个BS应用,负责服务器端开发工作,Java语言。与前端开发人员合作,最终提供给前端RESTFUL接口,保证页面正常响应。 经验之谈 一个接口可以理解为一个业务逻辑,一个业务逻辑可以由1~...
  • 2.java中的基本数据类型有哪些说一下 3.讲一讲Threadlocal的原理是啥啊。因为只在spring实现高并发的时候看过,我就扯了半天spring和threadlocal 4.接口和抽象类有什么区别?balabala 然后面试官接着问 那都有了接口...
  • 职业向导 - Java后端开发

    千次阅读 2017-08-15 21:13:39
    主要是学习顺序 和 开发框架 和 相关书籍
  • Java后端开发常考面试题大全

    千次阅读 多人点赞 2020-09-04 11:37:25
    如HashTable和ConcurrentHashMap之间的区别和效率差异) java中常见的锁 (乐观锁悲观锁) synchronized和lock有什么区别 可重入锁和非可重入锁的区别 线程池的七个参数,线程池的好处 java中有哪些常用的线程池 jvm类...
  • 扫盲:Java 后端开发常用的 10 种第三方服务

    千次阅读 多人点赞 2020-09-11 14:19:08
    Java 后端开发通常会涉及到很多第三方服务,那么都有哪些成熟的方案可供直接上手使用呢? 1)IaaS IaaS 的英文全称是 Infrastructure as a Service,即基础设施服务,指把 IT 基础设施作为一种服务通过网络对外提供...
  • 2020Java后端开发面试 一、2020/11/05 公司: 1、初试(过了) 1)、笔试题 笔试题:给了5个SQL的查询语句的题(基本上都写出来,就是稍微有点问题,主要是SQL语句写的比较少,以后还需要加强) 2)、面试题 ...
  • 1、项目介绍:前段vue 采用脚手架进行开发(本人后端不太懂vue的原理什么路由什么的),后端java springmvc mybatis 采用跨域模式,所以前段axios请求方式都是“http://ip:端口号/项目名/接口“ 的形式进行交互。...
  • 1 自我介绍和项目 2 Java的内存分区 3 Java对象的回收方式,回收算法。 4 CMS和G1了解么,CMS解决什么问题,说一下回收的过程。 5 CMS回收停顿了几次,为什么要停顿两次。 6 Java栈什么时候会发生内存溢出,Java堆呢...
  • 当JSP第一次被请求时,Web服务器上的JSP容器(或称为JSP引擎)会将其转化为相应的Servlet,然后再编译为Servlet类文件,并且被装载和实例化。此后,每次对此JSP页面的请求均通过调用已实例化的Servlet类对象中的方法...
  • 这里推荐几个自己写的范例项目,主要采用SSM(Spring+SpringMVC+Mybatis)框架,分布式架构采用的是(dubbo+zookeeper)。范例项目的好处...
  • 由于个人发展规划,在当时就已经决定了转型干Java后端开发了,但是由于之前没有相关经验,当时好像一个没头苍蝇一样,胡乱买了几本书籍,准备学习Spring MVC,MyBatis的XML配置方式。 但是当时有个同事给我提了一句...
  • 涉及Java后端开发的注意事项。
  • Android请求获取Java后端数据,登录界面例子

    万次阅读 多人点赞 2017-09-28 16:01:06
    最近做了个Android请求获取Java后端数据的例子,简单实现了一下。 源代码下载:Android请求获取Java后端数据,登录界面例子 主要实现: 1、java后端 2、Android代码
  • JAVA后端代码整理

    千次阅读 2020-01-06 14:30:43
    JAVA后端代码整理-SE/EE SE 一.基本数据类型的隐式显式转换 1.从表示范围小的类型转换为表示范围大的类型,可以直接转换,称为隐式转换 byte b=1; int i=-2; i=b; i=c; 从表示范围大的类型转换为表示范围...
  • 2019java后端面试集合篇最值得收藏的(一)

    万次阅读 多人点赞 2018-10-31 11:06:13
    2019java后端面试集合篇最值得收藏的(一) 2019java后端面试集合篇最值得收藏的(二) 2019java后端面试集合篇最值得收藏的(三) 2019java后端面试集合篇最值得收藏的(四) 目录 介绍下dubbo和zookeeper: 5 dubbo+...
  • java后端学习流程

    千次阅读 多人点赞 2017-06-09 11:37:46
    java后端学习流程  首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解!  其中J2SE是...
  • Java后端工程师面试题

    千次阅读 2018-06-06 20:14:00
    Java工厂是在工厂中修改,在工厂中修改就要重修编译工厂类,重新编译的话就要先停了JVM再重新启动。 Spring IOC是热插拔的,在XML中直接修改,修改xmlspring就会立即发现你改动了XML,会再重新读一遍XML,就会发现新...
  • Java后端常见面试题总结

    千次阅读 2020-07-19 11:42:00
    * FileName: Java后端面试总结 * Author: Marlon * Email: gatesma@foxmail.com * Date: 2020/2/18 * Description: */ 文章目录面试总结(一)Java基础1. wait和sleep的区别2. synchronized底层原理 是可重入...
  • 前后端分离,前端vue+axios。后端Tomcat服务器,mysql数据库。采用SpringMVC模式。servlet中用post方式接受前端传递的json数据并返回。完整解决方案,附带前端小姐姐方案链接

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,527
精华内容 21,410
关键字:

java后端开发项目实例

java 订阅