《Java技术》第二次作业
Java第二次作业
一 . 学习总结
1 . String类的equals()方法及其实现方法
- equals()方法截图
-
equals()方法判断的是字符串内容,字母的大小写必须相同
-
equalsIgnoreCase()方法判断的是字符串内容,不区分字母大小写
-
compareTo()方法按照字典顺序,字母按照Unicode值比较,区分字母大小写
-
注意equals()方法与的区别,equals()方法比较的是字符串的内容,而比较的是字符串存储的地址
- 综合实例 :
import java.util.Scanner;
public class exciese {
public static void main(String args[]) {
System.out.println("请输入字符串 : ");
Scanner Scan = new Scanner(System.in);
String str = Scan.nextLine();
String str1 = "hello";
// equals方法
System.out.println("equals方法 : ");
if (str1.equals(str)) {
System.out.println(" true");
} else {
System.out.println(" false");
}
// equalsIgnoreCase方法
System.out.println("equalsIgnoreCase方法 : ");
if (str1.equalsIgnoreCase(str)) {
System.out.println(" true");
} else {
System.out.println(" false");
}
// compareTo方法
System.out.println("compareTo方法 : ");
if (str1.compareTo(str) > 0) {
System.out.println(" 1");
}
if (str1.compareTo(str) < 0) {
System.out.println(" -1");
}
if (str1.compareTo(str) == 0) {
System.out.println(" 0");
}
// ==方法
System.out.println("==方法 : ");
if (str1 == str) {
System.out.println(" true");
} else {
System.out.println(" false");
}
}
}
2 .构造方法及其构造方法的重载
-
构造方法 :
是一种特殊的方法,构造方法的名字必须与定义他的类名完全相同,并且没有返回类型,使用new关键字创建一个对象时需要调用构造方法,构造方法的作用是初始化对象。 -
构造方法的重载 :
构造方法的重载条件1
参数类型不同,条件2
参数个数不同。 -
此实例是不可以重载的,因为实例化对象时,调用的构造方法并不是构造的有参数的构造方法
- 修改方法1 : 构造一个无参方法,进行调用
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
System.out.println(obj);
}
}
class Foo {
public Foo() {}
}
- 修改方法2 : 调用的方法中,添加一个参数
public class classcode {
public static void main(String args[]) {
Foo obj = new Foo(3);
System.out.println(obj);
}
}
class Foo {
int value;
public Foo(int intValue) {
value = intValue;
}
}
3 .对于处理精度损失问题,使用java.math.BigDecimal类
-
运行程序后,结果为:0.30000000000000004
-
出现以上结果的原因是:float与double是不需要准确的计算结果的精度
-
解决方案:需要使用java.math.BigDecimal类的方法计算准确结果
-
修改代码如下:
import java.math.BigDecimal; public class Test { public static void main(String args[]) { double a = 0.1; double b = 0.1; double c = 0.1; double d = a + b + c; int len = 1; System.out.println("加法运算: " + round(d, 1)); } public static BigDecimal round(double d, int len) { BigDecimal d1 = new BigDecimal(d); BigDecimal d2 = new BigDecimal(1); return d1.divide(d2, len, BigDecimal.ROUND_HALF_UP); } }
4 .static的声明使用要求
-
运行后的程序的结果是:
Exception in thread "main" java.lang.NullPointerException at classcode.main(classcode.java:15)
-
出现以上错误的原因是:
主方法是声明为static的方法,此方法只能访问类的static数据成员或调用类的static的成员方法,不能访问类的非static数据成员或调用类的非static的成员方法。 -
修改后的程序是:
public class Test { public static void main(String[] args) { MyClass[] arr = new MyClass[3]; arr[1].value = 100; System.out.println("arr[1].value = " + arr[1].value); } } class MyClass { public static int value = 1; }
5 .String类与StringBuffer类的功能与使用区别
String
声明的变量是不可改变的,当你用String声明一个变量时,在堆中会为字符串分配一个空间,当你做完连接操作后,堆会新生成一个空间来存放新连接的字符串,之后再分配一个新空间放连接完整的字符串,证明已经连接成功。
- 实例:
public class Test {
public static void main(String[] args) {
String str = "abc";
System.out.println(str.hashCode());
for(int i=0;i<10;i++){
str = str + "d";
}
System.out.println(str);
System.out.println(str.hashCode());
}
}
- 运行结果为:
96354
abcdddddddddd
733799522- 注:在Java中是不可以返回对象的地址并输出的,所以使用hashcode()方法,把地址转化成整数进行输出,输出的并不代表实际地址。但是此结果说明两个字符串并不是同一个地址。String方法连接字符串浪费空间,不方便。
StringBuffer
的方法:
- public StringBuffer append(String str)
将str添加到当前字符串缓冲区的字符串的末尾
- public StringBuffer insert(int offset,String str)
在当前字符串缓冲区的字符串的下标offset插入str,如果offset等于旧长度,则str添加在字符串缓冲区的末尾。
-
实例:
public class classcode { public static void main(String[] args) { StringBuffer str = new StringBuffer("abcde"); for (int i = 0; i < 10; i++) { str.append("fg"); } System.out.println(str); str.insert(2,"fg"); System.out.println(str); } }
- 运行结果:
abcdefgfgfgfgfgfgfgfgfgfg
abfgcdefgfgfgfgfgfgfgfgfgfg- 使用StringBuffer()方法比String更简便,空间不会浪费。
6 .其他知识总结
- 使用Eclipse关联jdk源代码
Exlipse常用快捷键:
ctrl+s
保存ctrl+a
全选ctrl+c
复制ctrl+v
粘贴ctrl+z
撤销ctrl+x
剪切ctrl+1
快速修改ctrl+shift+f
格式准确化
常用操作:
- 界面乱的解决方法:窗口->复位透视图
- 找不到控制台或某些窗口解决方法:窗口->显示视图->点击进行添加或者窗口->显示视图->点击进行添加->其他
- Exlipse编辑器字体设置:窗口->首选项->常规->外观->颜色和字体->基本->文本编辑器区字宽选择
二 .实验总结
1 .评分系统
-
程序设计思路:
使用三个方法,在主方法进行循环输入分数,按逻辑调用方法,求出选手分数,使用数组方法,进行排序,循环输出。
public static double max(double score[])
public static double min(double score[])
public static double sum(double score[]) -
问题1:把选手的分数求出如何放进数组,循环输出错误
-
原因:数组声明放错地方,排序后的数组按从小到大排序,要求应该从大到小进行输出,循环输出时,变量值控制错误
-
解决方案:
double AvgArr[] = new double[5]; //循环与调用方法代码段 for(int i=0;i<AvgArr.length;i++){ System.out.println("第" + (i+1) + "个选手的分数为" + AvgArr[i]); } Arrays.sort(AvgArr); System.out.println("从高到低排序为 : "); for(int i=AvgArr.length-1;i>=0;i--){ System.out.println(AvgArr[i]); }
2 .Email验证
-
程序设计思路:
使用一个方法,在主方法中调用输出,如果正确返回true,否则返回false
public static boolean select(String str) -
问题1:如何判断这四个条件成立
A: @和.同时存在
B: @在.之前
C: 不能@开头
D: 以com|cn|net|gov|edu|org结尾 -
原因:还不能准确并正确的使用String类的方法,并且不了解他们的功能
-
解决方案:
int locate1 = str.indexOf("@"); int locate2 = str.indexOf("."); if (locate1 != 0 && locate2 != 0 && locate1 < locate2 && locate1 != 0) if (str.endsWith("com") || str.endsWith("cn") || str.endsWith("net") || str.endsWith("gov") || str.endsWith("edu") || str.endsWith("org"))
3 .统计文件
-
程序设计思路:
使用方法进行调用,在主方法中输入文件名,在调用方法中进行判断,文件名输入是否用“,”分隔,判断输入的文件名的扩展名是否相同,输出不同类型文件的个数。
public static void Statistic(String str) -
问题1:开始不知道如何判断扩展名相同,之后统计文件数错误,要么统计少一种文件扩展名,要么就是有一种统计少一个
-
原因:运用for循环进行判断时,会使字符串下标多加1,所以就会少判断一种文件扩展名
-
解决方案:
首先定义记录与扩展名相同的字符串的位置sign,再定义记录相同文件个数的变量number,当字符串数组下标i小于最大长度时,让第一个与下一个进行比较,相同number加1,j加1,第一个与下一个进行比较,如果第一个与每一个判断完,让i与你所记录的位置sign比较,如果二者不等,输出相同文件名,i++进行第二个字符串与其他字符串的比较,
注意: 如果使用for循环,要明白循环的规则while (i < str2.length) { int number = 1; int j = i + 1; while (j < str1.length) { if (str2[j].equals(str2[i])) { number++; sign = j; } j++; } if (i != sign) { System.out.println(str2[i] + " " + number + "个"); } i++; }
4 .身份证识别
-
程序设计思路:
使用方法,在主方法调用,在主方法进行输入身份证号,在调用方法进行实验要求的判断与输出 -
问题1:不能正确输出省份,输出的时候会输出0,循环时,出现错误
-
原因:字符串不能转化成字符数组,不能将字符数组转化成整型数组,与地址码不符合,输出错误,并且会输出0
-
解决方案:
先定义一个字符串类的数组对省份进行静态初始化。
然后将字符串类的数组进行转化,先转化字符型数组,再转化为整型数组,对整型数组进行双层循环,整型数组数据与字符串数组对应的值相对应,最后对字符串数组的内容进行输出
- 注意:重庆市对应的值不可以在循环中进行输出,他的值为50,应该进行单独输出
int[][] intArray = new int[str1.length][str1.length];
String str2 = str.substring(0,2);
char charArray[] = str2.toCharArray();
int[] intArray1 = new int[2];
for(int i=0;i<2;i++){
intArray1[i] = intArray1[i] * 10 + charArray[i]-'0';
}
for (int i = 0; i < intArray.length; i++) {
for (int j = 0; j < intArray[i].length; j++) {
if(intArray1[0]*10+intArray1[1] == ((i+1)*10 + (j+1))){
System.out.println("所在省份是 : " + str1[intArray1[0]-1][intArray1[1]-1]);
}
}
}
if(intArray1[0]*10 == 50){
System.out.println("重庆市");
}
三 . 代码托管
- 码云commit历史截图
- 代码链接
代码托管
四 .学习进度条
进程 | 代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 500/500 | 45/45 | 自学了前四章的内容,自己练习了学习过程中的所有代码,并写了一些练习题提交到了码云中 |
第5周 | 200/700 | 15/60 | 学习了老师要求的内容 |
第6周 |