Java入门(一)
JAVA结构&版本
#20190724
-
编辑→编译→执行
- 记事本中编辑后,改后缀为.java文件;
- DOS命令窗口中:javac 文件名.java,会生成.class文件
- DOS中:java 文件名,执行.class文件
- 反编译:从.class→.java的过程
-
关于.class
- 生成的.class文件为字节码文件
- 字节码程序可以运行在任何一个JVM(java虚拟机)上,以实现一次编写,到处运行。
-
关于java的结构
- JDK:开发工具包
- JVM:虚拟机
- JRE:运行环境
- 关系:JDK>JRE>JVM
-
关于Java的三大版本
- JavaSE:标准版
- JavaME:微缩版
- JavaEE:企业版
- 关系:JavaEE>JavaSE>JavaME
-
eclipse快捷键
- ctrl + d 删除行
- alt + / 快速输出
-
JAVA之父:詹姆斯·高斯林
-
print和println的区别
- print 不换行,字符输出
- println换行
-
DOS命令
-
cd \ 返回根目录
-
e: 进入e盘
-
dir 查看目录
-
cd .. 返回上级目录
-
命名法&数据类型&运算符&进制转换
#20190725
-
typora字体及颜色设置方法
<span style="color:red;">这是比font标签更好的方式。可以试试。</span><font color=red size=4 face="黑体">color=#0099ff size=72 face="黑体"</font>这是比font标签更好的方式。可以试试。
color=#0099ff size=72 face="黑体"
-
命名规则P18
-
帕斯卡命名法和驼峰命名法(见名知意)
- 帕斯卡:GetUserName,常用于类名、接口名、枚举名
- 驼峰:getUserName,常用于变量名、方法名
-
注释
-
单行注释:ctrl + /
-
多行注释:ctrl + shift + /
-
文档注释:alt + shift + j
-
-
数据类型P21
- 引用数据类型:引用java中的类,有n种
- 基本数据类型:8种
- boolean(1)、byte(1)、short(2)、char(2)、int(4)、long(8)、float(4)、double(8)
- var 不确定数据类型,用的时候才知道
- 默认值:整型=0,浮点型=0.0、字符型=\u0000、布尔=false
- String类型是引用类
- char类型是表示字符型,字符型是用' '的单个字符
- long以L结尾,否则为int型;float以 f 结尾,否则默认为double型
-
基本数据类型和引用数据类型的区别
-
变量
-
[访问修饰符]变量类型 变量名[=初始值]
-
变量要先定义再使用,使用前要初始化
-
final修饰的变量是不可再被修改的变量,是常量
-
-
数据类型转换
-
自动转换 优先级级别:小→大
-
byte+short(+char)=int
-
任何类型+字符串=字符串
-
强制转换:byte+int→byte(可能会丢失精度)
int i =123; byte b=(byte)i;byte b = i; 是错误的
-
-
Scanner类
- 使用前要导入包:import java.until.scanner;(scan+alt+/ 会自动导入)
- 创建Scanner对象:Scanner input = new Scanner(System.in);
- 键盘获取:String next() 获得字符串;boolean hasNext()判断是否有数据输入,是则返回true,否则返回false
-
赋值运算符:+=、-=、*=、/=、%=
-
byte或short在使用+=或-=时,不用强制转换类型:
byte a =2; short b =3; a+=4;a=a+4; //错误,因为byte优先级小于int需要转换类型 byte→int
-
输入四位整数,分解获得各个位数
// 分解获得个、十、百、千位 int ge,shi,bai,qian; qian=num/1000; bai=num/100%10; shi=num/10%10; ge=num%10;
-
-
关系运算符
- ">" "<" ">=" "<=" 只支持数值类型比较
- “==” “!=” 支持所有数据类型比较
- 关系表达式运算结果是布尔值
- ">" "<" ">=" "<=" 优先级高于 “==” 和 “!=”
-
逻辑运算符P29
-
&:全true为true,无论判断结果如何,两边都会计算
&&:只要左边为false,另一边就不计算了
-
|:全false才false,无论判断结果如何,两边都会计算
||:只要左边为true,另一边就不计算了
-
-
位运算符P30
- &:1+1=1
- |:1+0=1
- ^:1+1=0;1+0=1
- <<:右侧补0(x左移n位=x *2^n)
- (右移)>>:左侧补最高位,即符号位(右移n位就 /2^n)
- (无符号右移)>>>:左侧空位补0
-
原反补
-
正数的原、反、补就是它本身
-
负数的反码=除符号位外其余取反
-
负数的补码=反码+1
-
-
-
进制转换
循环结构&断点&数组
#20190726
-
程序的基本结构:
- 顺序结构:从上至下依次执行,无判断/跳转/循环;
- 选择结构:单分支、双分支、多分支结构( if 和 switch 语句)
- 循环结构:while 、do-while 、for 、foreach;
-
if
if(表达式){ 语句 }- 表达式是布尔类型的表达式,值为true或false
- 语句必须包含{}
-
switch
switch(表达式){ case 常量1: 语句 break; …… default: 语句 break; }- default 是可选项,当所有条件都不匹配时执行default
- switch后的表达式允许是:int、byte、short、char、枚举类型、string类型
-
循环控制语句:
- while、do-while、for
- 一个循环由四部分组成:循环变量、循环条件、循环体、改变循环变量值
-
for
for(表达式1;表达式2;表达式3;){ 循环体 }-
表达式1 是循环变量的初始化,只执行一次
-
表达式2 是循环条件
-
表达式3 是改变循环变量的值
-
-
-
循环语句对比
循环 特点 使用场合 for 先判断,后执行 已知循环次数的情况下 while 先判断,后执行 先判断后执行,不知循环次数的情况下 do-while 先执行一次,后判断 需要先执行的情况,次数没有比while多一次 -
跳转语句
跳转语句 特点/作用 break 结束当前循环,在switch中是跳出switch语句;只能用于循环语句和switch语句中 continue 强制跳过本次循环剩余代码,开始执行下一次循环 return 结束当前return所在方法的执行,回到调用方法的语句处 -
断点
- 作用:在调试程序时停在断点处,单步执行,以便发现错误
- 步骤:
- 设置断点:双击要设置断点的代码左侧蓝色条
- 启动调试:启动Debug调试(甲壳虫按钮)
- 跟踪程序:即按键控制程序执行,F5“单步跳入”(跳入代码内部执行),F6"单步跳过"(不跳入,仅执行本行代码,执行完就跳到下一行)
- 双击断点处则取消设置断点
-
数组
-
名称 解释 数组 有相同数据类型 且按一定次序排列 的 一组变量 的集合体 数组元素 构成一个数组的每个数据 数组下标 数组元素在数组中的位置,从0开始递增 数组大小 数组元素的个数叫数组大小或数组长度 -
数组的使用
-
定义数组
数据类型[] 数组名;
int[] score;
-
为数组元素分配内存
数组名=new 数据类型[数组长度];
score=new int[5];
-
数组元素初始化
score[0]=1;
score[1]=2;
-
合成一步 int[] score=new int[]{123,12,104,11,5}; 或 int[] score ={123,12,104,11,5};
-
-
数组内存的分配
-
栈底是数组名称,因为栈是先进后出
数组是引用类型,所以默认值是null
内存地址编号是由操作系统分配的16进制数
-
基本数据类型变量中存储的是真实数据,引用类型变量中存储的是内存地址编号
-
new在java中是分配内存的作用,new的值在堆中
“=” 表示将new申请的内存空间首地址赋值给数组
-
心得体会
通过今天的学习,我对循环以及跳转语句有了更深更清晰的认识,但是如果说掌握,我感觉我还差了点。因为同一道题不同的想法就有不同的解法,不懂算法也可能会找错方法,差了点应该就是差在这吧。像课后习题第四题,如果没有给出代码让我自己写,大概率写不出来,可能还是得多练。
数组&冒泡排序&异常&Arrays类
#20190729
一、 数组
1.遍历数组元素
for(元素类型 变量名:要循环的数组或集合){}
例:
// 定义数组
int[] score=new int[10];
// 随机循环输入数组元素内容
for(int i=0;i<10;i++){
//Random要导包,35是随机数取值范围
score[i]=new Random().nextInt(35);
}
// 循环输出数组
for (int i : score) {
System.out.print(" "+i);
}
System.out.println();
2.Random伪随机数
- 正常用Random()时需要导入包:import java.util.Random;
- 在用Math.random()*10时不用导包,因为Math在lang包里;
- 10是随机数取值范围;
- 因为Math.random()是double类型,所以要强制转换;
二、排序
1.冒泡排序
-
定义:
- 从第一个数开始,与相邻的元素比较。如果第一个比第二个大,就交换它们两个的位置;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 注意只对相邻元素进行比较,每确定一个最大值为一轮
-
动图演示:

