【免责声明:】本笔记发表在hexo博客只便于个人学习使用,若涉及到版权,请联系个人,谢谢!
educoder头歌Java笔记
Coding中遇到的问题合集:
““.equals(name) 和name.equals(““) 的区别:
两个都是比较“”的地址和name的地址是否指向同一个地址,即判断name是否为“”;建议用前者,因为name可能是null,此时name.equals(“”)就会报错,而前者则会避免这个问题
避免了抛出空指针异常NullPointerException。
leetcode回文数:
- (s.charAt(i)).get(map) && map.get(s.charAt(i)),问题同上;出现了抛出空指针异常的问题,使用前者后,测试通过。
- 遇到了char与string的类型不匹配的情况,不可强制转换,最后利用string类的replace方法替换字符串,得到了解决。
对象的构造方法实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import java.util.Scanner;
public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String name = sc.next(); String sex = sc.next(); Person a=new Person(); Person b=new Person(name,sex); } }
class Person{ class swap{ public Person(){ public swap(int a,int b,int c){ System.out.println("一个人被创建了"); c=a;a=b;b=c;
} public Person(String name,String sex){ System.out.println("姓名:"+name+",性别:"+sex+",被创建了"); } }
|
千万注意!!!!!
变量名字一定看清楚,上面的代码中,误将name写成了neme!!!!!
JAVA
中变量
的命名和前面第一章所学的标识符
命名规则是一样的,不过还是有一些不同,总结下来规则与规范一共有六点:
由字母,下划线,美元符号($),数字组成,但第一个字符不能是数字。
如果变量名是复合型的那么我们采用驼峰式,或者蛇形式的方式。
驼峰式:teaCup
(表示茶杯的意思),stuAge
(学生年龄)
蛇形式:tea_cup
,stu_age
如果是单个单词就全小写就行了。
千万不要用中文拼音来表达:例如学生年龄:xueShengNianling
。
在一个方法中变量名不能重复。
变量一定要给自己一个确定的类型。
JAVA中的数据类型
Java
基本类型共有八种,基本类型可以分为三类,字符类型char
,布尔类型boolean
以及数值类型byte、short、int、long、float、double
。数值类型又可以分为整数类型byte、short、int、long
和浮点数类型float、double
。
基本类型不包括String
java类型转换
强制类型转换就是将:表数范围大的数向表数范围小的进行转换。
怎么使用Scanner
第一种方法:
在类的声明之前,引入扫描仪(Scanner
):
import java.util.Scanner;
在方法中创建一个扫描仪
Scanner input = new Scanner(System.in);
第二种方法:
引入并创建扫描器:java.util.Scanner s = new java.util.Scanner(System.in);
通过扫描仪获取从键盘输入的数据
int i = input.nextInt();
String s = input.next();
三目运算符之判断是否闰年?
result=(year%400==0 || year%4==0 && year%100!=0)? true:false;
System.out.println(year + “年是否为闰年:” + result);
运算符优先级别排序正确的是()
A、 由高向低分别是:()、 ! 、算术运算符、关系运算符、逻辑运算符、赋值 运算符;
循环综合练习:
Java中的两种循环:
在 Java 语言中,用于循环的语句有两个,一个是 for 循环,一个是 while 循环。而 for 循环其实还有两种实现方法,对于初学者来说,或许仅知道一般的 for 循环,即:
1 2 3
| for(初始化条件; 限制条件; 迭代语句) { }
|
而不太了解高级的 for 循环,即:
1 2 3
| for(变量类型 变量名 : 集合) { }
|
在本文中,咱们就一起来了解了解这两种 for 循环的使用方法以及区别。
demo示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.util.Arrays;
public class ForDemo { public static void main(String[] args) {
int[] arr = new int[]{2, 0, 1, 5, 11, 20};
System.out.println("第一种 for 循环方法:");
for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); }
System.out.println();
System.out.println("高级的 for 循环方法:");
for (int i : arr){ System.out.print(i + " ");
}
System.out.println();
System.out.println("用 Arrays 的 toString() 方法打印数组:");
System.out.println(Arrays.toString(arr)); } }
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| ATM经典案例:
package step4;
import java.util.Scanner;
public class ForPractice4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("欢迎使用中国人民银行ATM取款机");
int capital = 1000;
while(true) {
System.out.println("输入取款金额:");
int a = input.nextInt();
if(a > capital) {
System.out.println("目前余额:"+capital+"无法满足您的取款需求!");
continue;
}else {
capital = capital - a;
System.out.println("剩余金额:"+capital+",是否继续('1':结束,'2':继续):");
int change = input.nextInt();
if (change == 1) {
System.out.println("取款结束!");
break;
}else {
continue;
}
}
}
}
}
|
第1关:将给定的整数进行由小至大排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| int a
if(x>y){
a=y
y=x
x=a
}
if(x>z){
a=x
x=z
z=a
}
if(y>z){
a=z
z=y
y=a
}
|
关于质数:(难度级别:⭐⭐⭐)
级别1:解题代码2022-07-02 23:30已解锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package step2; public class FindZhiShu { public static void main(String[] args) {
System.out.print(2+" "); OUT: for (int i = 3; i <= 1000; i+=2) { for (int j = 2; j < i; j++) { if(i % j == 0) { continue OUT; } } System.out.print(i+" "); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package step2; public class FindZhiShu { public static void main(String[] args) {
a:for(int i = 2;i < 1000;i++){ for(int j = 2;j<i;j++) if(i%j==0){ continue a; } System.out.print(i+" "); } } } **********************改进之后的代码********************* package step2; public class FindZhiShu { public static void main(String[] args) {
System.out.print("2 "); a:for(int i = 3;i < 1000;i+=2){ for(int j = 2;j<i;j++) if(i%j==0){ continue a; } System.out.print(i+" "); } }
}
|
拓展知识:(break与continue)
break关键字
先来看一段代码的运行效果,如下:
可以发现只要你一直输入1
程序就会不断的提示你输入选项,可是当你输入2
的时候程序就会终止,你能根据这个运行结果想到要实现这个效果,需要编写什么代码吗?
可能你已经猜到了,需要使用到break
关键字,break
翻译过来是“打断”的意思,放在Java
程序中的作用就是:结束整个循环过程
好了,现在来一起看看刚刚那段效果的源代码吧。
现在你应该基本了解break
的用法了,不过我还有个小秘密要告诉你:
如果我们在循环中使用switch
语句,那么在switch
语句中break
就不能结束当前循环了,而只能结束switch
语句。
continue关键字
continue
关键字的用途是:结束一次循环事件,开始下一个循环事件,也就是忽略该语句之后的语句,执行循环体的下一次循环。
例如:
1
| int i = 0; while(i < 4){ if(i == 2){ i++; continue; } System.out.println(i); i++; }
|
输出结果:
0
1
3
static关键字
关于静态代码块你只需要记住一句话:在类被加载的时候运行且只运行一次。
静态方法不能使用类的非静态变量;
静态方法可以直接调用静态方法,但是调用普通方法只能通过对象的实例才能调用。
数组的两种初始化方法:
1.静态初始化
在程序运行前就能确定数组的大小和数组中的初始数据我们称之为静态初始化。
例如:
1
| float[] stuScores = {80.0f,70.0f,90.0f,66.5f}; int[] nums = {80,70, 90,66}; char[] chs = {‘a’,’b’, ‘c’,’d’};
|
2.动态初始化
数组的大小或数组中数据在程序运行时才能决定,且用到new
这个关键字来确定数组的大小或初始数据我们称之为动态初始化。
定义数组:变量类型[] 数组名 = new 数据类型 [ 数组长度 ];
定义数组与初始化分离:
赋值:
初始化之后就可以向数组中放数据了,数组中元素都是通过下标来访问的,例如向 stuScores
数组中存放学生成绩:
动态创建数组并循环赋值:
1 2 3 4 5 6 7
| int[] arr = new int[sc.nextInt()];
for(int i = 0 ; i< arr.length ; i++){
arr[i] = sc.nextInt();
}
|
数组基础
如何获取数组的长度:
数组的length
属性用于记录数组中有多少个元素或存储单元,即记录数组的长度是多少。
1 2
| int[] nums = new int[10]; System.out.println(nums.length);
|
输出:10
一维数组的遍历:
通俗的理解,遍历数组就是:把数组中的元素都看一遍。
示例如下:
1 2 3 4 5
| int[] arr = {1,3,5,7,9}; for(int i = 0 ; i<arr.length; i++){ System.out.print(arr[i] + ","); }
|
二维数组的遍历:
1 2 3 4 5
| for(int i =0;i<scores.length;i++){ for(int j=0;j<scores[i].length;j++) System.out.println(scores[i][j]); System.out.println(); }
|
如何获取数组的最大值:
要求出数组的最大值,是不是很像是打擂台呢?
对于一群人我们不知道谁最厉害,所以我们准备一个擂台,并挑选第一个人为擂主(max),擂台下的人不断的(循环)来挑战擂主。
数据类型强制转换:
测试输入:5
,1
,151
,12
,22
,100
; 预期输出:
平均值:57.2
最大值:151
提示:
1
| int a = 3; int b = 2; System.out.println(a/b); System.out.println((double)a/b);
|
输出:
1
1.5
例题如下:
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,计算并输出数组的平均值和最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package step3;
import java.util.Scanner;
public class HelloWorld { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] scores = new int[sc.nextInt()]; for(int i = 0 ; i< scores.length;i++){ scores[i] = sc.nextInt(); } int sum=0,max=0; double av=0; for(int i=0;i<scores.length;i++){ sum+=scores[i]; } av=sum/scores.length; for(int i=0;i<scores.length;i++){ if(max<scores[i]){ max=scores[i]; } } System.out.println("平均值:" +av ); System.out.println("最大值:" +max ); } }
|
获取二维数组的行列长度:
二维数组定义:int array[][] = new int[3][3];
获取行数: int rowLength = array.length;
获取列数: int colLength = array[0].length;
二维数组的遍历
1 2 3 4 5 6 7
| class Test{ for(int i = 0; i < array.length; i++){ for(int j = 0; j < array[i].length; j++){ System.out.println(array[i][j); } } }
|
知识拓展
for-each
for-each 循环通常用于遍历数组和集合,它的使用规则比普通的 for 循环还要简单,不需要初始变量,不需要条件,不需要下标来自增或者自减。来看一下语法:
1 2 3
| for(元素类型 元素 : 数组或集合){
}
|
来看一下示例:
1 2 3 4 5 6 7 8 9
| public class ForEachExample { public static void main(String[] args) { String[] strs = {"沉默王二", "一枚有趣的程序员"};
for (String str : strs) { System.out.println(str); } } }
|
输出:
两数交换:
两个变量数值的交换有三种换发:
(1)借助中间量交换 (开发常用)
理解:三个杯子,两杯装水,其中一个空杯子用作容器。
int x = 10;
int y = 20;
int z = x;
x = y;
y = z;
(2)位移运算交换 (面试常用)
理解:涉及到了异或运算符的规则:一个数对另一个数位异或两次,该数不变
int x = 10;
int y = 20;
x = x ^ y;
y = x ^ y;
x = x ^ y;
(3)数值相加减交换
理解:先求得两数的和再进行减运算
int x = 10;
int y = 20;
x = x + y;
y = x - y;
x = x - y;
排序
选择排序:
实现过程
为了实现选择排序,我们需要求出最大值,并且和相比较的数据交换位置:接下来我们对数组int[] arr = {6,5,8,0,2,9}
来进行第一趟循环,将最大值移动到数组的第一位。
代码实现:
1
| int[] arr = {6,5,8,0,2,9};for (int i = 0; i < arr.length-1; i++) { if(arr[0] < arr[i+1]){ int temp = arr[0]; arr[0] = arr[i+1]; arr[i+1] = temp; } }
|
一次循环操作就可以找出数组中的最大值,并将其移动到数组的首位,所以对于一个长度为6
的数组,我们只需要进行5
(length-1)次上述操作即可将数组降序排序了。
接下来我们进行第二趟循环,求第二大的值,并将其移动到数组的第二个位置。因为我们已经求出了最大值,所以这一次循环,最大值不用参与比较。
代码实现:
结果:[9, 8, 5, 0, 2, 6]
可以发现经过两轮循环我们找出了数组中最大的两个值,并且移动他们到了数组的前两位。
现在按照上述步骤就可以实现数组的排序了,不过如果我们照搬上述代码,就会有很多冗余的代码,所以需要你来改进,怎么改进是需要你思考的。
告诉你一个秘密:使用Arrays.toString(数组)
可以直接输出数组中的值哦!
如下:
输出结果:[6, 5, 8, 0, 2, 9]
思考题:
本关所讲述的选择排序是一个简化版本,如果你想要学习优化版可以根据下列图片,编写出相应代码,然后在评论区贴出来哦。
上图就是一个使用选择排序将一个数组中数据从小到大排序的过程,请思考如何用代码实现上述过程。
原理:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
本关难度较大,但这是学习数组绕不过去的一关,多思考,多尝试,你能成功的,加油!