Java起源
于SUM公司由James Gosling研发;
Java基于C++进行改造,去除原先复杂指针与内存管理并结合嵌入式的实时性要求。
1996-1/推出JDK1.0版本;
1997-2/推出JDK1.1版本;
1998-12-8/推出JDK1.2版本「第二代Java平台企业版J2EE」
1999-4-27/HotSpot虚拟机发布,后来成为JDK1.3及之后所有版本的Sun JDK默认虚拟机。
1999-6/Java体系分为三个方向:
J2ME(微型版)移动无线及有限资源环境「移动端」
J2SE(标准版)桌面环境「PC电脑端」
J2EE(企业版)基于Java应用服务器「专业性开发」
随着供应商的不同,Java 的 API 也分为三大类:
Java Core API:Java 核心类库;
Java Optional API:对之前 API 的扩充;
特殊 API:由特殊厂商或组织提供的 API
2000-5/JDK1.3、1.4、J2SE1.3相继发布;
2002.2.26/J2SE1.4发布;
20-4-9-30/J2SE1.5发布;
2005-6/Java SE6;
2011-7-28/Sun公司被Oracle收购同时发布JavaSE7;
2014-3-18/JavaSE8发布;
2017-9-22/JavaSE9发布;
2018-9-26/JavaSE11发布;「同时是第一个长期支持版本(LST版本持续支持到26年9月)
2019-3-20/JavaSE12发布;「短期版本」
2019-9-23/JavaSE13发布;
2020-3-17/JavaSE14发布;
2020-9-15/JavaSE15发布;「短期版本」
JDK包括两大部分:开发工具和运行环境
运行环境包括核心 API、集成 API、用户界面 API、发布技术、Java 虚拟机(JVM)。「代表性技术:Java虚拟机,Applet,AWT等」
Java可以做「开发桌面应用程序、开发面向Interent的web应用软件、提供各行业的解决方案、嵌入式开发」
Java特性:
一种纯面向对象的编程语言
与平台无关(跨平台)的语言[它提供了在不同平台下运行的解释环境即一次编译,随处运行]
健壮的语言[吸收了C/C++语言的优点]
有较高的安全性[自动回收垃圾,强制类型检查,取消指针]
Java技术的两种核心机制
Java虚拟机(Java Virtual Machine)JVM
JVM可以理解成一个可运行Java字节码的虚拟计算机系统「它有一个解释器组件,可以实现Java字节码和计算机操作系统之间的通信,同时对于不同运行平台有不同的JVM」
垃圾回收器(Garbage Collection)GC
Java垃圾回收器最厉害的点在与消除了程序员回收无用内存空间的责任,同时在Java程序运行过程中自动启用,程序员无法精准控制和干预。同时JVM提供了一种系统线程跟踪储存空间的分配情况,在JVM空闲时候,自动检查并释放那些可以被释放的储存空间,高效避免无用类的存在。
JDK
JDK(Java Development Kits)–Java开发工具集「JRE(Java Runtime Environment)Java运行时环境
JVM
Java API(应用程序编程接口)「Java编译器(javac.exe)、Java运行时解释器(java.exe)、Java文档化工具(javadoc.exe)其他工具及资源」
JRE的三项主要功能
加载代码:由类加载器(class loader)完成;
校验代码:由字节码校验器(byte code verifier)完成;
执行代码:由运行时解释器(runtime interpreter)完成.
计算机中的程序:为了让计算机执行某些操作或解决某个问题而编写的一些列有序指令(即命令)的集合。
Java程序类型:
1.命令行程序
2.GUI程序
3.Applet程序
4.J2EE web应用程序
程序开发三步骤:
编写源程序—编译源程序—运行
Java语法
语法规则:
1.Java严格区分大小写;「可参考阿里巴巴Java编写规范」
2.Java是一种自由格式的语言;
3.代码分为结构定义语句和功能执行行语句
4.功能执行语句的最后必须用分号结束;
java代码的位置:class必须编写在.java文件中(需要深入了解下)
Java注释方式
单行://注释
多行:/* 注释 */
文本:/** 注释 */
代码语句分类
1.结构定义语句
对代码进行结构的划分,例:{}//为扩住一部分内容,java最小的储值单元为class类。
2.功能执行语句
在范围结构内有一些功能执行语句;
功能执行语句只能放在声明类的内部;
功能执行语句只能使用英文分号结束;
基础语法
二进制
float类型变量在定义时需注意:我们直接写出的浮点数字,默认类型都是double[即使用float类型附值时,储存类型为double,会提示需强制转换,在值最后增加f即可解决]
long类型变量定义时需注意:写出的整形数字,在默认存储类型是int,会提示需要强制转换[在值最后增加l即可解决]
char类型使用时用单引号引用一个字符且可以变作数字,并参与数字的运算[使用中文字时候会以第一二笔画参与数字运算]
ascii码表[附图]
方法
方法用于封装一段特定的逻辑功能,主要要素有:权限修饰符、参数列表和返回值
格式:
权限修饰符 返回值类型声明 方法名称(参数列表{
方法中封装的逻辑功能;
return 返回值;
}
【如果没有返回值时,返回值默认为void】
权限修饰符
有以下
private(私有)
默认(同包所有类可用)
protected(同包或不同包子类可用)
public(所有类可用,公共)
返回值详解
方法调用结束后可以返回一个数据,称为返回值。
方法在声明时必须指定返回值的类型。
通过return语句返回,return语句的作用在于结束方法且将数据返回。
参数列表详解
方法在参数列表:在调用时传递给方法,需要被方法处理的数据。
在方法定义时,需要声明该方法所需要的参数变量。
在方法调用时,会将实际参数值传递给方法的参数变量,必须保证传递参数的类型和个数符合方法的声明。
算术运算符
++:
如果在变量前:则对变量先加1,在执行后续操作。
如果在变量后:则先执行当前语句操作,再对此变量加1。
–:
原理同上。
逻辑运算符
赋值运算符
关系运算符
标识符
java对包、类、方法、参数和变量等要素明明时候使用的字符序列称为标识符。起名时候需要注意一下规则:
1.由字母、数字、下划线(_)和美元符号($)组成。
2.不能以数字开头。
3.区分大小写。
4.长度无限制(只要能让人一看得出来这个变量的作用是什么,多长都可以)
5.不能是Java中的保留关键字。
6.标识符命名习惯:见名知意
【可以参考阿里巴巴Java编写规范】
命名规范: 软性建议
类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
变量名规范:全部小写。
关键字大全
转义字符
类型转换
boolean 类型不能转换成任何其它数据类型。
自动类型转换:容量小的类型自动转换成容量大的数据类型 byte,short,int -> float ->long ->double;
byte,short,int 不会互相转换,它们三者在计算时会转换成 int 类型
强制类型转换:容量大的类型转换成容量小的数据类型时,要加上强制转换符 long l = 100L; int i = (int)l;有可能造成精度降低或数据溢出,使用时要小心。
流程控制
接收用户输入
Scanner input = new Scanner(System.in);//可用于控制台自行输入
Scanner是其中一个方法工具,java中有许多的方法工具供给使用。
执行结构
任何简单或复杂的算法豆可以由三种基本结构组合而成:
1.顺序结构:是一种基本的控制结构,按照语句出现的顺序执行操作。
2.分支结构:又被称为选择结构,根据条件成立与否来执行操作。
3.循环结构:是一种重复结构,如条件成立,会重复执行某一个循环体,直到出现不满足的条件为止。
循环语句
循环语句功能:在循环条件满足的情况下,反复执行特定代码。
循环语句分类:
for循环:类似三目运算法组合条件体
for(初始化参数;判断条件;更新循环变量){
循环体
}
while 循环:先判断,再执行
do/while 循环:先执行,后判断
分支结构
if条件语句:根据条件判断之后再做处理
if(判断条件){····}else if(判断条件){·····}else{·····}
switch语句(规则):
switch(表达式){
case 取值 1: 语句块 1;break;
case 取值 n: 语句块 n;break;
default: 语句块 n+1;break;
}
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行! Case 后面的执行体可写{ }也可以不写{ }
数组
数组是相同数据类型的多个数据的容器。这些元素按照线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个 元素外,每一个元素都有唯一的后继元素。(“简单理解就是:一个跟一个顺序排列”)。
下标
可以理解为数组中内容的数字序号,从 0 开始 ,对于长度为 n 的数组,下标的范围是 0~n-1。 可以通过下标的方式访问数组中的每一个元素。
数组长度获取:数组名称.length
注意⚠️
使用数组不当, 会出现如下问题:
数组未赋值: 空指针异常 超出长度的下标操作: 数组越界异常 注意:数组的长度在创建时就固定了。
数组常用算法
冒泡排序
又名:在随机的一组数组中,由小到大进行对比排序
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
升序排列的口诀:
N个数字来排队两两相比小靠前, 外层循环length-1内层循环length-i-1
降序排序的口诀:
N个数字来排队两两相比大靠前, 外层 循环length-1 内层循环length-i-1
//冒泡排序的🌰代码
//创建一个变量用于储存变化后的数字
int temp;
//进行冒泡给数组重新排序,外层循环控制比较轮数
for(int i = 0;i<nums.length-1;i++) {
//内层循环控制的是每轮比较的次数
for(int j = 0;j<nums.length-i-1;j++) {
//增加判断条件
if(nums[j]>nums[j+1]) {
//通过左右比较,进行位置调换
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
二分查找(拆半查找)
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找要求数组数据必须采用顺 序存储结构有序排列。
//二分查找法的示例代码
//使用二分查找法查找数字6;
int num = 6;
//定义最小下标
int minIndex = 0;
//定义最大下标
int maxIndex = nums.length-1;
//定义中间下标
int centerIndex = (minIndex+maxIndex)/2;
//使用while(true)的循环进行查看是否符合筛选条件
while(true) {
if(nums[centerIndex]>num) {
//中间数据较大
maxIndex = centerIndex-1;
}else if(nums[centerIndex]<num){
//中间数据较小
minIndex = centerIndex+1;
}else {
//否则就找到了数据,数据位置:centerIndex
break;
}
if(minIndex > maxIndex) {
//如果最小值大于了最大值,则输入的数字不存在,输出-1
centerIndex = -1;
break;
}
//当边界发生变化,需要更新中间下标
centerIndex = (minIndex+maxIndex)/2;
}
System.out.println("查找到下标位置为:第"+centerIndex+"位");