java_javascript - CSDN
java 订阅
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1]  。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2]  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3]  。 展开全文
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1]  。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2]  。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3]  。
信息
外文名
Java
推出时间
1995年5月
现公司
Oracle
Java发展历程
20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。Sun公司为了抢占市场先机,在1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了一种称为Oak的面向对象语言。由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有什么大的区别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak的程序设计语言、类库和其硬件,以说服他们使用Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还一无所知的情况下,就生产硬件产品的风险实在太大了,所以Oak语言也就因为缺乏硬件的支持而无法进入市场,从而被搁置了下来。1994年6、7月间,在经历了一场历时三天的讨论之后,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克·诺顿写了一个小型万维网浏览器WebRunner。 [4]  1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet(Applet是一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为Java(在申请注册商标时,发现Oak已经被人使用了,再想了一系列名字之后,最终,使用了提议者在喝一杯Java咖啡时无意提到的Java词语)。5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和微软等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。 [5-6]  1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。10月,Sun公司发布了Java平台的第一个即时(JIT)编译器。1997年2月,JDK 1.1面世,在随后的3周时间里,达到了22万次的下载量。4月2日,Java One会议召开,参会者逾一万人,创当时全球同类会议规模之纪录。9月,Java Developer Connection社区成员超过10万。1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机 [7]  。2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发 布,几周后其获得了Apple公司Mac OS X的工业标准的支持。2001年9月24日,J2EE1.3发布。2002年2月26日,J2SE1.4发布。自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类和接口。在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的I/OAPI、正则表达式、日志与断言。2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0(内部版本号1.5.0),代号为“Tiger”,Tiger包含了从1996年发布1.0版本以来的最重大的更新,其中包括泛型支持、基本类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。 [8]  2006年11月13日,Java技术的发明者Sun公司宣布,将Java技术作为免费软件对外发布。Sun公司正式发布的有关Java平台标准版的第一批源代码,以及Java迷你版的可执行源代码。从2007年3月起,全世界所有的开发人员均可对Java源代码进行修改 [9]  。2009年,甲骨文公司宣布收购Sun [10]  。2010年,Java编程语言的共同创始人之一詹姆斯·高斯林从Oracle公司辞职。2011年,甲骨文公司举行了全球性的活动,以庆祝Java7的推出,随后Java7正式发布。2014年,甲骨文公司发布了Java8正式版 [11]  。
收起全文
  • java核心技术精讲

    2019-12-24 19:57:49
    本课程主要读者全面细致的讲解Java编程的所有核心知识,从基础语法、到面向对象以及Java的实际应用进行完整讲解。官方QQ群:612148723。
  • 这是Java学习指南系列课程的第1篇,介绍Java语言的入门语法,引领希望学习Java语言编程的初学者进入Java大门。 本课程不需要其他语言作为基础,可以直接学习。 课程从Java开发平台的下载和安装开始,从...
  • Java学习网站,有了这些,成为大牛不在话下

    经常有一些读者问我:“二哥,学习 Java 应该关注哪些网站?”,我之前的态度一直是上知乎、上搜索引擎搜一下不就知道了。但读者对我这个态度很不满意,他们说,“我在问你,又不是问知乎,问搜索引擎。”你还别说,读者说得有道理。

    于是我想,那就推荐一些吧。先说我心目中的前三名,但不局限于 Java 学习者。

    1)Google

    啥都不说了,说多了都是泪,可气的是 Robin 李的搜索引擎实在是不争气。说句良心话,Google 的搜索结果比前者的质量高出一百(零一)倍。

    我想,推荐 Google 的人不在少数,但 Google 不能直接访问啊。一年前,我通过种种努力找到了解决办法,问遍了所有群,遭受了无数的嘲讽。

    Google 也算是网站?必须算啊。只要你想要学习,它会给你所有。

    2)Stack Overflow

    Stack Overflow 可以说是解决问题的杀手锏。下面这些问题是不是都很常见?

    如果英语能力不太好的话,可以借助一下 Chrome 浏览器的自动翻译功能。

    3)GitHub

    GitHub 是一个拥有数十亿行代码的网站,每天有数百万开发者聚集在一起,研究开源软件中存在的问题。

    对于普通的程序员来说,如果不想重复造轮子,就必须要站在巨人的肩膀上,那么巨人是谁呢?就是 GitHub。那些牛逼的开源软件库,99% 的情况下会在 GitHub 上找到它。

    对于成功的程序员来说,如果想要被别人膜拜,最好能在 GitHub 上贡献一个开源库,如果星标超过 1W,那可是相当的牛逼,在业界应该算是响当当的人物。

    然后,我再推荐一些 Java 程序员必须要关注的网站。

    4)IBM Developer

    IBM developerWorks 提供了中文版,里面的文章都属于非常高质量的。

    5)Java SE 技术文档

    即使是 Java 编程的大牛 , 也离不开这份文档。中文版的 API 可以参照:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

    6)Java World

    这个网站包含了大量的 Java 教程 , 涉及各种各样的话题。其中很多文章都写的很好 , 并且有图片、插图进行说明。它可以被用来当作深度学习的教科书。英文能力有限的话,可以使用谷歌翻译。

    7)Program Creek

    Program Creek 在维护方面做的很好 , 文章读起来也比较有趣。在这里 , 你可以找到其他任何网站都不曾涉及到的话题 , 而且几乎每篇文章都包含漂亮的插图或者示例代码。

    8)LeetCode

    备战技术面试?力扣提供了海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。

    刷题的话,还有一个牛客网值得推荐,里面各个公司的面试题和面经分享,找工作前认真刷一刷,一定会大有所获。这里强调一下刷题的重要性:

    • 可以让思维保持活跃
    • 强化对基本知识的理解
    • 要想找到工作,就要过面试,不刷题怎么能行

    9)JournalDev

    想学系列文章,我推荐 JournalDev,这个网站上所有的 Java 系列文章都堪称经典。有 Spring,有 Java 设计模式,有 Java 核心,有 Java EE,有 Java 面试题,应有尽有。
    在这里插入图片描述

    10)CSDN

    CSDN 上虽然很多标题党文章,文章质量也参差不齐,但上面仍然有不少大牛的。说句不好听的,学习,只要遇到一篇能够帮助到自己的文章,就算是值了。

    兄dei,如果觉得我写的不错,不妨帮个忙

    1、关注我的原创微信公众号「沉默王二」,每天准时推送干货技术文章,专注于有趣的Java技术和有益的程序人生,听说关注了的不优秀也会变得优秀哦。

    2、给这篇文章点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

    作者简洁

    作者:你好呀,我是沉默王二,从大专到培训到外包,经历了很多辛酸,所以申请了一个微星公众号『沉默王二』,专业于写这些基础知识,提升我们的内功,二哥期待你的关注,和我一起学习。 转载说明:未获得授权,禁止转载

    展开全文
  • 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是...

    在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。

    何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。

    一、Java基础

    1、Java基础教学视频

    Java零基础教程视频(适合Java 0基础,Java初学入门)【推荐】

    JavaSE进阶入门项目实战视频教程_动力节点【推荐】

    毕向东Java基础视频教程25天【相对老旧,但也是金典啊!】

    说句实在的,博主当年大一下学期就是看的毕老师Java基础25天的视频,可谓金典啊!现在看来算是比较老旧了,可谓画质感人,若不是老毕的风趣,博主有种怎会坚持看完说句实在的,主要是当时没有学习资源才莫得办法,相比之下其余二者都是比较新颖的视频教程了,都是近一两年的没有质量博主也不会推荐鸭,对吧这个时候就会有童鞋要说了,怎么都是bilibili上的鸭?博主认为B站可谓是最大的学习网站了最重要的是免费免费免费!!!是的!加油学吧!上天是公平的,只要不辜负时间,时间自然不会辜负你。

    2、Java基础博客文章目录

    这些是博主近半个月重新总结的一些javase基础方面的博客,当然,学习总结!学习后才有的总结!建议哪里不懂点哪里进行参考

    解惑真小白的苦恼 | 类的对象,对象引用,对象实例,引用变量

    深入理解static关键字

    深入理解抽象类与接口

    【java基础之继承】java继承从“我爸是李刚”讲起

    【java基础之多态】理解多态的向上向下转型从“妈妈我想吃烤山药”讲起

    【java基础之代码块】Static静态代码块以及各代码块之间的执行顺序

    【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    【java基础之匿名内部类】程序员你真的理解匿名内部类吗?

    【java基础之tostring】为什么重写toString()方法?

    【java基础之泛型】泛型

    【java基础之反射】程序员你真的理解反射机制吗?

    java中的transient关键字详解

    史上最骚最全最详细的IO流教程,没有之一!

    【java基础之测试】序员你确定这十个题你都会吗?

    java抽象类(abstract)与接口(Interface)

    java面试官:兄弟简单谈谈Static、final、Static final各种用法吧

    java中的重载与重写

    Java静态static详解

    Java中equals与“==”的区别详解

    java基础之 “==”和“ equals”以及instanceof的区别

    Object类、Date类、System类、StringBuilder类、包装类

    什么是浮点型?什么是单精度浮点数(float)以及双精度浮点数(double)?

    java数组定义、使用、以及数组内存分析详解

    Collection集合以及Iterator迭代器实现原理

    List、Set集合系列之剖析HashSet存储原理(HashMap底层)

    Collection和Collections之间的使用与区别(顺带讲解Comparable与Comparator区别)

    Java中的多线程你只要看这一篇就够了

    当然,于此同时学习的过程光是看这些博客文章是不够的不太系统,不太完整,自黑++i,为了各位能够系统性学习,下面我贴出一份300页的Java基础教程笔记,可适当掺杂阅读。啥?300页?我靠,博主牛皮,博主赖斯,博主我要嫁给你!!!哎哎哎…博主我不禁夸不禁夸害羞 当然博主没有这个耐心整理写作300页笔记,还得感谢我的老师吧这是博主的老师整理的哈哈 唉哎哎…别打…别打…别打脸…我靠,咋还有扔臭鸡蛋的
    300页的Java基础教程链接:https://pan.baidu.com/s/1awgcwhF_SwMetLYcw-7gpg&shfl=sharepset
    提取码:xfn3

    以为就完了吗?就能入门了吗???

    就举个例子从这些List, ArrayList, Set ,HashSet, Map ,HashSet 等等java基础的集合框架你都真的掌握了咩?啥?都学过了?那你能够写一个最简单的ArrayList代码实现吗?就从自己创建一个类开始,然后加方法去实现…对于Java集合框架, 不但要学会用, 还会尝试着去实现一遍!!!一定要多折腾,你才会创造出自己的东西,以后你才能出众

    3、Java基础书籍

    放心,博主深怕各位同学学的不够深不够好,所以博主准备了一打书籍给你。包括java编程思想、java核心技术卷一、二,慢慢啃吧…

    链接:https://pan.baidu.com/s/1oeQxwcN6x1r1lUVml0PeLQ&shfl=sharepset 提取码:st3f

    链接:https://pan.baidu.com/s/19Afs4hbMqZkgxZts9vjyzA&shfl=sharepset 提取码:8ep6

    二、关于JavaWeb基础

    来到Java EE了,博主不得不比比几句了, Java 不就是写服务器端的Web应用的吗?那就自己写个Web程序喽, 可以考虑做一个Web版项目, 用最基础的技术Servlet/jsp/jdbc 。然后自己写个简单mvc框架, 在自己的Web 程序中用起来, 这叫吃自己的狗粮,之后再研究框架 , 自己写个简单的OR mapping框架, 再吃一次自己的狗粮。最后读一下经典的书籍《J2EE development without EJB》 , 是spring 的作者Rod Johnson写的, 它颠覆了大家对于重量级EJB的认识, 开启了新的时代。有了这本书的铺垫, 自己写个简化的依赖注入也不是难事, 写好后还是在自己的Web程序中用起来, 最后一次吃自己的狗粮。

    唉唉唉…放开我…博主还能再哔哔几句…

    JavaWeb基础不牢固,学框架只会事倍功半!所以学servlet之前请远离框架…

    1、JavaWeb基础教程视频

    JavaWeb视频教程(JSP/Servlet/上传/下载/分页/MVC/三层架构/Ajax)

    黑马JavaWeb入门到精通(idea版)

    尚硅谷Java视频_JavaWEB基础视频教程

    同样的那句话:上天是公平的,只要不辜负时间,时间自然不会辜负你。

    2、关于JavaWeb博客文章

    我整理的比较少,比较乱,时间比较有限,写的不好,将就这看吧,选择性观看

    JavaWeb专栏

    三、关于数据库

    肯定要学一个啊,最起码MySQL或者Oracle要会,总不能SQL语句也敲不出吧…

    1、关系型数据库教学视频

    MySQL 基础+高级篇- 数据库 -sql -尚硅谷

    SQL数据库

    一天学会 MySQL 数据库

    Oracle从入门到精通教程(全套)_数据库实战精讲_动力节点

    2、非关系性数据库Redis视频

    非关系性数据库Redis了解一下?这个Redis非常重要,博主不多哔哔,怕各位嫌我比比叨叨然后跑到现实中来扎我QnQ,一句话,埋头学吧…

    千锋微服务2019最新Redis教程[千锋南京]

    2019最新Redis实战教程全套学习视频

    四、关于JDK新特性

    虽然现在jdk12、13的世道了,可现实却是jdk8还是新特性哈哈哈哈…哈哈…哈(原谅我差点笑嗝屁)

    但是必须要明白一点的是用的比较多的还是JDK8!因此JDK8最好要去了解~

    黑马IDEA版本2018Java教学视频—JDK8新特性

    Java 8/9/11 新特性视频教程全集(65P)| 15 小时从入门到精通

    五、关于并发编程

    并发编程其实接触的并不多,但是尤为重要,首当其冲的体现在面试上!现在由于学习软件的人越来越多,特别是Java语言这个行业,而且每年大学生都在毕业,不是我说的浮夸,就连土木工程的大学生都可能转IT这一行,IT行业工资高现在已经是妇孺皆知了,稍微毕业后加入某某培训机构半年,总之学IT的人只会越来越多,随便在大街上拉一个头发茂盛的大叔都可能就是搞软件的,现在有一股妖风,不管啥公司都慢慢像阿里这样的大公司靠近,面试不问点jvm、并发、分布式都不好意思,面试通过之后你的岗位可能仅仅是CURD,老是觉得问问这些显得逼格高点,不管处于什么原因很多公司的确都是这样的!

    这篇文章就是要让你入门java多线程【多线程入门】

    Java并发编程原理与实战

    六、关于NIO

    如果有时间有精力有耐心NIO也是不可或缺的一门知识!急着就业的朋友可以先学框架只后再尽量回头学,当然也只是建议!

    尚硅谷Java视频_NIO 视频教程

    七、关于ssm框架

    ssh建议就不要学了,呸,不能这么说,就是能不学就不学吧,用到再学吧!【只是建议】,总之多学一点也没坏事,看个人吧!反正博主是直接学ssm框架。。。

    1、spring框架视频

    传智spring框架

    Java进阶教程2018年spring框架深入浅出

    2、Mybatis 框架视频

    Mybatis 【黑马】 idea版本

    MyBatis视频教程

    3、SpringMVC框架视频

    【极客学院】一天学会SpringMVC框架

    4、SSM框架博客文章

    4.1、spring框架

    Spring框架学习总结(上)

    Spring框架AOP学习总结(下)

    谈谈Spring核心IOC和AOP

    Spring加载properties文件的两种方式

    4.2、Mybatis框架

    什么是Mybatis,为什么要学习Mybatis,mybatis与hibernate区别

    零基础Mybatis入门程序编写、测试

    MyBatis中SqlMapConfig.xml文件中重点配置:properties属性、typeAliases别名、mappers映射

    MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    Mybatis中#{}与${}的区别

    Mybatis分页插件PageHelper的学习与使用

    Mybatis整合spring详细教程(带思路)

    4.3、SpringMVC框架

    走进SpringMVC世界,从SpringMVC入门到SpringMVC架构

    手把手教你优雅的编写第一个SpringMVC程序

    SpringMVC参数绑定学习总结【前后端数据参数传递】

    【解决】SpringMVC前端到后端400错误

    SpringMVC常见面试题总结(超详细回答)

    4.5、SSM框架整合文章

    当然以上框架文章并不太全,凑合着看吧,尽量以后更新…当然了以上框架企业都不会单个单个的用而是三个框架整合在一起使用,下面这篇文章可就要我的dog命了,加上测试花了整整N个多小时写出来的…

    IDEA优雅整合Maven+SSM框架(详细思路+附带源码)

    八、关于数据结构与算法

    可能你不去了解这玩意,你可能永远用不上这玩意,当你用的上瘾了,在以后的开发中,你会被它的魅力所折服的!强烈建议学习!!!,博主也是自掏腰包在极客专栏上买的这个专栏PDF,顺道小结写出博客,也算是一种小成绩吧!

    1、数据结构与算法视频

    (严蔚敏)数据结构视频教程(C语言版48集)

    上古程序员严蔚敏老师了解一下?咳咳当然也有java版的了,如下

    数据结构与算法基础-java版

    尚硅谷图解Java数据结构和算法

    2、数据结构与算法博客文章

    数据结构与算法分析有多重要?

    完全透析数据结构与算法

    时间空间复杂度分析:如何分析、统计算法的执行效率和资源消耗

    如何教会女友递归算法?

    【数据结构01】浅谈数组

    【数据结构02】栈与队列

    【数据结构03】浅谈链表

    【算法04】树与二叉树(递归思想遍历)

    算法动图+原理代码轻松透析八大经典算法

    当然,依旧还在学习中…尽量抽空持续更新

    3、数据结构与算法书籍

    还有附带一本数据结构与算法书籍,够你折腾了…

    链接:https://pan.baidu.com/s/1c1BW4iHdYPCd1nbRW1kUSQ&shfl=sharepset 提取码:jcdw

    九、关于开发工具idea

    java开发工具必须要最好的鸭,强烈建议直接上手idea,如果你非要用eclipse,咋也不敢问啊…

    博主也有个idea专栏,只是写的不多而已,选择性观看吧,建议看视频,讲的绝对比博主我说的好…

    IDEA专栏

    尚硅谷Java视频教程_IDEA视频教程

    十、关于项目管理工具Maven、Git、SVN、Gradle…

    确实,这些肯定要学,不然就out了…

    Maven基础篇(IDEA版)

    尚硅谷Java视频教程_Maven视频

    【教程】学会Git玩转Github【全】

    尚硅谷_Git&GitHub视频

    黑马程序员SVN视频教程

    黑马程序员精品教程|Java进阶教程之Gradle入门到精通

    十一、关于计算机网络原理

    世界上最遥远的就是网络…呀这里断网了,请各位往下接着看暂时还没写这方面的博客,不过还是挺重要的一门

    韩老师讲高校《计算机网络原理》

    韩老师就不多说了,绝对金典…

    十二、关于设计模式

    这个太重要了,不过没有实际开发经验是学不好这一门课程的,所以它分几个阶段学习,并不可能一蹴而就的,如果你听说XXX花了几个月的时间,耗死XXX个脑细胞,专研设计模式这一门,最后他成仙了,看啥都能运用设计模式来解决…你就扯犊子吧…

    1、设计模式博客文章

    Java 大黑话讲解设计模式 – UML类图

    【设计模式】单例模式的八种写法分析

    待续…

    尽量抽空写…

    2、设计模式视频

    尚硅谷图解Java设计模式韩顺平老师2019力作

    23个设计模式

    十三、关于中间件Shiro、Lucene、Solr…

    1、啥是中间件?

    啥是中间件?这个问题对博主而言就跟啥是佩奇这问题是同一层次的,小猪…红色的… 咳咳,扯远了

    其实吧,对于中间件这个概念并没有特定的概念,大致的概念为非业务的技术类组件,是操作系统之上和业务逻辑之下的中间层也都可以称之为中间件,或者说是主要用于解耦底层逻辑和业务应用的组件,或者是一些可复用的后台组件。这些概念倒是麻溜溜滴…似乎有点道理但又没完全讲清楚这个概念,你说气人不气人?

    言而总之,总而言之,中间件其实也有两个层面不同理解:
    1、狭义上讲中间件如常见的远程服务框架、消息队列、缓存等;
    2、广义上讲中间件是操作系统之上业务逻辑之下的所有可复用的后台组件。

    2、Shiro

    尚硅谷Shiro视频教程

    Lucene&solr(2天学习)

    3、Lucene

    2018年黑马程序员就业班57期之【Lucene】

    4、Shiro

    SpringBoot与Shiro整合-权限管理实战视频

    5、Elasticsearch7.X

    2019年全新录制Elasticsearch7.X搜索引擎项目实战Java架构全套视频教程

    6、Dubbo

    尚硅谷Java视频教程_Dubbo

    (千锋教育)Java 微服务架构 Dubbo 篇 一款高性能 Java RPC 框架

    十四、关于JVM虚拟机

    1、JVM博客文章

    深入理解java虚拟机系列初篇(一):为什么要学习JVM?

    别翻了,这篇文章绝对让你深刻理解java类的加载机制【JVM篇二】

    持续写作中…

    2、JVM视频

    面试JVM,听这堂课就够了

    深入理解JVM

    3、JVM书籍

    博主不想bb啥并朝你丢了一本深入java虚拟机

    链接:https://pan.baidu.com/s/1C3bQOIdxdjHOwq6MT283yQ&shfl=sharepset
    提取码:zkww

    十五、关于消息中间件、RabbitMQ、RocketMQ、ActiveMQ

    单独讲下消息中间件,主要是中间件塔喵的太多惹…

    1、Kafka

    尚硅谷大数据课程之Kafka(2019新版)

    2、RabbitMQ

    MQ消息中间件RabbitMQ 入门到进阶+(牧码人/老王/)+(架构师系列)

    Java架构师带你90分钟快速搞定RabbitMQ消息中间件

    3、RocketMQ

    RocketMQ系统精讲,经受历年双十一狂欢节考验的分布式消息中间件

    2019年最新版Springboot+mybatis+RocketMQ+SpringCloud技术讲解

    4、ActiveMQ

    尚硅谷消息中间件之ActiveMQ

    2019尚硅谷谷粒商城微服务SpringBoot,Dubbo,MySql高级,Redis秒杀,ElasticSearch,ActiveMQ…

    十六、关于容器化技术docker、kubernetes

    尚硅谷_Docker核心技术(基础篇)

    【公开课】Docker入坑教程【33集】

    马哥运维进阶教程:Kubernetes(K8s)从入门到精通

    尚硅谷Kubernetes(k8s基于最新2019年8月发布的1.15.1)

    十七、关于微服务框架

    随着基于Spring之上的框架SpringBoot、Cloud的流行,基于注解式开发的热潮逐渐覆盖了基于XML纯配置的开发,Spring注解将显得格外重要…所以…所以…所以个锤子啊不关咋们什么事啊。。。开个玩笑哈哈,至于微服务框架的学习看个人吧,最好是在找工作前学习一下,现在IT门槛越来越高了,不会点分布式缓存真的不好找工作。

    1、SpringBoot视频

    SpringBoot视频教程(idea版)_2018_spring boot_springboot核心篇+springboot整合篇

    尚硅谷好评如潮【SpringBoot】视频

    2、SpringCloud视频

    尚硅谷_SpringCloud(全)

    千锋:2019Java微服务架构(SpringBoot+SpringCloud)

    答应博主,一定要坚持学完啊!!!

    十八、关于面试

    2019最新Java面试题集精讲全集(互联网大厂必问)

    Java面试题全集84集系列

    京东小米面经

    十九、关于另一层次的学习

    1、参阅官方文档

    另一级别的学习最好的方式就是参阅官方文档,亲生父母往往对孩子是最了解,Spring Boot Reference Guide就是对springboot最了解,怎么样使用springbootspringboot特性等等,springboot在你面前一览无遗;啥?英语不好???google百度翻译插件你值得拥有,咬咬牙也是能看的。如果有时间可以重新学英语,记住,世上无难事,只怕有心人,学什么都不会太晚。

    2、国内技术书籍

    官方文档其次就是书籍,国内的好书自成体系,帮助我们掌握的知识点不至于太散。

    3、参阅博客文章、闲逛github

    再次就是博客文章,不得不吐槽几句,网上的很大一部分文章都是非常浅显,再加上一些标题党的横行,简直不忍直视。这也是很多人抵制博客文章的原因,这里不得不提一下:每次百度或者谷歌一下知识点或者bug,我敢打包票出现最多的推荐靠前的都是CSDN,我相信很多人会认为CSDN很强大,实际上你错了,过段时间你就会慢慢抵制CSDN,看到简书或者博客园、知乎的文章你会优先去看。至于原因就是因为CSDN是国内最大的博客平台,同时一些“标题党.equal 烂人”随之衍生,为了所谓的点击量,博取眼球,自以为自己访问量高很nice?这里也不是说起博取眼球的标题是抵制,前提是你的这篇文章要有一定深度和见解,能够撑起整片文章知识点的架构,博取眼球的标题才是真正有意义的,当之无愧。

    总归来说,园子内还是有很多技术大牛,写的博客自然也是非常棒,非常具有学习价值。每次看都是一种享受,一种熏陶。当然还有github、社区、论坛、码云等等。这就是源码的朋友圈,我们从中也能获取到非常多关于源码的信息。但是针对某个知识点却特别的细,对彻底掌握非常有帮助。

    至于博主为啥要抽空整理出这样一篇博客文章,原因很简单…

    博主大一下学期的时候无尽的迷茫惆怅,博主何尝不期望有位“高人”指路,想学却又不知从何下手,那种无助那种孤独的滋味我懂…
    所以博主只希望生活能够不辜负每个少年的一腔热血,写作本文章的意义仅此而已…

    瓜皮群众皮皮甲: 呜呜呜…博主大一下学期原来这么孤独啊,看了这么久的文章还一直以为这位博主是个有趣、对生活充满阳光的,没想到这个博主“徒有其表”啊 QnQ

    瓜皮群众皮皮乙: 是啊是啊…

    博主: 咳咳…那啥…今天就先到这里了,博主有事,唉唉唉…看…又是那个该死的包工头来电话了,话说今天的砖头格外烫手。

    瓜皮群众皮皮丙: 博主怎么画风怎么又变了, 唉唉唉…博主别走鸭…上我家搬砖去啊,午饭外加一个鸡腿…

    如果有想要和博主一起交流的朋友,欢迎各位及时联系博主…那… 咋们有bing再见~

    持续更新…

    如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

    最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!

    欢迎各位关注我的公众号,公众号里有全套java电子书籍和学习资料喔,一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔…

    在这里插入图片描述

    展开全文
  • Java 复习笔记

    2018-09-02 17:59:40
    Java复习笔记 持续更新 1.讲解一下Java跨平台原理 由于操作系统的的指令集不是完全一致的,就会让我们的程序在不同的操作系统上执行不同的程序代码 Java通过不同的系统,不同版本不同位数的java虚拟机来屏蔽...

    Java复习笔记

    持续更新


    1.讲解一下Java跨平台原理

    由于操作系统的的指令集不是完全一致的,就会让我们的程序在不同的操作系统上执行不同的程序代码

    不同操作系统JVM

    Java通过不同的系统,不同版本不同位数的java虚拟机来屏蔽不同的系统指令集差异而对外提供统一的接口(Java API)。我们只需按照接口开发即可。

    2.面向对象的特征

    封装:把客观的事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象进行操作,对不可信的进行信息隐藏。

    抽象:就是把现实生活中的对象抽象为类

    继承:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。

    多态:多态的特征是表现出多种形态,具有多种实现方式。或者多态是具有表现多种形态的能力的特征。或者同一个实现接口,使用不同的实例而执行不同的操作。

    3.装箱与拆箱

    Java有4类8中基本数据类型同时还有他们对应的包装类型例如int的包装类型是Integer

    • 自动装箱
    Integer i = 1;//自动装箱

    实际上在编译时会调用Integer.valueOf(i)方法来装箱。

    static final int low = -128;
    static final int high = 127;
    
        @HotSpotIntrinsicCandidate
        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }

    • 自动拆箱
    int j = i;  //自动拆箱

    同样在编译时会调用intValue()方法

        @HotSpotIntrinsicCandidate
        public int intValue() {
            return value;
        }

    • 缓存值
      我们会发现在valueOf中,当 i 的值在IntegerCache.low 和 IntegerCache.high 之间时会将i的值放入一个缓冲数组里,所以当我们再次创建相同对象时将直接从缓冲数组中进行提取,即指向同一个对象。
        private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
    
            static {
                // high value may be configured by property
                int h = 127;
                String integerCacheHighPropValue =
                    VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                if (integerCacheHighPropValue != null) {
                    try {
                        int i = parseInt(integerCacheHighPropValue);
                        i = Math.max(i, 127);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    } catch( NumberFormatException nfe) {
                        // If the property cannot be parsed into an int, ignore it.
                    }
                }
                high = h;
    
                cache = new Integer[(high - low) + 1];
                int j = low;
                for(int k = 0; k < cache.length; k++)
                    cache[k] = new Integer(j++);
    
                // range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
            }
    
            private IntegerCache() {}
        }

    Question:有了基本数据类型为什么还要包装类型

    Answer:我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

    另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。

    4.==与equals的区别

    • ==用来判断两个变量之间的值是否相等。变量可以分为基本数据类型和引用类型,如果是基本数据类型的变量直接比较值,而引用数据类型要比较对应的应用的内存的首地址。

    • equals用来比较两个对象长得是否一样,判断两个对象的某些特征是否一样。因此需要重写equals方法。

    这里写图片描述

    5.String、StringBuffer、StringBuilder

    • String是内容不可变的字符串,而StringBuffer和StringBuilder则是内容可以改变的字符串。String底层使用了一个不可变的字符数组(用final修饰),StringBuffer和StringBuilder底层使用的可变的字符数组(没有使用final来修饰)。
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
    
           @Stable
        private final byte[] value;
    
    abstract class AbstractStringBuilder implements Appendable, CharSequence {
        /**
         * The value is used for character storage.
         */
        byte[] value;
    

    StringBuffer和StringBuilder都继承自AbstractStringBuilder,StringBuilder是线程不安全的,效率较高,而StringBuffer是线程是线程安全的,效率较低。

    • 字符串的拼接
    String str="abc";
    
    System.out.println(str);
    
    str=str+"de";
    
    System.out.println(str);

    String str="abc"+"de";
    
    StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
    
    System.out.println(str);
    
    System.out.println(stringBuilder.toString());

    这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和

    String str=”abcde”;

    是完全一样的,所以会很快,而如果写成下面这种形式

    String str1=”abc”;

    String str2=”de”;

    String str=str1+str2;

    那么JVM就会不断的创建、回收对象来进行这个操作了。速度就会很慢。


    String:适用于少量的字符串操作的情况

    StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

    StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

    6.Java中的集合

    Java中的集合分为value,key-value(Collection,Map)两种。

    存储值又分为List和Set:List 有序可重复。Set 无序不可重复,根据equals和hashCode方法来判断,也就是说如果一个对象存储在Set中,必须重写equals和hashCode方法。

    • ArrayList和LinkedList的区别:
      ArrayList底层使用的是数组,LinkedList底层使用的是链表。
        transient Object[] elementData; // non-private to simplify nested class access
    
        transient int size = 0;
    
        /**
         * Pointer to first node.
         */
        transient Node<E> first;
    
        /**
         * Pointer to last node.
         */
        transient Node<E> last;
    
      ...........
    
      private static class Node<E> {
            E item;
            Node<E> next;
            Node<E> prev;
    
            Node(Node<E> prev, E element, Node<E> next) {
                this.item = element;
                this.next = next;
                this.prev = prev;
            }
        }
    • 数组查询元素比较快,而插入、删除和修改比较慢(数组在内存中是一块连续的内存,如果删除或插入时需要移动内存)

    • 链表不要求内存是连续的,在当前元素中存放上一个或下一个元素的地址。查询需要从头部开始一个一个的找,所以查询效率低,插入时不需要移动内存,只需改变引用指向即可,所以插入或者删除效率较高。

    7.HashMap和HashTable的区别

    1. HashMap和HashTable都可以用来修饰key-value的数据。
    2. HashMap是可以把null作为key或者value的,而HashTable是不可以的。
    3. HashMap是线程不安全的,效率较高,而HashTable是线程安全的,效率低。

      Question:即想线程安全又想效率高?
      Answer: ConcurrentHashMap,通过把整个Map分为N个Segment(类似HashTable)可以提供相同的线程安全同时可以将效率提升N倍,默认提升16倍。

    8.实现一个拷贝文件的工具类使用字符流还是字节流?

    Answer:我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片、声音、图像等),为考虑适用性,要使用字节流。

    9.线程

    Question1:线程有几种实现方式?
    Answer1: 2种。继承Thread类实现一个线程或通过实现Runnable接口。Thread类本质上也是实现Runnable接口。

    public class Thread implements Runnable {

    Question2:如何启动?
    Answer:启动线程使用start()方法,而启动以后执行的是run()方法。

    
    public class MyThread implements Runnable {
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
    
        }
    
    }
    
    Thread thread = new Thread(new MyThread());
    thread.start();

    Question3:怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?
    Answer: thread.setName(“线程名字”);这是一种规范,在创建线程后需要设置线程名称。

    10.线程并发库

    Java通过Exectors提供四个静态方法创建四种线程池:

    方法名 作用
    newFixedThreadPool(int nThreads) 创建固定数量的线程池
    newCachedThreadPool() 创建缓存的线程池
    newSingleThreadExecutor() 创建单个线程
    newScheduledThreadPool(int corePoolSize) 创建定时器线程池

    1、提高资源利用率
    线程池可以重复利用已经创建了的线程
    2、提高响应速度
    因为当线程池中的线程没有超过线程池的最大上限时,有的线程处于等待分配任务状态,当任务到来时,无需创建线程就能被执行。
    3、具有可管理性
    线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。

    11.设计模式

    设计模式就是经过前任无数次的实践总结的,设计过程中可以反复使用的,可以解决特定的问题的设计方法。

    常用的设计模式:
    单例模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。
    单例模式可以分为懒汉式和饿汉式:

    懒汉式单例模式:在类加载时不初始化。

    饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。
    第一种(懒汉,线程不安全):

    public class SingletonDemo1 {
        private static SingletonDemo1 instance;
        private SingletonDemo1(){}
        public static SingletonDemo1 getInstance(){
            if (instance == null) {
                instance = new SingletonDemo1();
            }
            return instance;
        }
    }

    这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。 

    第二种(饿汉):

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return instance;  
        }  
    }

    工厂模式:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

    • 步骤 1

      创建一个接口:
      Shape.java

    public interface Shape {
       void draw();
    }
    • 步骤 2

      创建实现接口的实体类。
      Rectangle.java

    public class Rectangle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Rectangle::draw() method.");
       }
    }
    
    Square.java 
    
    public class Square implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Square::draw() method.");
       }
    }
    Circle.java
    
    
    public class Circle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Inside Circle::draw() method.");
       }
    }
    • 步骤 3

      创建一个工厂,生成基于给定信息的实体类的对象。
      ShapeFactory.java

    public class ShapeFactory {
    
       //使用 getShape 方法获取形状类型的对象
       public Shape getShape(String shapeType){
          if(shapeType == null){
             return null;
          }        
          if(shapeType.equalsIgnoreCase("CIRCLE")){
             return new Circle();
          } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
             return new Rectangle();
          } else if(shapeType.equalsIgnoreCase("SQUARE")){
             return new Square();
          }
          return null;
       }
    }
    • 步骤 4

      使用该工厂,通过传递类型信息来获取实体类的对象。
      FactoryPatternDemo.java

    public class FactoryPatternDemo {
    
       public static void main(String[] args) {
          ShapeFactory shapeFactory = new ShapeFactory();
    
          //获取 Circle 的对象,并调用它的 draw 方法
          Shape shape1 = shapeFactory.getShape("CIRCLE");
    
          //调用 Circle 的 draw 方法
          shape1.draw();
    
          //获取 Rectangle 的对象,并调用它的 draw 方法
          Shape shape2 = shapeFactory.getShape("RECTANGLE");
    
          //调用 Rectangle 的 draw 方法
          shape2.draw();
    
          //获取 Square 的对象,并调用它的 draw 方法
          Shape shape3 = shapeFactory.getShape("SQUARE");
    
          //调用 Square 的 draw 方法
          shape3.draw();
       }
    }
    • 步骤 5

      执行程序,输出结果:

    Inside Circle::draw() method.
    Inside Rectangle::draw() method.
    Inside Square::draw() method.

    代理模式:在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
    在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

    装饰器模式:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    12.http Get和Post请求区别

    Get和Post请求都是http的请求方式,用户通过不同的http的请求方式完成对资源(url)的操作。Get、Post、Put、Delete就对应着这个资源的查、改、增、删4个操作,具体讲Get请求一般用于获取/查询资源信息,而Post一般用于更新资源信息。

    区别:
    1.Get请求提交的数据全在地址栏显示出来,而Post请求不在地址栏显示出来。
    2.传输数据的大小,Get由于地址栏的长度限制。
    3。安全性,Post的安全性要比Get的安全性高。

    13.Servlet

    servlet全称Java servlet ,是用Java编写的服务器端程序,servlet是指任何实现了servlet接口的类。其主要功能在于交互式地浏览和修改数据,生成动态的web。
    我们通常通过继承HttpServlet重写doGet和doPost方法或重写service方法完成对get和post请求的响应。

    • servlet的生命周期:
      加载servlet的class —>实例化servlet —>调用servlet的init方法完成初始化 —>响应请求(servlet的service方法)—>servlet容器关闭(servlet的destory方法)
    • servlet API中的forward与redirectde区别:
      1.forward是服务器的转向而redirect是客户端的跳转。
      2.使用forward浏览器的地址不会发生改变,而direct会发生改变。
      3.forward是在一次请求中完成,而redirect是重新发起请求。
      4.forward是在服务器端完成,而不用客户端重新发起请求,效率较高。

    14.Jsp和servlet异同

    jsp是servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类,也就是jsp最终也是一个servlet,这个servlet对外提供服务。
    servlet和jsp最主要的不同点在于,servlet如果要实现html的功能,必须使用write输出对应的html,而jsp是由html和Java组成便于显示视图。
    jsp侧重于视图
    servlet主要用于控制逻辑

    15.jsp的九大内置对象

    1、request对象
    request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

    2、response对象
    response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

    3、session对象
    session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

    4、application对象
    application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

    5、out 对象
    out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

    6、pageContext 对象
    pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

    7、config 对象
    config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

    8、page 对象
    page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

    9、exception 对象
    exception 对象的作用是显示异常信息,只有在包含 isErrorPage=”true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

    15.jsp的四大作用域

    1.pageContext:页面域

    页面作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),则pageContext中的所有属性值就会丢失。

    2.request:请求域

    请求作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。

    3.session:会话域

    会话作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。

    4.application: 应用域

    应用作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。

    16.session与cookie的区别

    session与cookie都是会话跟踪技术,cookie通过在客户端记录信息确定用户身份。但是session的实现依赖于cookie。sessionId(session的唯一标识需要存放在客户端)

    cookie与session的区别:

    1. cookie的数据存放在客户端的浏览器上,而session数据存放在服务器上。
    2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应用session。
    3. session会在一定时间内保存在服务器上,当访问增多时,会比较占用服务器的性能,考虑到减轻服务器的性能方面的压力应用cookie。
    4. 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie

    所以我们通常把登录信息保存在session,其他需要保存的信息放在cookie

    17.前端部分(了解即可)

    html:超文本标记语言,定义页面的结构。
    css:层叠样式表,用来美化页面。
    javascript:主要用来验证表单做动态交互。

    18.Ajax

    Question1:什么是Ajax?
    **Answer1:**Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。异步的javascript和xml。

    Question2:作用?
    Answer2: Ajax通过与服务器进行数据交换,Ajax可以使网页实现布局更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    Question:怎么实现Ajax?
    Answer3:使用XMLHttpRequest 可以异步向服务器发送请求,获取响应,完成布局更新。

    使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动等场景使用。

    19.js和jQuery的关系

    jQuery是一个js框架,封装了js的属性和方法,并增强了js的功能,让用户使用起来更加遍历。
    原来使用js要处理很多兼容性的问题,由jQuery封装了底层,就不要处理兼容问题。并且原生的js的dom和事件绑定和Ajax等操作非常麻烦,jQuery封装后操作非常方便。

    20.jQuery的常用选择器

    • 元素选择器:通过元素名选取元素
    • #id 选择器:通过id获取一个元素
    • .class 选择器:通过类(css)获取元素

    21.jQuery的Ajax和原生js实现的Ajax有什么关系?

    jQuery中的Ajax也是通过原生的js封装的,封装完成后,让我们使用起来更加便利,不用去考虑底层实现和兼容性问题。

    22.Html5

    html5是最新版的html,是在原来的html4的基础上增加了一些标签例如画板,视频,web存储等高级功能。

    23.CSS3

    css3在原先的css2的基础上增加了一些功能例如:盒子功能、盒子和文字阴影、渐变、转换、移动、缩放等动画效果。

    24.bootstrap

    bootsrtap是一个移动设备优先的UI框架,我们可以不用写任何css,js代码就能实现比较漂亮的有交互性的页面。

    25.框架部分

    IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。

    26.MVC模式

    MVC是模型(model)– 视图(view)– 控制器(controller)的缩写。
    最简单经典的是jsp(view)+ servlet(controller)+ JavaBean(model)
    这里写图片描述
    1.当控制器收到来气用户的请求
    2.控制器调用JavaBean完成业务
    3.完成业务后通过跳转jsp页面的方式给用户反馈信息
    4.jsp给用户作出响应

    控制器是核心

    27.MVC框架

    Question1:什么是MVC框架?
    Answer1:是为解决传统MVC模式(jsp+servlet+JavaBean)所存在的问题而出现的框架。

    传统MVC模式的问题:

    1. 所有的servlet和servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,不利于维护。
    2. servlet的主要功能就是接受参数,调用逻辑,跳转页面,比如其他像字符编码,文件上传等功能也要写在servlet中,不能让servlet功能单一。
    3. 接受参数比较麻烦,不能通过model接收。
    4. 跳转页面方式比较单一(forward,redirect)。

    28.Spring MVC执行流程

    这里写图片描述

    1. 用户向服务器发送请求,请求被spring前端控制器DispatcherServlet捕获。(捕获)
    2. DispaerServlet对请求url进行解析,得到请求资源标识符(URI),然后根据该URI调用HandlerMapping获得该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。(查找Handler)
    3. DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter,提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller),Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。(执行Handler)
    4. DispatcherServlet根据返回的ModelAndView,选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)
    5. 通过ViewResolver结合Model和View,来渲染视图,DispaerServlet将渲染结果返回给客户端。(渲染视图)

    核心控制器捕获请求,查找handler执行handler,选择ViewResolver,通过ViewResolver渲染视图并返回。

    29.Spring MVC和Struts2的异同

    • 核心控制器:Spring MVC的核心控制器是Servlet,而Struts2是Filter。
    • 控制器实例:Spring MVC会比Struts2快一些,Spring MVC是基于方法设计,而Struts2是基于对象设计,每发一次请求都会实例一个action。
    • 管理方式:大部分的公司的核心框架中,就会使用到Spring,而Spring MVC又是Spring中的一个模块,所以Spring对于Spring MVC的控制管理更加简单方便。
    • 参数传递:Struts2中自身提供多种参数接受,其实都是通过ValueStack进行传递和赋值,而Spring MVC是通过方法的参数进行接收。
    • 学习难度:Spring MVC 相较于Struts2更易学习。
    • interceptor的实现机制:Struts2有自己的interceptor机制,Spring MVC用的是独立的AOP方式。
    • Spring MVC处理Ajax请求直接通过返回数据,自动帮我们对象转换为JSON对象。而Struts2通过插件的方式进行处理。

    30.Spring

    Spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级框架。

    • IOC或DI
      IOC控制反转。原先等service层需要调用Dao层时,Service就需要创建Dao层的一个实例。而运用Spring框架时,当Service层需要Dao层的一个实例时,Spring容器就会自行注入,不需要自行创建,降低耦合。

       核心原理:配置文件+反射+容器(map)
      
    • AOP
      面向切面编程

        核心原理:使用动态代理的设计模式执行方法,执行方法前后或出现异常后加入相应的逻辑。
      

      应用:
      1.事务处理。执行方法前开启事务,执行完成后关闭事务,出现异常后回滚事务
      2.权限判断。在执行方法前,判断是否具有权限。
      3.日志。在执行前进行日志处理。

    31.Spring事务的传播特性

    事务传播行为类型 说明
    PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

    32.ORM

    对象关系映射(Object Relational Mapping)模式是一种为了解决面向关系数据库存在的互不匹配的现象的技术。

    ORM的方法基于三个核心原则:

    1. 简单:以最基本的形式建模数据。
    2. 传达性:数据库结构被任何人都能理解的语言文档化。
    3. 精确性:基于数据模型创建正确标准化了的结构。

    33.MyBatis和Hibernate有什么异同

    • 相同点:都是Java中orm框架,屏蔽JDBC API的底层访问细节,使我们不用与JDBC API打交道就可以完成数据库的持久化操作。

       Mybatis的好处:屏蔽了JDBC API的底层访问细节,将sql语句与Java代码进行分离,提供了将结果集自动封装称为实体对象和对象的集合的功能。queryForList返回对象集合,用queryForObject返回单个对象,提供了自动将实体对象的的属性传递给sql语句的参数。
      
      
      Hibernate的好处:Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,并执行返回Java结果。
      
      1. 不同点:
        1.hibernate要比mybatis功能强大很多,因为hibernate会自动生成sql语句。
        2.mybatis需要我们自己在xml配置文件中写sql语句,hibernate无法直接控制该语句,我们就无法写特定的高效率的sql语句。
        3.mybatis要比hibarnate简单的多,mybatis是面向sql的,不用考虑对象间一些复杂的映射关系。

    34.webService

    webservice是一个SOA(面向服务编程),它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用。通过Internet进行基于Http协议的网络应用的交互。
    1. 异构系统的整合(不同语言)
    2. 不同客户端的整合,浏览器、手机端(Android、iOS)、微信端、PC端等终端的访问。
    这里写图片描述
    3. 例子:天气预报,通过实现webservice的客户端调用远程服务实现的。
    单点登录:一个服务实现所有系统的登录。

    35.activiti

    activiti是一个业务流程管理(BPM)和工作刘系统,适用于开发人员和管理员,其核心是超快速、稳定的BPMN2流程引擎,它易于与spring集成使用。

    主要用于在OA中,把线下流程放到线上来,把现实生活中一些流程图定义到系统中,然后通过输入表单数据完成业务。

    它主要用在OA系统的流程管理中。
    例:请假流程:小于三天–>一级主管审批,大于三天–>二级主管审批。

    36.Linux

    Linux事业个长时间运行比较稳定的操作系统,所以我们一般用它作为服务器,Linux本身具有c的编译环境,我们的一些软件是没有安装包的(例如redis),需要在Linux编译得到软件包。

    • 常用的命令

      pwd  获取当前路径
      cd    跳转到指定目录
      su    切换用户身份
      ls      列举当前目录的文件和文件夹
      
      文件操作命令
      cat  查看
      rm -rf  删除
      vi      修改
      
      文件夹的操作
      mkdir   创建文件夹
      rm-rf   删除
      

    Question:如何远程连接Linux?
    Answer:需要使用Linux服务器anzhuangssh服务端,且ssh服务端的端口号为22,之后使用ssh客户端连接服务器。常用的ssh客户端又Xshell、Putty。

    Question2:云主机是什么?
    Answer2:云主机就是一些云服务运营商(例如阿里、华为)提供的远程的服务器的功能,我们开发者只需按照自己的需求购买即可。

    37.数据库分类和常用的数据库

    • 数据库的分类:

       1.关系型数据库(mysql、oracle、SQL server)
       2.非关系型数据库(redis、mogodb、Hadoop)
      
    • 关系数据库的三范式:

      范式就是就是规范,关系型数据库在设计表时要遵循的三个规范。
      
    • 第一范式(无重复的列) 定义:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性 通俗解释:一个字段只存储一项信息 eg:班级:高三年1班,应改为2个字段,一个年级、一个班级,才满足第一范式,否则不满足第一范式。

      学号 姓名 班级
      0001 小红 高三年1班
      改成
      学号 姓名 年级 班级
      0001 小红 高三年 1班
      
    • 第二范式(属性完全依赖于主键) 定义:满足第一范式前提,当一个主键由多个属性共同组成时,才会发生不符合第二范式的情况。比如有两个属性的主键,不能存在这样的属性,它只依赖于主键中的一个属性,这就是不符合第二范式 通俗解释:任意一个字段都只依赖表中的同一个字段

      eg:比如不符合第二范式
      学生证名称 学生证号 学生证办理时间 借书证名称 借书证号 借书证办理时间
      改成2张表如下 
      学生证表
      学生证名称 学生证号 学生证办理时间
      借书证表
      借书证 借书证号 借书证把你拉时间
      
    • 第三范式(属性不能传递依赖于主属性) 定义:满足第二范式前提,如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。 通俗理解:一张表最多只存2层同类型信息

      eg:爸爸资料表,不满足第三范式
      爸爸 儿子 女儿 女儿的小熊 女儿的海绵宝宝
      改成 爸爸信息表:
      爸爸 儿子 女儿
      女儿信息表
      女儿 女儿的小熊 女儿的海绵宝宝
      
    • 反三范式:有时候为了效率,可以设置重复的字段

    38.事务的四大特征

    事务是并发控制的单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。

    事务的四大特征:

    • 原子性:表示事务内操作不可再分割,要么都成功,要么都失败。
    • 一致性:要么都成功,要么都失败,后面的失败了,要对前面的操作进行回滚。
    • 隔离性:一个事务开始后,不能受其他事务干扰。
    • 持久性:表示事务开始了,就不能终止。

    39.mysql数据库的默认的最大连接数

    Question:为什么需要最大连接数?
    Answer:特定服务器上的数据库只能支持一定数目同时连接,这时候我们设置最大连接数(最多同时服务多少连接)。在数据库安装时都会有一个最大的连接数。mysql默认的最大连接数是100;

    40.mysql和oracle的分页语句

    Question1:为什么需要分页?
    Answer1:在查询很多数据时,不可能完全显示数据所以要进行分页显示。

    • Mysql使用关键字limit来进行分页的,limit offset,size表示从多少索引去多少位

      1 SELECT
      2     *
      3 FROM
      4     student
      5 LIMIT (PageNo - 1) * PageSize,PageSize;
      
    • oracle的分页有点记不住了,记得是嵌套查询………我去查了一下

       1 SELECT
       2     *
       3 FROM
       4     (
       5         SELECT
       6             ROWNUM rn ,*
       7         FROM
       8             student
       9         WHERE
      10             Rownum <= pageNo * pageSize
      11     )
      12 WHERE
      13     rn > (pageNo - 1) * pageSize
      

    41.触发器的使用场景

    触发器需要触发条件,当条件满足以后做什么操作。

    create trigger triggerName
    
    after/before insert/update/delete on 表名
    
    for each row   #这句话在mysql是固定的
    
    begin
    
    sql语句;
    
    end;

    下单操作

    DELIMITER $$
       CREATE TRIGGER `test`.`trigger_insert` AFTER INSERT ON orders
       FOR EACH ROW 
       BEGIN
         UPDATE goods SET num=num-new.much WHERE id=new.goods_id;
       END$$
    DELIMITER ;

    42.存储过程

    优点:

    • 1.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。
    • 2.允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。
    • 3.减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
    • 4.更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。

    43.JDBC

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

    Java通过定义接口,让数据库厂商自己实现接口,对于我们开发者而言,只需导入对应厂商开发的实现即可。

    以下为之前的一个JDBC实例部分:

    public static Connection getConnection() {
            Connection conn = null;
            try {
                // 1.注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                // 2.建立连接
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Fish?useSSL=yes", "root", "1234");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                System.out.println("注册驱动失败");
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return conn;
    
        }
    
        /**
         * save函数,将源Date与状态存入数据库
         * 
         * @param strDate
         * @param state
         */
        public static void save(String strDate, String state) {
            PreparedStatement ps = null;
            Connection conn = null;
            String sql = "insert into fish(date,state) values(?,?)";
            try {
                conn = getConnection();
                ps = conn.prepareStatement(sql);
                ps.setString(1, strDate);
                ps.setString(2, state);
                ps.executeUpdate();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        conn.close();
                    }
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    44.JDBC中PrepareStatement相比Statement的好处

    大多数情况下我们都使用PrepareStatement

    1. PrepareStatement是预编译的,比Statement速度更快。
    2. 代码的可读性增强。
    3. 安全性,PrepareStatement可以防止SQL注入攻击。

    45.数据库连接池的作用

    • 1、资源复用
      由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

    • 2、更快的系统响应速度
      数据库连接池在初始化过程中,往往已经创建了若干数据库连接至于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间,从而缩减了系统整体响应时间。

    • 3、统一的连接管理,避免数据库连接泄漏在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

    46.数据库优化方面的事情

    • 查找、定位慢查询、并优化

    • 创建索引:创建合适的索引,我们就可以现在索引中查询,查询到以后直接找对应的记录。

    • 分表 :当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化

    • 读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群。

    • 缓存:使用 redis来进行缓存等等

    47.查找满查询并定位慢查询

    在项目自验后转测试之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一段时间后,通过查看日志,找到慢查询的语句。
    使用explain慢查询的语句来详细分析语句的问题。

    48.选择合适的数据库引擎

    在开发中,我们经常使用MyISAM/INNODB/Memory

    • MyISAM:如果对事务要求不高,同时是以查询和添加为主的,我们考虑使用MyISAM存储引擎,比如bbs中的发帖表和回复表
    • INNODB:对事务要求高,保存的数据都是重要的数据,我们建议使用INNODB,比如订单表,账号表。
    • Memory:数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory,速度极快。

    MyISAM和INNODB的区别:

    1. 事务安全:MyISAM不支持事务,INNODB支持。
    2. 查询和添加速度:MyISAM不用支持事务,就不用考虑同步锁,
    3. 支持全文索引:MyISAM支持,INNODB不支持
    4. 锁机制:MyISAM支持表锁,INNODB支持行锁(事务)
    5. 外键:MyISAM不支持外键,INNODB支持外键(通常不设置外键,通常在程序中保证数据的一致)

    49.选择合适的索引

    索引(index)是帮助DBMS高效获取数据的数据结构。
    分类:普通索引、唯一索引、主键索引、全文索引

    • 普通索引:允许重复的值出现
    • 唯一索引:除了不能有重复的记录外,其他和普通索引一样
    • 主键索引:是随着设定主键而创建的也就是把某个列设为主键的时候,数据库就会给该列创建索引,这就是主键索引,唯一且没有null值。
    • 全文索引:用来对表中的文本域(char、varchar、text)进行索引。

    50.索引使用小技巧

    索引的弊端:

    1. 占用磁盘空间
    2. 对dml(插入、修改、删除)操作有影响,变慢。

    使用场景:

    1. 经常使用where条件查询
    2. 该字段的值不是唯一的几个值(sex)
    3. 字段内容不是频繁变化

    具体技巧:

    • 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引
    alter table dept add index my_ind (dname,loc);   //dname左边的列,loc就是右边的列
    explain select * from dept where dname="aaa";   //会使用索引
    explain select * from dept where loc="aaa";    //不会使用索引
    • 对于使用like的查询,查询如果是 ‘%aaa’ 不会使用索引,’aaa%’ 会使用索引
    explain select * from dept where dname like '%aaa';   //不使用索引
    explain select * from dept where dname like 'aaa%';   //使用索引
    • 如果条件中有or,有条件没有使用索引,即使其中有条件带索引页不会使用,换言之,就是要求使用的所有字段,都必须单独使用时能使用索引。

    • 如果列类型是字符串,那一定要早条件中将数据使用引号引起来,否则不使用索引。

    • 如果mysql使用全表扫描要比使用索引快,则不使用索引。例如,表里只有一条数据。

    51.数据库优化之分表

    分表分为水平分表(按行)和垂直分表(按列):

    • 根据经验,mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉。水平分表能够很大程度减少这些压力。按行数据进行分表。
    • 如果一张表中的某个字段非常多(长文本、二进制等)而且只有在很少的情况下才会查询。(例如考试详情,我们一般只关注分数,不关心详情),这时候就可以把字段多的单独放到一个表,通过外键关联起来。

    水平分表:

    1. 按时间分表
    2. 按区间范围进行分表

       例如:table_1     user_id 从 1~100w
            table_2     user_id 从 100w~200w
            table_3     user_id 从 200w~300w
      
    3. hash分表

       通过一个原始目标的id或者通过一定的hash所发计算出存储表的表名,然后访问响应的表。
      

    52.数据库优化之读写分离

    一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求时,就可以集群处理,mysql的集群处理技术最常用的就是读写分离。

    • 主从同步

      数据库最终会把数据库持久化到磁盘,如果集群必须确保每个数据库服务器的数据是一致的,能改变数据库数据的操作都往主数据库上写,而其他的数据库从主数据库上同步数据。
      
    • 读写分离

      使用负载均衡来实现写的操作都往主数据库去, 而读的操作都往从服务器去。
      

    53.数据库优化之缓存

    在持久层(dao)和数据库(db)之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问时直接从缓存中获取不用访问数据库。而缓存是在操作内存级,访问速度很快。

    • 作用:减少数据库服务器驱动,减少访问时间
    • Java中常用的缓存有:

       1.hibernate的二级缓存,该缓存不能完成分布式缓存。
       2.可以使用redis来作为中央缓存,对缓存的数据进行集中处理。
      

    54.sql语句优化小技巧

    1. DDL(数据定义语言)优化:

      1.通过禁用索引来提供导入数据性能,这个操作主要针对有数据库的表追加数据。
      
      2.关闭唯一校验:set unique_check = 0 //关闭
      
      3.修改事务提交方式(导入)变多次提交为一次提交:set autocommit = 0 //关闭
      
    2. DML(数据操纵语言)优化:变多次提交为一次

      insert into test values(1,2);
      insert into test values(1,3);
      insert into test values(1,4);
      ........
      //合并多条为一条
      insert into test values(1,2) (1,3) (1,4);
      
    3. DQL(数据查询语言)优化:

      order的优化:
              1.多用索引排序
              2.普通结果排序
      

    55.JDBC批量插入几百万条数据怎么实现

    1. 变多次提交为一次
    2. 使用批量操作

      能省的时间非常可观,像这样的批量插入操作能不使用代码就不使用,可以使用存储过程来实现

    56.redis

    Question1: redis是什么?
    Answer1: redis是一个key-value的mysql数据库,先到内存中根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多。主要用来做缓存数据库的数据和web集群当作中央缓存存放session

    Question2: 简单说一下redis的使用场景?
    Answer2: 首先redis可以用做缓存,把经常需要查询的,很少修改的数据放到读速度很快的空间(内存),以便下次访问减少时间,减轻压力,减少访问时间。其次是计数器,redis中的计数器是原子性的内存操作,可以解决库存溢出问题,进销存系统内存溢出。redis还可作为session缓存服务器,web集群时作为session缓存服务器。

    57.redis存储对象的方式

    • JSON字符串:需要把对象转换为json字符串,当做字符串处理,直接使用set、get来设置或者获取。优点:设置和获取比较简单。缺点:没有提供专门的方法,需要把对象转换为json(jsonlib)
    • 字节:需要做序列化,就是把对象序列化为字节保存

    如果担心json转对象比较消耗资源的情况,这个问题需要考虑几个方面:

    1. 就是使用的json转换lib是否存在性能问题
    2. 即使数据的数量级别,如果是存储百万级别的大数据对象,建议采用存储序列化对象方式,如果少量的数据级对象。或者是数据对象字段不多,还是建议采用json准还成String的方式

    58.redis数据淘汰机制

    Question: 为什么要淘汰?
    Answer: 内存有限,需要保存有效的数据。

    • volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
    • allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
    • volatile-random:随机淘汰数据,只淘汰设定了有效期的key
    • allkeys-random:随机淘汰数据,所有的key都可以被淘汰
    • volatile-ttl:淘汰剩余有效期最短的key

    59.java访问redis及redis集群

    1. 使用jedis java客户端来访问redis服务器,有点类似于jdbc访问mysql一样。
    2. 如果是Spring进行集群时,可以使用Spring data 来访问redis,spring data是对jedis的二次封装,类似于jdbcTemplate 和JDBC之间的关系

    redis集群:当一台数据无法满足需求时,可以使用redis集群来处理,类似于mysql的读写分离。


    今天就先写这么多

    展开全文
  • javaDay01

    2020-06-04 21:27:55
    1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9)和下划线“_”。 (2)一个唯一包名的前缀总是全部小写的字母。...(3)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。...

    1.命名规范

    (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9)和下划线“_”。

    (2)一个唯一包名的前缀总是全部小写的字母。例如:www.tonysun.cc

    (3)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。例如:Tony。

    (4)接口的大小写规则与类名相似:例如:Tony。

    (5)方法名是一个动词或动词词组,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。例如:setNeekeName(String neekeName)。

    (6)变量名第一个字母小写,任何中间单词的首字母大写。变量名应简短且可以顾名思义,易于记忆。例如:neekeName、neekeAddress。避免单个字符的变量名,除非是一次性的临时变量。

    (7)常量的声明应该全部大写,每个单词之间用“_”连接。例如:final String WWW_TONY_CN = “www.tonysun.cc”;

    2.注释规范

    (1)注释尽可能使用“//”;对于所有的javadoc的注释则使用“/** /”;而临时对代码块进行注释尽量使用“/ */”。

    (2)所有的源文件都应该在开头有一个注释,其中列出文件名、日期和类的功能概述。

    (3)每个方法必须添加文档注释(类的main()方法除外)。

    (4)每个属性必须添加注释。

    (5)代码中至少包含15%的注释。

    (6)注释使用中文。

    ## 3.语句规范

    (1)每行至少包含一条简单语句。

    (2)在return语句中,返回值不使用小括号“()”括起来。

    (3)if语句总是用“{”和“}”括起来。

    (4)在for语句的初始化或更新子句中,避免因使用三个以上变量,而导致复杂度提高。

    (5)当switch的一个case顺着往下执行时(因为没有break语句),通常应在break语句的位置添加注释。

    展开全文
  • Java&day01

    2020-08-03 16:37:57
    1.Java语言介绍 java之父:詹姆斯.高斯林 1995年由sun公司开发,后来被Oracle收购。 JDK现在已经出来14版本,但是我们开发用的是8版本。 2.Java语言跨平台原理 3.JDK、JRE和JVM【记住】 JDK (Java ...
  • Java Day01

    2019-12-30 17:15:13
    1.注释 注释的作用:为了解释说明程序和帮助调试错误 1.1 单行注释 //注释内容 1.2多行注释 /* 注释内容*/ 1.3文档注释 /**文档注释 */ ...public class HelloWorld{ public static void main(String[] args){ ...
  • 疯狂Java——day01

    2020-07-18 19:44:28
    编译java程序 命令: javac -d <目录> 源程序 // 指定。.class文件位置 运行java程序 命令: java 主类 可运行的类必须包含main方法。 jshell工具 交互式工具,从java9开始。 命令: jshell java注释 单行...
  • 搭上火箭也追不上的 Java 更新速度,不少程序员们大呼,我可不可以坚持使用 Java 8?!但是对于已使用到 LTS 版本的 Java 11 开发者,是否还有必要往上升...
  • 使用Spring Boot实现一个简单的在线图书商城。 简洁、大气的扁平化UI设计,给用户更好的体验。简单、快捷的购买流程让用户更快的买到自己喜欢的图书。用户简单的注册即可购买图书,在导航菜单上就可以查看自己的...
  • java中的前++和后++

    2019-03-28 16:47:30
    java中的前加加++和后加加++,有很多人搞的很晕,不太明白!今天我举几个例子说明下前++和后++的区别! 其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加! 前++和后++总结:其实大家只要...
  • 使用Eclipse开发JavaWEB项目前期准备新建server新建Java Web 工程编写Java编写JSP服务器执行jsp 前期准备 自行安装tomcat,注意tomcat和Java版本的匹配 新建server eclipse界面下端有如下Servers菜单 如果...
  • JAVA 8 '::' 关键字

    2018-06-05 16:17:28
    Java 8 中我们可以通过 `::` 关键字来访问类的构造方法,对象方法,静态方法。现有一个类 Somethingclass Something { // constructor methods Something() {} Something(String something) { System.out....
  • 当然,这里我只是说Java学习路线,因为自己就是学Java的,对Java理当很熟悉,对于其它方面,我也不是很了解。 基础阶段 首先是基础阶段,在基础阶段,我们必须掌握Java基础,Mysql数据库,Ora...
  • 2019年最新Java学习路线图,路线图的宗旨就是分享,专业,便利,让喜爱Java的人,都能平等的学习。从今天起不要再找借口,不要再说想学Java却没有资源,赶快行动起来,Java等你来探索,高薪距你只差一步! java...
  • JAVA学习视频,2018最新全套视频大放送!JAVA学习视频,2018最新全套视频大放送!JAVA学习视频,2018最新全套视频大放送!重要的事情说三遍,小编精心准备的内容。希望对初学者有所帮助! 一、java基础 1.毕向东...
  • Java学习网站推荐

    2019-03-12 16:01:52
    学习Java不仅依靠自身的努力,还要多看一些相关技术文档,那么必不可少的就是学习Java的网站,本人整理收集一些Java学习网站,这些网站可以提供一些最新Java的资料,有时定期开设讲座等线下活动,而且里面的一些Java...
  • java学习路线图(2018年最新版)最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很...
  • 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java...
1 2 3 4 5 ... 20
收藏数 1,292,939
精华内容 517,175
关键字:

java