5java SE基本知识回顾
JDK,JRE,JVM
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9mvhPTk-1546249525603)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711091207558.png)]
API即接口、
environment即环境、
development kit即开发者工具、
jvm即java虚拟机,相当于一种规范,可以用硬件/软件实现,相当于在所有的操作系统上模拟了一个小小的cpu用于处理java的程序,实现了一次编译到处运行。
使用IDEA开发软件
在src目录下创建新程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phH9JNjj-1546249525605)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711094054985.png)]
并在C(类:class)中输入class文件名:Hello
快捷键 psvm 将自动生成
public static void main(String[] args) {}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSETmYsb-1546249525606)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711094347366.png)]
快捷键sout将自动生成
System.out.println();
程序运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdTu0v9a-1546249525608)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711094720989.png)]
class文件保存在
xxx\out\production\Project
java文件保存在
xxx\src
关键字回顾
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5gjgDhD-1546249525609)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711095525792.png)]
有很多已经不怎么熟悉了。。。(悲)
常见面试题分析
-
问:Path与CLASSPATH的区别
答:Path是操作系统的环境属性,指的是可以执行命令的程序路径
-
问:银行等需要精确业务需要?
答:精确的比较需要用到BigDecimal(一个数学工具类),关于数值的比较尽量不要用到浮点数,因为浮点数是近似的,离散的。
-
问:如何更快的计算出2^3?
答:按位左移俩位(x<<2)
JAVA的起步知识点
-
java是以类为单位,所以所有的程序都必须在class定义范围内,关于class的定义有俩种形式:
class Demo01{} public class Demo01{}
如果在开发中类的定义使用了public class声明,那么文件名必须与该类名保持一致。
-
在一个.java文件里可以存在多个class定义,并且在编译后会自动将不同的class保存在不同的class文件中。
-
每次使用java命令执行一个class的时候,都会启动JVM,JVM通过classpath给出的路径加载所需要的类文件,可以通过set classpath设置类的加载路径。
-
数据类型包括了基本数据类型与引用数据类型,
基本数据类型包括了一系列:boolean,byte,char,short,int,long,float,double等
引用数据类型则是以一种特殊方式指向变量的实体,类似于C++中的指针,这种变量在声明时是不自动分配内存的,必须另外开辟内存空间操作。
java基本数据类型大小
序号 数据类型 大小/位 可表示的数据范围 1 int 32 ±2^31(一位符号位) 2 short 16 ±2^15 3 long 64 计算方式如上 4 float 32 ±3.4E38 5 double 64 ±1.7E308 6 char 2 0~65536 7 byte 8 -128~+127 java中Double数据类型尾巴的D或d是可有可无的,而float类型后面必须加上F或f
-
boolean需要赋初值,否则默认等于false。[idea中会报错]
-
NOT运算在idea中并不能对int型数据等运算,会报错
-
大于(>)小于(<)等于(==)的运算结果是boolean型
-
if-else语言格式为:
if(boolean xxx){ something;}
-
&与 ; |或 ;&&短路与 ;||短路或 ;返回boolean型
-
运算符
^ 异或(相同为0不同为1) ~ 取反(反码) << 左位移 >> 右位移 >>> 无符号右位移 | 按位或 & 按位与 无符号位移无脑前面补0,一般位移根据符号情况补0或1.
public static void main(String[] args) { System.out.println(3^4);//0011 0100 ==> 0111(7) 相同为0不同为1 System.out.println(3|4);//0011 0100 ==> 0111(7) 俩者重合一1则1 System.out.println(3&4);//0011 0100 ==> 0000(0) 俩者重合全1则1 System.out.println(4>>2);//0100向右位移2位==>0001(1) System.out.println(3<<2);//0011想左位移2位==>1100(12) }
你的老朋友:三元运算符
public static void main(String[] args) { int score = 88; String str = score>60 ? "合格了":"没有合格"; System.out.println(str); }
-
一个很有趣的现象
public static void main(String[] args) { int a = 10; int b = 20; System.out.println(""+a+b); System.out.println(a+b+""); }
终端:
1020
30即字符串连接符+的运算顺序是严格的从左到右;
JAVA的基本码字规范
-
类名的每一个单词首字母要大写
class JavaDemo01{}
-
JAVA的标识符不能以数字开头,也不能是保留关键字,不能有空格。
JAVA中数制的观念
public class Hello {
public static void main(String[] args) {
int num1 = 12;int num2 = 010;int num3 = 0x0010;
char c1 = '\u0061';
System.out.println(num1+"\n"+num2+"\n"+num3);
System.out.println(c1);
}
}
终端:(分别对应十进制,八进制0开头,十六进制0x开头,unicode转义字符)
12
8
16
a
常用转义字符:\t(制表符,类似tab形成的四个空格),\n(换行)
所有浮点型都是近似的、离散的、含有误差的、要避免使用浮点型进行数值比较
故银行业务等精确业务应该使用BigDecimal(一个数学工具类)
JAVA的选择与循环语句
if-else if-else语句:
public static void main(String[] args) {
int num = 88;
if (num > 100 || num < 0) {
System.out.println("error");
} else if (num >= 60) {
System.out.println("good");
} else {
System.out.println("not good");
}
}
switch语句:
jdk1.5以前,switch()中只能为常量或者字符,1.5以后支持枚举类型,1.7以后支持String型
记得每个case里应有break,否则将会无条件执行符合的case语句及其下面的语句
public static void main(String[] args) {
//原始:
char open = '+';
switch(open){
case 'x':{
System.out.println("it's X");
break;
}
case '+':{
System.out.println("it's +");
break;
}
case '-':{
System.out.println("it's -");
break;
}
}
}
public static void main(String[] args) {
//1.7y以后switch中的选择值可以为字符串型
String str = "Hello";
switch (str){
case "nihao":{
System.out.println("it's nihao.");break;
}
case "Hello":{
System.out.println("it's Hello.");break;
}
}
}
while语句
方便实现累加:(1~4)
public static void main(String[] args) {
int i=0,sum = 0;
while (i<5){
sum+=i++;
System.out.println(sum);
}
}
do-while语句
先做,再判断
public static void main(String[] args) {
int sum,i;
sum = 0;i = 0;
do {
sum += i++;
}while (i<5);//此处有;容易忘记
System.out.println(sum);
}
for语句
public static void main(String[] args) {
int sum,i;
sum = 0;i = 0;
for(;i<5;sum+=i++){ //标准用法应在第一个空int i = 0;
}
System.out.println(sum);
}
一般来说,不确定循环次数,确定循环条件用while,反之用for
foreach循环
public static void main(String[] args) {
int[] num = {10,20,30,40,50};
for(int x:num){
System.out.println(x);
}
}
将num的内容逐一赋值给x,赋完即结束。适用于数组,集合等…
continue与break
老生常谈的:break跳出该循环体,continue跳出本次循环。
Scanner方法交互
基本概念
Scanner方法需要:
import java.util.Scanner;
nextlnt():只读取int值,就是只能读取整数类型的数据,如果输入了非整型的数据(浮点型字符串等)就会报错。
nextFloat()、nextDouble()输入整数、小数都会得到true,不能用此来识别其是否为小数。
还有hasNextInt(),hasNextFloat()这些判断方法。
当你**Scanner scan=new Scanner(System.in)**时,并不接收键盘信息流,在后续的scan.next()、scan.hasNext()时才会接收信息流。
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
-
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
-
2、可以获得空白。
容易遇到的问题
在使用nextInt(),nextDouble()等类似读入方法后,再用nextLine(),line将会直接被跳过,原因跟C++中scanf,cin吞回车是一个原理,理解为输入数据时一次性将所有数据打入键盘缓存区,然后nextint()读到空格/回车前一个有效字符为止,并不会处理该空格,回车。然后留在缓存区,顺序读取到下一个nextline()时直接从缓存区吃了上次余下的数据。不给你输入的机会。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("please enter the number and word");
int num1 = scan.nextInt();
String str = scan.nextLine();
System.out.println("num1 = "+num1+",str = "+str);
}
lease enter the number and word
110
num1 = 110,str =
解决的方法也和C++类似,在line()前面再加一个scannner.nextline()吃掉不该存在的空格即可
int num1 = scan.nextInt();
scan.nextLine();
String str = scan.nextLine();
please enter the number and word
110
i have a dream
num1 = 110,str = i have a dream
如果是nextInt()后跟了nextFloat(),键盘输入小数,nextInt()是不会接受键盘数据的,也会遗留在缓存区。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("please enter the number");
int i = 0;float f = 0.0f;
if(scan.hasNextInt()){
System.out.println("it's intnumber "+i);
}else{
System.out.println("it's not intnumber");
}
f = scan.nextFloat();
System.out.println("the number is "+f);
scan.close();
}
please enter the number
10.1
it's not intnumber
the number is 10.1
进程已结束,退出代码为 0
此例f被遗留在缓存区的10.1直接补上。
数组与方法
数组基本概念
俩种声明方法:
-
int score[] = null;score = new int[3];
前者在栈内存中保存了数组名,后者根据括号里的长度以及score类型开辟一块堆内存供数组使用。
-
int[] score = new int[3]
因此数组变量score保存的并非是数组的实体,而是数组堆内存的参考地址。
在数组操作中,栈内存保存的永远是数组的名称,而一个人可以有多个名字,参考C++指针
-
数组的静态初始化:
int score[]={0,1,2,3,4,5};
-
二维数组的声明格式:
int score[] [];
score = new int[4] [3];
或者:
int score = new int [4] [3];
-
二维数组的静态初始化:
int score[] [] = {{61,62},{70,88,91},{34}}
其中输出常用到score[0].length,是第一行的长度。
排序算法复习
-
取得长度:
int score[] = new int[3];
int length = score.length;
-
排序(从小到大)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K6Bz3LKd-1546249525612)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220713095845910.png)]
-
冒泡排序:
public static void main(String[] args) { int[] score = {67, 51, 64, 32, 88, 94, 20, 64, 25, 75}; //冒泡排序,从小到大 for(int i = 0;i<score.length-1;i++){ for(int j = 0;j<score.length-i-1;j++){ if (score[j] > score[j+1]){ int temp = score[j]; score[j] = score[j+1]; score[j+1] = temp; } } } for(int x:score){ System.out.print(x+"\t"); }
-
选择排序:
public static void main(String[] args) { int[] score = {67, 51, 65, 32, 88, 94, 20, 64, 25, 75}; //选择排序,从小到大 for(int i = 0;i<score.length-1;i++) { int min_num = i; for (int j = i+1;j< score.length;j++){ //从i+1开始遍历比较,记录下最小值下标。 if (score[j]<score[min_num]){ min_num = j; } } if (min_num != i){ //最小值下标若有变,则交换以i与min_num为下标的数的位置 int temp = score[min_num]; score[min_num] = score[i]; score[i] = temp; } } for(int x:score){ System.out.print(x+"\t"); } }
-
方法基本概念
-
拾起概念:无法由static方法调用非static方法。
-
public应与private、friendly、protected相互辨别记忆(不写时默认为default)
作用域 当前类 同一package 子孙类 不同package public O O O O protected O O O X default O O X X private O X X X -
static直译为静态的,类似C++中全局的概念
用于修饰方法或变量,也可以用来形成static代码块、
详情请见面向对象笔记
-
方法的重载只使用与参数类型上和个数上的不同,对于返回值的不同不支持重载。
-
方法的递归调用:(常用于计算累加累乘)
public static void main(String[] args) { System.out.println("100!的结果是:"+sum(100)); } static int sum(int num){ if (num ==1) { return 1; }else{ return num+sum(num -1); } }
数组的引用传递:
即,传数组进方法里修改值,能够改变。
使用方法引用或返回数组:
public class Demo01{
public static void main(String[] args) {
int[] temp= fun();
ptint(temp);
}
private static void ptint(int[] num) {
for (int i = 0;i< num.length;i++){
System.out.println(num[i]);
}
}
private static int[] fun() {
int ss[] = {1,2,3,4,5};
return ss;
}
}
利用java类库进行数组排序:
java.util.Arrays.sort(array);
对数组进行复制:
System.arraycopy(i1,0,i2,1,4); //其中4为length
包机制
基本概念回顾
-
为了更好的组织类,java提供了包机制,用于区别类名的命名空间。
(个人理解其作用和文件夹基本一致,为了避免同时开发,类名(文件名)称容易相同的情况)
-
包语句的语法格式为:(打包)
package pkg1[. pkg2[. pkg3...]]
-
一般利用公司域名倒置作为包名;
-
为了能够使用某一个包的成员,我们需要在java程序中明确导入该包,使用“import”语句可以完成此功能
import package1[.package2...].(classname|*);
-
www.*就会导入这个包下所有的类!
-
www.demo01.*就会自动加载所需类!
例:引用其他包中相同类的方法
com.seohyun.www.base包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sk0KqURJ-1546249525613)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711235535676.png)]
com.seohyun.www.operator包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bL0RzF0B-1546249525614)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220711235653396.png)]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJc6X4vq-1546249525615)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220712000016854.png)]
**注意:当你导入的类与本身,或导入多个类中有重名现象,在使用其方法时一定要全称,不然会指代不清而报错。
JAVADoc生成文档
java doc命令是用于生成自己的API文档
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-owYTkqzg-1546249525616)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220712084805351.png)]
基本概念
文档注解:
/**+空格 自动生成
doc命令:
javadoc -d 路径 -encoding UTF-8 -charset UTF-8 Doc.java
- -d 指定API文档的输出目录,默认是当前目录。建议总是指定该参数。
- -encoding UTF-8 表示你的源代码(含有符合 JavaDoc 标准的注释)是基于 UTF-8 编码的,以免处理过程中出现中文等非英语字符乱码
- -charset UTF-8 表示在处理并生成 JavaDoc 超文本时使用的字符集也是以 UTF-8 为编码,目前所有浏览器都支持 UTF-8,这样最具有通用性,支持中文非常好
举例
package com.seohyun.www.base;
/**
* @author seohyun
* @version 1.0.0
* @since 1.8
*/
public class Doc {
String name;
/**
* @author seohyun
* @param name
* @return
* @throws Exception
*/
public String test(String name) throws Exception{
return name;
}
}
再open on Explorer,并在当前文件夹cmd
C:\Users\23614\Desktop\Java学习\Project\src\com\seohyun\www\base>javadoc -encoding UTF-8 -charset UTF-8 Doc.java
正在加载源文件Doc.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.8.0_333
正在构建所有程序包和类的树...
正在生成.\com\seohyun\www\base\Doc.html...
Doc.java:13: 警告: @param 没有说明
* @param name
^
Doc.java:14: 警告: @return 没有说明
* @return
^
Doc.java:15: 警告: @throws 没有说明
* @throws Exception
^
正在生成.\com\seohyun\www\base\package-frame.html...
正在生成.\com\seohyun\www\base\package-summary.html...
正在生成.\com\seohyun\www\base\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses-frame.html...
正在生成.\allclasses-noframe.html...
正在生成.\index.html...
正在生成.\help-doc.html...
3 个警告
C:\Users\23614\Desktop\Java学习\Project\src\com\seohyun\www\base>
此时当前文件夹将生产一堆html等东西:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTsbGfog-1546249525618)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220712090934412.png)]
点开发现已经替你生成好了API文档:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZs7SZs6-1546249525619)(C:\Users\23614\AppData\Roaming\Typora\typora-user-images\image-20220712091042181.png)]
有说明
* @param name
^
Doc.java:14: 警告: @return 没有说明
* @return
^
Doc.java:15: 警告: @throws 没有说明
* @throws Exception
^
正在生成.\com\seohyun\www\base\package-frame.html…
正在生成.\com\seohyun\www\base\package-summary.html…
正在生成.\com\seohyun\www\base\package-tree.html…
正在生成.\constant-values.html…
正在构建所有程序包和类的索引…
正在生成.\overview-tree.html…
正在生成.\index-all.html…
正在生成.\deprecated-list.html…
正在构建所有类的索引…
正在生成.\allclasses-frame.html…
正在生成.\allclasses-noframe.html…
正在生成.\index.html…
正在生成.\help-doc.html…
3 个警告
C:\Users\23614\Desktop\Java学习\Project\src\com\seohyun\www\base>
此时当前文件夹将生产一堆html等东西:
[外链图片转存中...(img-fTsbGfog-1546249525618)]
点开发现已经替你生成好了API文档:
[外链图片转存中...(img-CZs7SZs6-1546249525619)]