Java基础
1、JDK、JRE、JVM
JDK:Java开发工具包,包括JRE和开发的工具(如编译工具:javac.exe、打包工具:jar.exe等)
JRE:Java运行环境
JVM:Java虚拟机
![image-20210819202244987](https://gitee.com/LiDanveivei/xiangxiang-picture/raw/master/images/image-20210819202244987.png)
为什么要配置path环境变量?
为了在任何路径下都可以运行Java指令
2、使用文本文档进行java代码的编写
- 将java代码编写到
.java
为后缀名的文件中 - 通过
javac
命令对该java文件进行编译 - 通过
java
命令对生成的class
文件进行运行
![image-20210819203250048](https://gitee.com/LiDanveivei/xiangxiang-picture/raw/master/images/image-20210819203250048.png)
示例:
-
用记事本编写java代码,后缀名改为
.java
class HelloWorld{ public static void main(String[] args){ System.out.print("hello,Xiangxiang!"); } }
-
在该目录下打开cmd,输入
javac hello.java
进行编译出现错误!
错误原因为记事本文件编码为UTF-8,而Windows的cmd编码为GBK
解决方法:编译语句改为
javac -encoding UTF-8 hello.java
编译成功,出现
.class
文件 -
使用
java
命令运行.class
文件
3、注释
//
单行注释
/**/
多行注释
/** */
文档注释(java注释,注释内容可以被JDK
所提供的工具javadoc
所解析,生成一套以网页文件形式体现的该程序的说明文档)
文档注释示例:
-
添加文档注释
/** @author 李想想 @version v1.0 */ public class HelloWorld{ public static void main(String[] args){ System.out.print("hello,Xiangxiang!"); } }
-
通过
javadoc
进行解析javadoc -d myhello -author -version -encoding UTF-8 HelloWorld.java
运行成功,打开
index.html
网页
注意
- 使用
javadoc
解析的类必须声明为public
- 类名和文件名需要一致
- 解决中文乱码问题可以通过修改文件编码为
ANSI
或者编译时添加-encoding UTF-8
4、关键字、保留字、标识符
![image-20210819220425098](https://gitee.com/LiDanveivei/xiangxiang-picture/raw/master/images/image-20210819220425098.png)
保留字:现有Java版本尚未使用,但以后可能会作为关键字使用,如goto
、const
标识符:对各种变量、方法和类等要素命名时使用的字符序列
标识符命名规则
- 由26个英文字母大小写,0~9,下划线_,$组成
- 由英文字母,_或者$开头
- 不能使用关键字和保留字
- 不能有空格
- 严格区分大小写,长度无限制
5、变量
变量格式:数据类型 变量名 = 变量值
数据类型
-
基本数据类型
- 整型:
byte
(1字节)、short
(2字节)、int
(4字节)、long
(8字节,以L或者l结尾) - 浮点型:
float
(4字节,以F或者f结尾)、double
(8字节) - 字符型:
char
(2字节) - 布尔型:
boolean
运算规则
a)自动类型提升(容量小–>容量大)
byte
、char
、short
–>int
–>long
–>float
–>double
b)强制类型转换(容量大–>容量小)
```java double d1=12.9; int i1=(int)d1; System.out.print(i1); //输出为12 ```
注意
对于整型常量,默认类型为
int
型,对于浮点型常量,默认类型为double
型```java byte b=12; byte b1=b+1; //编译错误,1默认为int型 ```
- 整型:
-
引用数据类型
- 类:
class
- 接口:
interface
- 数组:
array
- 类:
String
-
几个例子
String s1="hello world"; String s2=3.5f+""; //3.5 System.out.println(3+4+"hello!"); //7hello! System.out.println("hello!"+3+4); //hello!34 System.out.println('a'+1+"hello!"); //98hello! Systrm.out.println("hello!"+'a'+1); //hello!a1
6、运算符
- 算术运算符
![image-20210820144943285](https://gitee.com/LiDanveivei/xiangxiang-picture/raw/master/images/image-20210820144943285.png)
注意
% 最终结果符号与被模数符号一致
- 赋值运算符:
=、+=、-=、*=、/=、%=
- 比较运算符:
>、<、<=、>=、==、!=、instanceof
- 逻辑运算符:
&、|、!、&&、||、^
- 位运算符:
<<、>>、>>>、&、|、^、~
- 三元运算符:
(条件表达式)?表达式1:表达式2
7、程序流程结构
顺序结构、循环结构、分支结构
8、Scanner类
-
导包
import java.util.Scanner;
-
Scanner
实例化Scanner in=new Scanner(System.in); int num=in.nextInt();
9、数组
常用算法
-
查找
二分法查找
//二分法查找 public void search(int[] array,int num){ int head=0; int end=array.length-1; while (head<=end){ int mid=(head+end)/2; if(num==array[mid]){ System.out.println("元素位置为"+mid); return; } else if(num>array[mid]){ head=mid+1; } else { end=mid-1; } } System.out.println("未找到指定元素!"); }
-
排序
-
插入排序
//插入排序 public void insertSort(int[] array){ for(int i=1;i<array.length;i++){ int temp=array[i]; int j=i-1; while (j>=0&&array[j]>=temp){ array[j+1]=array[j]; j--; } array[j+1]=temp; } }
-
快速排序
//冒泡排序 public void bubbleSort(int[] array){ for(int i=0;i<array.length;i++){ for(int j=0;j<array.length-1;j++){ if(array[j]>=array[j+1]){ int temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } } //快速排序 public void quickSort(int[] array,int low,int high){ int a=low,b=high; if(a>=b){ return; } int pivotkey=array[a]; while (a<b){ while (a<b&&array[b]>=pivotkey){ b--; } array[a]=array[b]; while (a<b&&array[a]<=pivotkey){ a++; } array[b]=array[a]; } array[a]=pivotkey; quickSort(array,low,a-1); quickSort(array,a+1,high); }
-
选择排序
//选择排序 public void selectSort(int[] array){ for(int i = 0; i < array.length - 1 ; i++){ int min = i; for (int j = i + 1; j < array.length ;j++){ if(array[j] < array[min]){ min = j; } } if(min != i){ int temp = array[min]; array[min] = array[i]; array[i] = temp; } } }
-
归并排序
public static void mergeSort(int[] a,int s,int e){ int m = (s + e) / 2; if (s < e){ mergeSort(a,s,m); mergeSort(a,m+1,e); //归并 merge(a,s,m,e); } } private static void merge(int[] a, int s, int m, int e) { int[] temp = new int[(e - s) + 1]; int l = s; int r = m+1; int i = 0; while (l <= m && r <= e){ if (a[l] < a[r]){ temp[i++] = a[l++]; }else{ temp[i++] = a[r++]; } } while (l <= m){ temp[i++] = a[l++]; } while (r <= e){ temp[i++] = a[r++]; } for (int n = 0; n < temp.length; n++) { a[s+n] = temp[n]; } }
Arrays工具类
-
10、面向对象
- 对象的内存解析
![image-20210903161542265](https://gitee.com/LiDanveivei/xiangxiang-picture/raw/master/images/image-20210903161542265.png)
引用类型的变量,只可能存储两类值:null
或地址值
JVM规范
-
虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中
-
堆,我们将new出来的结构(比如数组、对象)加载在堆空间中。补充:对象的属性(非
static
的)加载在堆空间中 -
方法区:类的加载信息、常量池、静态域
-
可变个数形参
-
格式:数据类型 … 变量名
-
当调用可变个数形参的方法时,传入的参数个数可以是:0个,1个,2个…
-
-
成员变量与局部变量
- 在类中的位置不同:成员变量在类中方法外,局部变量在类中方法内或方法声明上
- 在内存中的位置不同:成员变量在堆内存里,局部变量在栈内存里
-
权限修饰符
private
、缺省
、protected
、public