-
代码实现:
// 冒泡排序法 //外循环控制循环比较多少轮 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 i : score) { System.out.print(" "+i); }
2.十大经典排序法
三、常见异常
1.下标越界异常
java.lang.ArrayIndexOutOfBoundsException
-
若arrays下标为0~9,则arrays.lenght=数组长度=10
-
数组下标是从0开始的,也就意味着最后一个元素的下标是arrays.length-1。
-
如果下标大于arrays.length-1,就会抛出此异常
-
例子对比:
int[][] s = new int[][] {{0,1,2},{0,1,2,3}}; //不规则二维数组System.out.println(s[0] [3]); //数组下标越界int[][] s1 = new int[3][4]; s1[0][0] = 1; s1[0][1] = 2; s1[0][2] = 3; System.out.println(s1[0][3]);//不报错,因为在分配完内存后有默认值0
2.空指针异常
- 操作值为NULL的变量,会抛出此异常
- 当程序只给数组名分配空间,没有给数组元素分配空间,栈底数组没有指向堆的内存空间就是null
四、二维数组
1. 定义:
数据类型[][] 数组名称;
int[][] scores;
数据类型 数组名称[][];
int scores[] [];
2.分配内存:
`scores = new int[3][4];`

3. 赋值(初始化)
scores[0][0] = 0;//给二维数组第一行第一列赋值
scores[1][0] = 1;//给二维数组第二行第一列赋值
int[][] scores = new int[][]{{1,2,3},{2,3,4},{3,4,5}};
4.二维数组的遍历
public class Array {
/**
* 题目:
* 计算二维表格里每行每列的总和
*/
public static void main(String[] args) {
// 定义二维数组和变量成绩总和
int[][] score=new int[3][4];
int total=0;
// 定义二维数组内容,用随机数
for(int i=0;i<score.length;i++) {
for(int j=0;j<score[i].length;j++) {
score[i][j]=(int)(Math.random()*10);
System.out.print(score[i][j]+",");
}
System.out.println();
}
// 计算每行总和
for(int i=0;i<score.length;i++) {
// 放在控制行的开始,在执行完一行后total清零
total=0;
for(int j=0;j<score[i].length;j++) {
total+=score[i][j];
}
System.out.println("第"+(i+1)+"行总和="+total);
}
// 计算每列总和
// 这里不能用score[i].length取列数,因为i还没定义
for(int j=0;j<score[0].length;j++) {
// 放在控制列的开始,在执行完一列后total清零
total=0;
for(int i=0;i<score.length;i++) {
total+=score[i][j];
}
System.out.println("第"+(j+1)+"列总和="+total);
}
}
}
五、Arrays类
1.Arrays类常用方法
该类包含用于操作数组的各种方法(如排序和搜索)。
例如:
| 方法 | 返回值 | 说明 |
|---|---|---|
| equals(a,b) | boolean | 如果两个指定的字节数组彼此 相等 ,则返回 true |
| sort(a) | void | 按升序排列数组的指定范围 |
| toString(a) | String | 返回指定数组的内容的字符串表示形式 |
| fill(a,val) | void | 将指定的val值分配给指定数组的指定范围的每个元素 |
| copyOf(a,length) | 与数组类型一致 | 复制指定的数组,用零截取或填充(如有必要),以便复制具有指定的长度 |
| binarySearch(a,val) | int | 使用二叉搜索算法搜索指定数组的下标。 |
补充:arraycopy方法
System.arraycopy(Object src, int srcPos,Object dest,int destPos, int length)
src参数是指不是数组的对象。
dest参数是指不是数组的对象。
src参数和dest参数是指组件类型是不同的基本类型的数组。
src参数是指具有原始组件类型的数组, dest参数是指具有引用组件类型的数组。
src参数是指具有引用组件类型的数组, dest参数是指具有原始组件类型的数组。
2.equals()和“==”
- equals用于判断两个字符串/数组是否相等,
- “==”用于判断内存地址是否相等
- 源码内equals()封装时用的也是”==“
3.sort()
-
使用时要导入包:import java.util.Arrays;
-
Arrays.sort(要排序的数组名);
-
for(int i=0;i<array.length;i++) { Arrays.sort(array); System.out.print(array[i]+","); }
4.toString()
-
专门输出数组内容的方法,将一个数组转换为字符串并输出,
-
按顺序把多个数组元素连在一起,多个数组元素间用“, ”隔开
-
int[] array=new int[] {23,45,13,47,5,98,5,32,34,54}; System.out.println(Arrays.toString(array));输出:[23, 45, 13, 47, 5, 98, 5, 32, 34, 54]
-
// 直接输出数组arr1,结果是输出了arr1所在地址:[I@15db9742 System.out.println(arr1);
5.copyOf()和arraycopy()
- copyOf() 把数组复制成指定长度的新数组,用零截取或填充,以便复制具有指定的长度。
public static void main(String[] args) {
int[] arr=new int[] {12,34,56,78,9};
// 使用copyOf复制arr为长度是三的新数组arr1
int[] arr1 =Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(arr1));
}
- arraycopy() 把一个数组复制到新数组的对应位置
心得体会
今天学的内容感觉比较多一点,需要练习,时间有点不够;很多时候都是看老师写挺顺的,自己写起来就会发现很多要注意的问题,也不是不会,就是不够熟练。