1.Java概述
Java具有跨平台的特性,可以“一次编译,到处运行”。编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。
跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。
Java的几个版本
Java SE(Java Standard Edition) 标准版
Java SE是Java的标准版,主要用于开发客户端(桌面应用软件),例如常用的文本编辑器、下载软件、即时通讯工具等,都可以通过J2SE实现。
Java SE包含了Java的核心类库,例如数据库连接、接口定义、输入/输出、网络编程等。
学习Java编程就是从J2SE入手。
Java EE(Java Enterprise Edition) 企业版
Java EE是功能最丰富的一个版本,主要用于开发高访问量、大数据量、高并发量的网站,例如美团、去哪儿网的后台都是Java EE 。通常所说的JSP开发就是Java EE的一部分。
Java EE包含Java SE中的类,还包含用于开发企业级应用的类,例如EJB、servlet、JSP、XML、事务控制等。
Java EE也可以用来开发技术比较庞杂的管理软件,例如ERP系统(Enterprise Resource Planning,企业资源计划系统)。
Java ME(Java Micro Edition) 微型版
Java ME 只包含Java SE中的一部分类,受平台影响比较大,主要用于嵌入式系统和移动平台的开发,例如呼机、智能卡、手机(功能机)、机顶盒等。
在智能手机还没有进入公众视野的时候,你是否还记得你的摩托罗拉、诺基亚手机上有很多Java小游戏吗?这就是用Java ME开发的。
Java的初衷就是做这一块的开发。
2.Java开发环境的配置
JDK(Java Development Kit) ,是Java开发工具包,它提供了Java的开发环境和运行环境。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。
JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
为什么设置JAVA_HOME:
1.为了方便引用,避免每次引用都输入很长的路径串;
2.归一原则, 当JDK路径改变的时候, 仅需更改JAVA_HOME的变量值即可。
3.第三方软件会引用约定好的 JAVA_HOME 变量, 不然, 你不能正常使用该软件。
如何设置JAVA_HOME:
在系统环境变量那一栏中点 -> 新建 JAVA_HOME (JAVA_HOME指向的是JDK的安装路径)
path 变量
path 变量使得我们能够在系统中的任何地方运行java应用程序,比如 javac、java等等,这就要找到我们安装 JDK 的目录,假设我们的JDK安装在 C:\jdk1.6.0 目录下,那么在 C:\jdk1.6.0\bin 目录下就是我们常用的 java 应用程序,我们就需要把 C:\jdk1.6.0\bin 这个目录加到 path 环境变量里面。
同时,path变量可以配置任何应用程序以便于在系统中直接调用,例如:把qq.exe的路径放入path,在命令行界面输入qq,回车即可打开qq。
classpath 变量
classpath 环境变量,是当我们在开发java程序时需要引用别人写好的类时,要让 java 解释器知道到哪里去找这个类。通常,sun 为我们提供了一些额外的丰富的类包,一个是 dt.jar,一个是 tools.jar,这两个 jar 包都位于 C:\jdk1.6.0\lib 目录下,所以通常我们都会把这两个 jar 包加到我们的 classpath 环境变量中 set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。
变量名:JAVA_HOME
变量值:
C:\Program Files (x86)\Java\jdk1.8.0_91 // 要根据自己的实际路径配置
变量名:CLASSPATH
变量值:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个"."
变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
注意在完成配置环境变量后测试JDK是否安装成功时键入命令:java -version
3.Java类库及组织结构
Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API。
API(Application Programming Interface, 应用程序编程接口)。
假如有人编了一个很好用的类,但这个类很复杂,不便于读完,但又想要用。而且对方也想要保护版权,不想让我们看。那么他就先编译这个类,附上一个使用文档,告诉我们怎么用,有哪些方法属性,我们只需要按照说明调用就能直接使用。文档中描述的类的使用方法,就叫做API。
Java类库的包的命名
为了防止重名,有一个惯例:大家都以自己域名的倒写形式作为开头来为自己开发的包命名,例如百度发布的包会以 com.baidu.* 开头,w3c组织发布的包会以 org.w3c.* 开头……
组织机构的域名后缀一般为 org,公司的域名后缀一般为 com,可以认为 org.* 开头的包为非盈利组织机构发布的包,它们一般是开源的,可以免费使用在自己的产品中,不用考虑侵权问题,而以 com.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。
4.Java import和Java类的搜索
import语法为:import package1[.package2…].classname;package 为包名,classname 为类名。
Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。
Java类的搜索路径
Java程序运行时要导入相应的类,也就是加载 .class 文件的过程。
安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVA_HOME%\lib。
Java运行环境将依次从当前路径、类库路径寻找导入的类,若找不到,编译会报错
可以在CLASSPATH变量中增加搜索路径,例如 .;%JAVA_HOME%\lib;C:\javalib,那么你就可以将类文件放在 C:\javalib 目录下,Java运行环境一样会找到。
单类型导入(single-type-import)
例如import java.io.File;
按需类型导入(type-import-on-demand),例如 import java.io.*;
单类型导入比较好理解,仅仅导入一个public类或者接口。而对于按需类型导入,有人误解为导入一个包下的所有类,其实他只会按需导入,也就是说它仅仅导入当前类需要使用的类。
单类型导入和按需类型导入对类文件的定位算法是不一样的。
编译器的类文件定位方法大致可以理解为如下公式:
顶层路径名 \ 包名 \ 文件名。class = 绝对路径
对于单类型导入很简单,因为包明和文件名都已经确定,所以可以一次性查找定位。
对于按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:
package com;
import java.io.*;
import java.util.*;
当你的类文件中用到了File类,那么可能出现File类的地方如下:
1、com.File \\ File类属于当前包
2、java.lang.File \\编译器会自动导入java.lang包
3、java.io.File
4、java.util.File
需要注意的地方就是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。
结论:按需类型导入不会降低Java代码的执行效率,但会影响到Java代码的编译速度。
查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:
1.提高编译速度。
2.避免命名冲突。(例如:当你import java.awt.*;importjava.util.*后,使用List的时候编译器将会出编译错误)
当然,使用单类型导入会使import语句看起来很长。
5.Java的数据类型
1.基本数据类型
Java语言提供了八种基本类型。
byte:最小值 -128(-2^7);最大值是127(2^7-1);
short:最小值 -32768(-2^15);
最大值 32767(2^15 - 1);
int:最小值 -2,147,483,648(-2^31);
最大值 2,147,483,647(2^31-1);
long:最小值 -9,223,372,036,854,775,808(-2^63);
最大值 9,223,372,036,854,775,807(2^63-1);
2.引用数据类型
类、接口、数组都是引用数据类型。
在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Dog 、Employee等。变量一旦声明后,类型就不能被改变了。
一个引用变量可以用来引用任何与之兼容的类型。
所有引用类型的默认值都是null。
3.数据类型转换
自动数据类型转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下: 低--------------------------------------------->高 byte,short,char-> int -> long -> float -> double
强制数据类型转换
强制转换的格式是在需要转型的数据前加上“( )”,然后在括号内加入需要转化的数据类型。
6.Java运算符
数学运算符
+ 、- 、* 、/ 、% 、++ 、--
关系运算符
== 、!= 、> 、< 、>= 、<=
位运算符
& 、| 、 ^ 、~ 、>> 、<< 、
逻辑运算符
&& 、|| 、! (& 、| 、!)
条件运算符
(a?b:c)
Instanceof
该运算符用于操作对象实例,检查该对象是否是一个特定类型
7.Java的数组
如果希望保存一组有相同类型的数据,可以使用数组。
数组的定义和内存分配
Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName;
Java在定义数组时并不为数组元素分配内存,因此[]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下: arrayName=new type[arraySize];其中,arraySize 为数组的长度,type 为数组的类型。
数组的初始化
你可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。
数组引用
可以通过下标来引用数组: arrayName[index];Java对数组元素要进行越界检查以保证安全性。每个数组都有一个length属性来指明它的长度。
数组的遍历
实际开发中,经常需要遍历数组以获取数组中的每一个元素。最容易想到的方法是for循环,不过,Java提供了“增强版” 的for循环,专门用来遍历数组,这种增强版的for循环也被称为”foreach循环“,它是普通for循环语句的特殊简化版。所有的foreach循环都可以被改写成for循环。但是,如果你希望使用数组的索引,那么增强版的 for 循环无法做到。
二维数组
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。
静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。
如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组) 。
正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。
8、两种简单排序
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
选择排序的基本思想:
第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;
第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;
以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
Java具有跨平台的特性,可以“一次编译,到处运行”。编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。
跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。
Java的几个版本
Java SE(Java Standard Edition) 标准版
Java SE是Java的标准版,主要用于开发客户端(桌面应用软件),例如常用的文本编辑器、下载软件、即时通讯工具等,都可以通过J2SE实现。
Java SE包含了Java的核心类库,例如数据库连接、接口定义、输入/输出、网络编程等。
学习Java编程就是从J2SE入手。
Java EE(Java Enterprise Edition) 企业版
Java EE是功能最丰富的一个版本,主要用于开发高访问量、大数据量、高并发量的网站,例如美团、去哪儿网的后台都是Java EE 。通常所说的JSP开发就是Java EE的一部分。
Java EE包含Java SE中的类,还包含用于开发企业级应用的类,例如EJB、servlet、JSP、XML、事务控制等。
Java EE也可以用来开发技术比较庞杂的管理软件,例如ERP系统(Enterprise Resource Planning,企业资源计划系统)。
Java ME(Java Micro Edition) 微型版
Java ME 只包含Java SE中的一部分类,受平台影响比较大,主要用于嵌入式系统和移动平台的开发,例如呼机、智能卡、手机(功能机)、机顶盒等。
在智能手机还没有进入公众视野的时候,你是否还记得你的摩托罗拉、诺基亚手机上有很多Java小游戏吗?这就是用Java ME开发的。
Java的初衷就是做这一块的开发。
2.Java开发环境的配置
JDK(Java Development Kit) ,是Java开发工具包,它提供了Java的开发环境和运行环境。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。
JRE(Java Runtime Enviroment)是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
为什么设置JAVA_HOME:
1.为了方便引用,避免每次引用都输入很长的路径串;
2.归一原则, 当JDK路径改变的时候, 仅需更改JAVA_HOME的变量值即可。
3.第三方软件会引用约定好的 JAVA_HOME 变量, 不然, 你不能正常使用该软件。
如何设置JAVA_HOME:
在系统环境变量那一栏中点 -> 新建 JAVA_HOME (JAVA_HOME指向的是JDK的安装路径)
path 变量
path 变量使得我们能够在系统中的任何地方运行java应用程序,比如 javac、java等等,这就要找到我们安装 JDK 的目录,假设我们的JDK安装在 C:\jdk1.6.0 目录下,那么在 C:\jdk1.6.0\bin 目录下就是我们常用的 java 应用程序,我们就需要把 C:\jdk1.6.0\bin 这个目录加到 path 环境变量里面。
同时,path变量可以配置任何应用程序以便于在系统中直接调用,例如:把qq.exe的路径放入path,在命令行界面输入qq,回车即可打开qq。
classpath 变量
classpath 环境变量,是当我们在开发java程序时需要引用别人写好的类时,要让 java 解释器知道到哪里去找这个类。通常,sun 为我们提供了一些额外的丰富的类包,一个是 dt.jar,一个是 tools.jar,这两个 jar 包都位于 C:\jdk1.6.0\lib 目录下,所以通常我们都会把这两个 jar 包加到我们的 classpath 环境变量中 set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。
变量名:JAVA_HOME
变量值:
C:\Program Files (x86)\Java\jdk1.8.0_91 // 要根据自己的实际路径配置
变量名:CLASSPATH
变量值:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个"."
变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
注意在完成配置环境变量后测试JDK是否安装成功时键入命令:java -version
3.Java类库及组织结构
Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API。
API(Application Programming Interface, 应用程序编程接口)。
假如有人编了一个很好用的类,但这个类很复杂,不便于读完,但又想要用。而且对方也想要保护版权,不想让我们看。那么他就先编译这个类,附上一个使用文档,告诉我们怎么用,有哪些方法属性,我们只需要按照说明调用就能直接使用。文档中描述的类的使用方法,就叫做API。
Java类库的包的命名
为了防止重名,有一个惯例:大家都以自己域名的倒写形式作为开头来为自己开发的包命名,例如百度发布的包会以 com.baidu.* 开头,w3c组织发布的包会以 org.w3c.* 开头……
组织机构的域名后缀一般为 org,公司的域名后缀一般为 com,可以认为 org.* 开头的包为非盈利组织机构发布的包,它们一般是开源的,可以免费使用在自己的产品中,不用考虑侵权问题,而以 com.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。
4.Java import和Java类的搜索
import语法为:import package1[.package2…].classname;package 为包名,classname 为类名。
Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。
Java类的搜索路径
Java程序运行时要导入相应的类,也就是加载 .class 文件的过程。
安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVA_HOME%\lib。
Java运行环境将依次从当前路径、类库路径寻找导入的类,若找不到,编译会报错
可以在CLASSPATH变量中增加搜索路径,例如 .;%JAVA_HOME%\lib;C:\javalib,那么你就可以将类文件放在 C:\javalib 目录下,Java运行环境一样会找到。
单类型导入(single-type-import)
例如import java.io.File;
按需类型导入(type-import-on-demand),例如 import java.io.*;
单类型导入比较好理解,仅仅导入一个public类或者接口。而对于按需类型导入,有人误解为导入一个包下的所有类,其实他只会按需导入,也就是说它仅仅导入当前类需要使用的类。
单类型导入和按需类型导入对类文件的定位算法是不一样的。
编译器的类文件定位方法大致可以理解为如下公式:
顶层路径名 \ 包名 \ 文件名。class = 绝对路径
对于单类型导入很简单,因为包明和文件名都已经确定,所以可以一次性查找定位。
对于按需类型导入则比较复杂,编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类文件查找定位。例如:
package com;
import java.io.*;
import java.util.*;
当你的类文件中用到了File类,那么可能出现File类的地方如下:
1、com.File \\ File类属于当前包
2、java.lang.File \\编译器会自动导入java.lang包
3、java.io.File
4、java.util.File
需要注意的地方就是,编译器找到java.io.File类之后并不会停止下一步的寻找,而要把所有的可能性都查找完以确定是否有类导入冲突。
结论:按需类型导入不会降低Java代码的执行效率,但会影响到Java代码的编译速度。
查看JDK的源代码就知道SUN的软件工程师一般不会使用按需类型导入。因为使用单类型导入至少有以下两点好处:
1.提高编译速度。
2.避免命名冲突。(例如:当你import java.awt.*;importjava.util.*后,使用List的时候编译器将会出编译错误)
当然,使用单类型导入会使import语句看起来很长。
5.Java的数据类型
1.基本数据类型
Java语言提供了八种基本类型。
byte:最小值 -128(-2^7);最大值是127(2^7-1);
short:最小值 -32768(-2^15);
最大值 32767(2^15 - 1);
int:最小值 -2,147,483,648(-2^31);
最大值 2,147,483,647(2^31-1);
long:最小值 -9,223,372,036,854,775,808(-2^63);
最大值 9,223,372,036,854,775,807(2^63-1);
2.引用数据类型
类、接口、数组都是引用数据类型。
在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如Dog 、Employee等。变量一旦声明后,类型就不能被改变了。
一个引用变量可以用来引用任何与之兼容的类型。
所有引用类型的默认值都是null。
3.数据类型转换
自动数据类型转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下: 低--------------------------------------------->高 byte,short,char-> int -> long -> float -> double
强制数据类型转换
强制转换的格式是在需要转型的数据前加上“( )”,然后在括号内加入需要转化的数据类型。
6.Java运算符
数学运算符
+ 、- 、* 、/ 、% 、++ 、--
关系运算符
== 、!= 、> 、< 、>= 、<=
位运算符
& 、| 、 ^ 、~ 、>> 、<< 、
逻辑运算符
&& 、|| 、! (& 、| 、!)
条件运算符
(a?b:c)
Instanceof
该运算符用于操作对象实例,检查该对象是否是一个特定类型
7.Java的数组
如果希望保存一组有相同类型的数据,可以使用数组。
数组的定义和内存分配
Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName;
Java在定义数组时并不为数组元素分配内存,因此[]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下: arrayName=new type[arraySize];其中,arraySize 为数组的长度,type 为数组的类型。
数组的初始化
你可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。
数组引用
可以通过下标来引用数组: arrayName[index];Java对数组元素要进行越界检查以保证安全性。每个数组都有一个length属性来指明它的长度。
数组的遍历
实际开发中,经常需要遍历数组以获取数组中的每一个元素。最容易想到的方法是for循环,不过,Java提供了“增强版” 的for循环,专门用来遍历数组,这种增强版的for循环也被称为”foreach循环“,它是普通for循环语句的特殊简化版。所有的foreach循环都可以被改写成for循环。但是,如果你希望使用数组的索引,那么增强版的 for 循环无法做到。
二维数组
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。
静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。
如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组) 。
正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。
8、两种简单排序
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
选择排序的基本思想:
第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;
第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;
以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。