Java的起源与演变:
Java是sun公司的产品
1991年由sun公司的工程师詹姆斯.高斯林领导的名为“Green”项目小组自主研发;
1992年开发了一种名为“Oak”的面向对象语言(后改名为“Java”);
1994年项目小组将Oak应用于万维网;
1995年项目小组用Oak语言开发了“Applet”,这时Oak语言才被广大程序员接受,并正式改名为Java;
1996年SUN公司推出了JDK1.0;
1997年推出了JDK1.1;
1998年推出了JDK1.2,第二代Java平台的企业版J2EE发布(第一个里程碑);
1999年SUN公司将Java体系分为三个方向:
1、J2ME--Java2微型版,用于移动、无线及有限资源的环境;
2、J2SE--Java2标准版,用于桌面环境;
3、J2EE--Java2企业版,用于基于Java的应用服务器。
2000年JDK1.3和JDK1.4相继发布;
2002年J2SE1.4发布;
2004年J2SE1.5发布(第二个里程碑),后更名为Java SE5.0(内部版本号依然为1.5.0);
2005年Java SE 6发布;
2011年Java SE 7发布,此时SUN公司已被Oracle公司收购;
2014年Java SE 8发布(这是一个长期支持版本);
2017年Java SE 9发布,采用了更高效、更智能的GI垃圾回收器;
2018年3月Java SE 10发布;
2018年9月Java SE 11发布(这是一个新的长期支持版本,LTS版本支持到2026年);
2019年3月Java SE 12发布;
2019年9月Java SE 13发布;
Java体系与特点:
Java ME
微型版:致力于消费产品和嵌入式设备的最佳解决方案;
Java SE
标准版:各应用平台的基础,桌面开发低端商务应用的解决方案;
Java EE(Java更擅长的地方)
企业版:以企业为环境而开发应用程序的解决方案;
Java的特性:
纯面向对象的编程语言、跨平台、健壮的语言(基于C/C++)、较高的安全性(取消指针)。
Java的跨平台原理:
JVM可以理解成一个可以运行Java字节码的虚拟计算机系统,对于不同平台有不同的JVM,JVM屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。
Java技术的两种核心机制:
Java虚拟机(JVM)、垃圾回收器(GC)。
垃圾回收器:对不再使用的内存进行回收,C/C++等语言中,有程序员手动清除多于内存,Java中自动启用垃圾回收器,程序员无法干涉或控制。
JDK与JRE的主要功能与概念:
JDK -- Java开发工具集,其中包括JRE(JVM、Java API)与Java编译器等其他工具与资源;
JRE -- Java运行时环境,主要功能:
1、加载代码:由类加载器完成;
2、校验代码:由字节码校验器完成;
3、执行代码:由运行时解释器完成。
JDK11安装与配置环境变量:
1.官网下载安装:www.oracle.com
下载完成后按照步骤安装即可,位置存放在默认位置
- 配置环境变量:点击电脑属性,在高级系统设置中找环境变量,在系统变量找到“path”,点击编辑--新建,将JDK11的安装位置以“位置\bin”填入表中保存。
- 检验是否配置成功:在doc命令窗口中输入“Java”、“Java -version”。
- 配置环境变量也可以以“JAVA_HOME”的方式配置:首先在系统变量中新建一个“JAVA_HOME”的变量,在值中填入JDK11的安装位置,再在path变量中添加一个新值,以“JAVA_HOME\bin”的形式填入,并保存。
第一个Java程序:
新建文件夹,再新建文本文档名为hello,关键代码如下:
class Hello{
public static void main(String[] args){
System.out.println(“锄禾日当午”);//所有的符号皆为英文。
}
}
保存后,将文件后缀名改为“.java”,再当前文件夹下,打开doc命令行输入指令“javac Hello.java”,此时在当前文件夹下生成Hello.class文件,再在doc命令行中输入“java Hello”即可。
Eclipse的安装:
进入官网下载安装:www.eclipse.org
下载安装完成后打开eclipse.exe文件即可。
Eclipse中编写自动关机程序:
关键代码如下:
public class Demo1{
public static void main(String[] args) throws IOException{
Runtime.getRuntime().exec(“shundown -s -t 3600”);
}
}
解除自动关机程序:
关键代码如下:
public class Demo1{
public static void main(String[] args) throws IOException{
Runtime.getRuntime().exec(“shundown -a”);
}
}
1、//单行注释;
2、/*
多行注释
*/
3、/**
*文档注释
*/ 一般放在类的顶部,方法的首部
所有的注释语句一律不参与运算。
代码语句的分类:
1、结构定义语句
2、功能执行语句(写在方法中如:main)
Java基础语法:
一、变量
变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。由于该存储单元中的数据可以发生改变,因此得名为"变量"。
变量分类:
按所属的数据类型划分:
基本数据类型变量
引用数据类型变量
按被声明的位置划分:
局部变量:方法或语句块内部定义的变量
成员变量:方法外部、类的内部定义的变量
特别注意:类的外面不能有变量的声明
二、数据类型
由于变量记录的数据内容大小不同, 导致所需的存储单元大小不同,在 Java 语言中使用数据类型的概念加以描述 .
字节是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。Java 中的字节是八位的字节,即它包含八位的二进制数。
八种基本数据类型:
整数型(int)、短整数型(short)、长整数型(long)、字节型(byte)、浮点型(float)、双 精 度 型(double)、布尔型(boolean)、字符型(char)。
引用数据类型:
类(class)、接口(interface)、数组。
三、标识符
Java 对包、类、方法、参数和变量等要素命名时使用的字符序列称为标识符。规则如下:
由字母、数字、下划线(_)和美元符号($)组成,不能以数字开头、区分大小、长度无限制。
不能是 Java 中的保留关键字。
标识符命名习惯:见名知意。
示例:
合法标识符:HelloWord、username2、user_name、_userName、$abc_123
非法标识符:2UserName、user#Name、Hello World、class
四、类型转换
boolean 类型不能转换成任何其它数据类型。
自动类型转换:容量小的类型自动转换成容量大的数据类型
byte,short,int -> float ->long ->double
byte,short,int 不会互相转换,它们三者在计算时会转换成 int 类型
强制类型转换:容量大的类型转换成容量小的数据类型时,要加上强制转换符
long l = 100L;
int i = (int)l;
有可能造成精度降低或数据溢出,使用时要小心。
五、二进制
计算机中的数据都以二进制数字保存。
二进制:逢二进一。即只有 0、1 两个值。
如:十进制的 10 在计算机内保存为二进制的 1010
计算机中信息的存储单位
位(Bit):表示一个二进制数码 0 或 1,是计算机存储处理信息的最基本的单位。
字节(Byte):一个字节由 8 个位组成。它表示作为一个完整处理单位的 8 个二进制数码。
补码:
事实上,计算机内的二进制数值是以补码形式表示的。
一个正数的补码和其原码的形式是相同的。
负数的补码是:将该数的绝对值的二进制形式,按位取反再加 1。
由此可知,二进制补码数值的最高位(最左位)是符号位:该位为 0,表示数值为正数;该位为 1,表示数值为负数。
10 =
00000000
00000000
00000000
00001010
-10 =
11111111
11111111
11111111
11110110
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
二进制和十进制之间的互换
二进制数转换成十进制数
按权相加:把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。
例:原码 1011.01 = 1×23+0×22+1×21+1×20+0×2-1+1×2-2
= 8+0+2+1+0+0.25
=11.25
十进制转换成二进制
整数部分:"除 2 取余,逆序排列"法
小数部分:"乘 2 取整,顺序排列"法
二进制表示法太冗长,所以在程序中一般喜欢用十六进制。
十六进制:基数为十六,逢十六进一。它用 abcdef 表示从 0-9 之上的值。
Java 中十六进制数据要以 0x 或 0X 开头。如:0x23D
十六进制转换成二进制只需将每个十六进制数字替换为相对应的四个二进制位即可。
八进制:基数为八。
Java 中八进制数据要以 0 开头。如:0123
八进制转换成二进制:只需将每个八进制数字替换为相对应的三个二进制位即可。
现在的计算机系统很少用八进制的了。
六、方法
概述:方法用于封装一段特定的逻辑功能。方法的主要要素有:权限修饰符 方法名、参数列表和返回值。
格式:
权限修饰符 返回值类型声明 方法名称(参数列表){
方法中封装的逻辑功能;
return 返回值;
}
返回值详解:
方法调用结束后可以返回一个数据,称之为返回值。
方法在声明时必须指定返回值的类型。
通过 return 语句返回,return 语句的作用在于结束方法且将数据返回。
如果方法没有返回值(即方法不需要返回数据),需将返回值类型声明为 void。
参数列表详解:
方法的参数列表:在调用时传递给方法,需要被方法处理的数据。
在方法定义时,需要声明该方法所需要的参数变量。
在方法调用时,会将实际参数值传递给方法的参数变量。必须保证传递参数的类型和个数符合方法的声明。
方法示例
public void say(int a,int b){
System.out.println(“方法 say 正在执行”);
}
七、运算符
算术运算符:
+:加
-:减
*:乘
/:除
%:取模(求余)
++: 如果是变量前缀:先对此变量加 1,再执行其他的操作。
如果是变量后缀:先执行当前语句的其他操作,再对此变量加 1
--: 如果是变量前缀:先对此变量减 1,再执行其他的操作。
如果是变量后缀:先执行当前语句的其他操作,再对此变量减 1
赋值运算符:
赋值运算符作用是将一个值赋给一个变量,运算顺序从右到左
=:赋值
+=:加等于
-=:减等于
*=:乘等于
/=:除等于
%=:模等于
关系运算符:
关系运算符作用是比较两边的操作数,结果总是 boolean 型的。
==:相等于
!=:不等于
< :小于
> :大于
<= :小于等于
>= :大于等于
逻辑运算符:
逻辑运算符用于对 boolean
型结果的表达式进行运算,运算结果总是 boolean 型。
&:与
| :或
^:异或
!:非
&&:短路与
|| :短路或
字符串连接运算符:
String s="He" + "llo"; 结果"Hello"
"+"除了可用于字符串相连接,也能将字符串与其它的数据类型相连成一个新的字符串。
如:String s="x" + 123; 结果"x123"
三目运算符:
X ? Y : Z
X 为 boolean 类型表达式,先计算 x 的值,若为 true,整个三目运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
例:
int score = 75;
String type = score >=60 ? "及格" : "不及格";
操作符优先级(了解):
表达式的运算按照运算符的优先顺序从高到低进行,同级运算符从左到右进行:
优先次序
1 . [] ()
2 ++ -- ! ~ instanceof
3 new (type)
4 * / %
5 + -
6 >> >>> <<
7 > < >= <=
8 = = !=
9 &
10 ^
11 |
12 &&
13 ||
14 ?:
15 = += -= *= /= %= ^=
16 &= |= <<= >>= >>>=
八、转义字符
所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能
显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了
\n 换行,将当前位置移到下一行开头
\r 回车 ,将当前位置移到本行开头
\t 水平制表(HT) (跳到下一个TAB位置)
\\ 代表一个反斜线字符''\'
\' 代表一个单引号(撇号)字符
\" 代表一个双引号字符
九、执行结构
概述
1996 年,计算机科学家 Bohm 和 Jacopini 证明了:任何简单或复杂的算法都可以由顺序结构、分支结构和循环结构这三种基本
结构组合而成。
它们的共同点是都包含一个入口和一个出口,它们的每个代码都有机会被执行,不会出现死循环。
顺序结构
顺序结构是一种基本的控制结构,它按照语句出现的顺序执行操作
分支结构
分支结构又被称为选择结构,根据条件成立与否来执行操作,
if 条件语句
if 条件结构是根据条件判断之后再做处理
if(条件语句){…}
if (条件语句){…}else{…}
if (条件语句){…}else if(条件语句){…}
if (条件语句){…}else if(条件语句){…}else{…}
switch 语句
switch(表达式){
case
取值 1:
语句块 1;break;
case
取值 n:
语句块 n;break;
default: 语句块 n+1;break;
}
switch 语句有关规则
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
Case 后面的执行体可写{ }也可以不写{ }
循环语句
循环结构是一种重复结构,如果条件成立,它会重复执行某一循环体,直到出现不满足的条件为止。
简介
循环语句功能
在循环条件满足的情况下,反复执行特定代码
循环语句分类
for 循环
while 循环
do/while 循环
while 循环
符合条件,循环继续执行;否则,循环退出
特点:先判断,再执行
语法:
while(条件表达式){
//语句块;
}
使用 while 循环的步骤
1、分析循环条件和循环操作
2、套用 while 语法写出代码
3、检查循环是否能够退出
do-while 循环
先执行一遍循环操作,符合条件,循环继续执行;否则,循环退出
特点:先执行,再判断
语法:
do {
循环操作
}while ( 条件表达式 );
while 循环和 do-while 循环的区别:
while:先判断条件,如果条件满足,再执行循环操作
do while:先执行一遍循环操作,然后再判读条件,如果条件满足,继续执行循环操作。
for 循环
语法:
for(初始化参数;判断条件 ;更新循环变量){
循环体;
}
十、数组
概述
数组是相同数据类型的多个数据的容器。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个
元素外,每一个元素都有唯一的后继元素。(“简单理解就是:一个跟一个顺序排列”)。
创建格式
格式 1.
数据类型[] 数组名称 = new 数据类型[数组长度];
格式 2.
数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3...数组内容 n};
格式 3.
数据类型[] 数组名;
格式 3 属于只创建了数组引用名, 并未在内存创建数组空间。
格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3...内容 n};
下标
可以理解为数组中内容的数字序号,从 0 开始 ,对于长度为 n 的数组,下标的范围是 0~n-1。
可以通过下标的方式访问数组中的每一个元素。
例如: 创建 int 类型数组 arr , 给数组 arr 的 5 下标赋值数据 , 然后打印
int[] arr = new int[10];
arr[5] = 123;
System.out.println(arr[5]);
数组长度获取
数组名称.length
注意
使用数组不当, 会出现如下问题:
数组未赋值: 空指针异常
超出长度的下标操作: 数组越界异常
注意:数组的长度在创建时就固定了。
数组常用算法
冒泡排序
原理:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的
数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
名字由来:
是因为最小(或最大)的元素会经由交换慢慢“浮”到数列的顶端(降序或升序),就如同水中的气泡最终会上浮到
顶端一样,故名“冒泡排序”。
升序排列的口诀:
N个数字来排队
两两相比小靠前,
外层 循环length-1
内层循环length-i-1
降序排序的口诀:
N个数字来排队
两两相比大靠前,
外层 循环length-1
内层循环length-i-1二分查找 (折半查找)
概述
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找要求数组数据必须采用顺
序存储结构有序排列。
原理
首先,假设数组中元素是按升序排列,将数组中间位置的数据与查找数据比较,如果两者相等,则查找成功;否则利用
中间位置记录将数组分成前、后两个子数组,如果中间位置数据大于查找数据,则进一步查找前子数组,否则进一步查
找后子数组。
重复以上过程,直到找到满足条件的数据,则表示查找成功,
直到子数组不存在为止,表示查找不成功。