Java
引言
计算机常识
前言
-
计算机概述
计算机包括硬件(hardware)和软件(software)两部分。硬件包括计算机中可以看得见的物理部分。而软件提供看不到的指令。这些指令控制硬件并且使得硬件完成特定的任务。 -
程序设计
定义:创建(或开发)软件。软件包含了指定,告诉计算机做什么。
应用场景:软件遍布我们周围。除了个人计算机、飞机、汽车、手机甚至烤面包机中,同样运行着软件。
- 程序设计语言
软件开发人员再称为程序设计语言的强大工具的帮助下创建软件。
所谓指令,就是不同语言写出来的指令,例如java, python,c++等等。
- 如何选择该学习那种程序设计语言?
程序设计语言有很多种,每种语言都是为了实现某个特定的目的而发明的。
你会困惑那种语言是最好的。事实上,**没有“最好”的语言。**每种语言都有它的长处和短处。
经验丰富的程序员知道各种语言擅长的应用场景,因此,会尽可能的掌握各种不同的程序设计语言。
如果你掌握了一种变成语言,应该会更容易上手其它的编程语言。关键是学习如何使用程序设计方法来解决问题。
一、计算机中的两个重要人物
1.艾伦·麦席森·图灵
计算机科学之父,人工智能之父
图灵提出的著名的图灵机模型为现代计算机的逻辑工作方式奠定了基础。
2.约翰·冯·诺依曼
现代计算机之父,博弈论之父
数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。
java路线
第一阶段:Java基础
学习任何一门编程语言,
常及网络编程,这些我们称之为JavaSE基础。
当你掌握了这些内容之后,你就可以做出诸如:电脑上安装的迅雷下载软件、QQ聊天客户端、考勤管理系统等桌面端软件。
第二阶段:数据库
互联网最具价值的是数据,任何编程语言都需要解决数据存储问题,而数据存储的关键技术是数据库。MySQL和Oracle都是广受企业欢迎的数据库管理系统。Java程序和数据库通信的最常见技术是JDBC,Druid和C3P0。
学习这些数据库技术后,可以掌握数据库运维技术、复杂业务表结构设计规范、工作中常见的SQL操作、软件数据存储等。
第三阶段:前端技术
浏览器展示给用户看到的网页就是前端,前端有三大基础技术分别为Html、CSS、JavaScript,这些学完后,为了做出更好、更炫的交互式体验效果,我们还需要学习jQuery、ElementUI、Vue、Ajax,以及打包工具webpack。
学完这些技术后,我们可以开发微信小程序、响应式网站、移动端网站、开发类似京东一样的B2B2C商城、管理后台等。
第四阶段:JavaWeb动态网页
掌握前端技术只能做静态网站,但它页面数据一成不变,而动态网站可以根据数据库中变更的数据实现不同的内容展示,应用更广泛,因此程序员必须要学会做动态网站。
使用Java做动态网站,我们需要学习Servlet、Filter、Session、Cookie、JSP、EL表达式、JSTL等做动态网站的完整知识体系,学完可研发出OA系统、内容网站、BBS等。
第五阶段:Java编程强化
前面学了JavaSE基础,但它在企业级应用中程序处理业务的效率并不高、扩展差,编程强化是对JavaSE基础的加强,将针对性的提高程序处理业务的执行效率、增强程序扩展性。编程强化将加强多线程高级学习,涉及线程内存、线程通信等技术。
学完以后,能增加一个中级程序员的知识储备,无论在面试过程中还是将来技术的深入打一个良好的基础。
第六阶段:软件项目管理
公司开发都是团队协同开发,为更好的掌握实际开发,我们还需要学习常用的项目管理平台、版本控制器、项目构建工具以及自动化部署工具。项目开发一定是有版本升级的,管理好项目进度和版本需要Git、Maven、Sonar这样的系统平台。
学习完软件项目管理后,将掌握整个项目实际开发过程以及整个项目开发过程中所使用协同开发工具。
第七阶段:热门技术框架
Javaweb掌握后,已经具备企业中实际项目的开发能力了,但它开发效率低,代码量大,开发周期长、开发成本高。企业中广泛使用一些优秀的框架技术来解决上述问题,因此我们还需要学习框架技术,项目开发中主流的Java框架技术有SpringMVC、Spring、MyBatis、MyBatis Plus、SpringData等。
第八阶段:分布式架构
企业发展过程中,业务量和用户量逐渐增加,为了保证系统的可用性,系统越做越复杂,研发人员增多,大家很难共同维护一个复杂的系统,往往修改部分内容,导致牵一发而动全身,所以我们需要升级系统架构,需要用到分布式微服务的技术。
学习完该阶段课程,可以具备大型SOA架构和微服务架构能力,能掌握大型微服务项目必备技术和实际经验。
第九阶段:服务器中间件
在分布式系统架构中,服务与服务之间的异步通信,是非常常见的需求之一,消息中间件的诞生正是为了解决这类问题。目前市面上的主流消息中间件有RabbitMQ、RocketMQ、Kafka,我们将学习这3个消息中间件,实现分布式项目中的异步通信。
学习完这些后,可以实现分布式项目的异步通信、分布式应用日志收集、分布式事务等。
第十阶段:服务器技术
程序开发完成后,我们把它们打包部署到服务器中运行,所以我们需要学习常见的服务器技术,常见的服务器有Linux和Window server,Linux性能高,是当前主流。
我们写好的项目需要用一个软件运行起来,这个软件叫web容器,我们需要在服务器上安装web容器来发布项目,当前主流的web容器有tomcat、jetty、nginx、undertow。
第十一阶段:容器技术
具备了服务器操作系统及web容器,我们就可以部署单机的站点,在分布式系统中,几十上百的服务,如果使用单机这种部署方式,会投入很高的人力,同时出错的几率也大。所以服务器虚拟化技术Docker也称为如今的必备技术了,Docker可以帮助运维人员实行快速部署,批量维护.使用Kubernetes实现自动化部署、大规模可伸缩、应用容器管理。
第十二阶段:企业业务解决方案
企业开发中会遇到一些通用的业务场景,诸如:搜索引擎、缓存、定时任务、工作流、报表导出、日志管理、系统监控等,那么这些通用的解决方案也有现成优秀的免费开源中间件,可供使用。
诸如:ElasticSearch、Lucene、Solr、redis、MongoDB、slf4J、ECharts、Quartz、POI等。业务解决方案课程的业务方案和技术难点,解决了企业开发中90%以上的痛点和难点。
Java基础
Java语言的概述
java基础是学习JavaEE,大数据,Android的基石
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdvapN4Q-1641174105289)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211021212653045.png)]
软件开发介绍
软件,即一系列按照特定顺序组织计算机数据和命令的集合
有系统软件和应用软件
系统软件:操作系统
人机交互方式
最早的图形化界面由施乐公司
图形化界面(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用户接口。不关心实现的底层逻辑,通过直观图像的变化交互。
命令行方式(command-line interface,CLI)一般指命令提示符,是在操作系统中,提示进行命令输入的一种工作提示符;原来称之为“DOS”的操作方式。在不同的操作系统环境下,命令提示符各不相同;在windows环境下,命令行程序为“cmd.exe”,是一个32位的命令行程序。通过具体指令进行操作。
常用的DOS指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ws8sRPqw-1641174105290)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211021234518664.png)]
应用程序=算法+数据结构
计算机编程语言介绍
1.第一代语言
机器语言。指令以二进制代码存在
2.第二代语言
汇编语言。使用助记符表示一条机器指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cA5F89Xu-1641174105291)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211021235153637.png)]
3.第三代语言:高级语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L5A0D4mC-1641174105292)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211021235359768.png)]
开发效率Java高于c++,但运行速率不如。为了追求运行速率,与操作系统有关的部分,基本与c++有关
Java API的文档
整理
-
JDK,JRE,JVM的关系,以及JDK,JRE的主演结构
JDK包含JRE,JRE包含JVM
JDK=JRE+JAVA的开发环境
JRE=JVM+JAVA核心类库
-
为什么配置path环境变量?如何配置?
让系统在各个地方都可以找到java
-
常用的DOS操作
java基本语法
一,变量和运算符
关键字(keywords)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqnjLUjN-1641174105293)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211022234158667.png)]
JAVA保留字
goto,const
标识符(Identiifier)
命名规则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZGdeLDd-1641174105293)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211022235217129.png)]
运算符
-
位移运算符
左移运算符号
右移运算符
无符号运算符
二,流程控制
break和continue
- break会跳出包含此关键字的最近的循环
- continue会跳出本次最近的循环
通过标签结束外层循环
lbael for(int i=0;i<5;i++){
for(int j=0;j<i;j++){
if(J>2) break;//退出j循环
else break label;//退出i循环
}
}
嵌套循环
输出:*
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 6-i; j++) {
System.out.print("*");
}
System.out.println("\n");
}
/*
*****
****
***
**
*
外层循环控制行数
内层循环控制列数
*/
输出金字塔
for (int i = 1; i <= 5; i++) { //控制行数
for (int j = 1; j <= 6-i; j++) { //控制每一行打印的‘ ’个数
System.out.print(' ');
}
for (int j = 1; j <=i*2-1 ; j++) { //控制每行打印‘*’个数
System.out.print("*");
}
System.out.println();
}
数组
一维数组初始化
int [] name=new int[length];
String [] name = new String[]{“lal”,“ahs”,“pi”}
数组在初始化后,长度是确定的,数组的长度不可更改
初始化默认值
数组初始化默认值
- 整形数组:0
- 浮点型数组:0.0
- char类型数组:0或\u000( 空格)
- boolean数组:false;
- 引用类型数组:null;
数组的内存解析
二维数组
一层控制行数,二层控制列数
回形针数
十种排序算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbijIi2g-1641174105295)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211027224234412.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MerHGOg-1641174105295)(C:\Users\c1759\AppData\Roaming\Typora\typora-user-images\image-20211027224314378.png)]
-
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
-
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
-
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
-
**空间复杂度:**是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
归并排序 (MergeSort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
算法描述
- 把长度为n的输入序列分成两个长度为n/2的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
快速排序
堆排序
数组常见问题
- 数组下标越界
- 空指针异常
面向对象
面向对象的三大特性:封装,继承,多态。
封装
封装在java中的体现:
1.方法就是一种封装。
2.关键字private也是一种封装。
封装就是将一些细节信息隐藏不可见。
类和对象的关系,如何理解?
类:抽象的,概念中的东西
对象:实在的东西
对象是由类派生来的。
JVM的内存结构
虚拟机栈:即平时所用到的栈,局部变量存储在栈结构中。
堆:将new出来的结构(对象,数组)加载在堆空间里,补充:对象的属性(非static)加载在堆空间里
方法去:类的加载信息,常量池,静态域
方法
方法的递归
递归也适合循环的情况
-
递归方法,一个方法调用它本身
-
方法递归包含一种隐式循环,重复执行一段代码,但并不需要循环语句控制。
-
递归要向已知方向递归,避免无穷递归,死循环。
public int sumNumber(int n) {
if (n == 1)
return 1;
else
return n + sumNumber(n - 1);
}
包装类
要点
- java提供了八种基本数据类型的对应的包装类,基本数据类型具有类的特征
- 掌握基本数据类型,包装类,String三者之间的转换
几种类型的转化
基本数据类型——》包装类
调用构造类的构造器
两种构造方法
int num=10;
Integer n1 = new Integer(num);
System.out.println(n1.toString());// 10
可以将字符串转化为定义的类
Integer n2 = new Integer("123");
System.out.println(n2)//123
Boolean包装类中将字符串转化为boolean类型是,只要字符串中的字符不是true(不区分大小写),都会转化为false。
Boolean flag=new Boolean("True");//true
Boolean flag=new Boolean("true1");//false
定义在类中的基本数据类型,不进行初始化赋值,会有自己的默认初始化值,如果是包装类,则会变成null,因为是个类,成了对象,引用类型统一为null。
包装类——》基本数据类型
调用包装类的Value()方法
Integer num1=new Integer(12);
int num=num1.intValue(); //12
新特性
JDK 5.0时加入的新特性:自动装箱和自动拆箱
//自动装箱
int num = 12;
Integer n = num ;
//自动拆箱
Integer n = new Integer(10);
int num = n ;
基本数据类型、包装类——》String类型
//方式一:连接运算
int n=10;
String str = n + "";
//调用String重载的valueOF
int n = 10;
String str = String.valueOF(n);//"10"
String类型——》基本数据类型、包装类
调用包装类的**parseXxx()**方法
String str = "123";
int num = Integer.parseInt(str);//123
JDK 5.0时加入的新特性:自动装箱和自动拆箱
//自动装箱
int num = 12;
Integer n = num ;
//自动拆箱
Integer n = new Integer(10);
int num = n ;
基本数据类型、包装类——》String类型
//方式一:连接运算
int n=10;
String str = n + "";
//调用String重载的valueOF
int n = 10;
String str = String.valueOF(n);//"10"
String类型——》基本数据类型、包装类
调用包装类的**parseXxx()**方法
String str = "123";
int num = Integer.parseInt(str);//123