《Java技术》第二次作业
(一)学习总结
1.Eclipse关联jdk源代码的方法
1).右键项目,依次选择 构建路径->配置构建路径->Java构建路径->库->JRE系统库->rt.jar->源代码连接。编辑“源代码连接”,设置“外部文件”的路径为JDK安装路径下的src.zip。如图
2).String类的equals()方法及其实现方法,如图
3).equals方法和==的区别
==用来比较地址,例如
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
System.out.println("str1 == str2 --> " + (str1 == str2));
}
equals方法可以直接比较内容,例如
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
System.out.println("str1 equals str2 --> " + (str1.equals(str2)));
}
2.构造方法:就是他的名称与类名一样的方法
构造方法的重载:方法名一样,但参数个数或参数类型不同
下面的程序是否可以通过编译?为什么?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
不能编译,没有定义无参的构造函数,不能调用。改成
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(){
}
public Foo(int intValue){
value = intValue;
}
}
3.运行下列程序,结果是什么?查阅资料,分析为什么。
public class Test {
public static void main(String args[]) {
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a + b + c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
结果为不等于0.3,精度损失。修改如下
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 n=MyMath.add(a, b);
if(MyMath.add(n,c) == 0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
class MyMath{
public static double add(double d1,double d2){
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
}
4.运行下列程序,结果是什么?分析原因,应如何修改.
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
结果
原因:数组越界了,没有实例化。
修改如下
public class Test {
public static void main(String[] args) {
MyClass[] arr=new MyClass[3];
for(int i=0;i<3;i++){
arr[i]=new MyClass();
}
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
用StringBuffer类
原因:String类要一个一个的链接,而StringBuffer类可以直接调用append()方法。
性能:StringBuffer类比String类效率高
例如
public class Test {
public static void main(String[] args){
String str = "Hello";
String b=fun(str);
System.out.println(b);
}
public static String fun(String s){
for(int i=0;i<10000;i++){
a=s+" World";
}
return a;
}
}
public class Test {
public static void main(String[] args){
StringBuffer buf = new StringBuffer("Hello");
fun(buf);
System.out.println(buf);
}
public static void fun(StringBuffer s){
for(int i=0;i<10000;i++){
s.append(" World");
}
}
}
(二)实验总结
1.评分系统
- 程序设计思路:定义一个二维数组并初始化,然后对二维数组进行排序,在循环里从数组的第二个数加到倒数第二个数,把这个数传给求平均值的函数,把求得的平均值传回,并从大到小输出。
- 实验问题分析:
问题1:数组越界了
原因:j一直--,变为负数。
解决方案:改成j>=0;
2.测试邮箱
- 程序设计思路:编写一个函数,把用户输入的邮箱传进来,用indexOf方法判断是否有@和.,用startsWith方法判断是否是@开头,用endsWith方法判断是否以com|cn|net|gov|edu|org结尾,是返回true,否返回false。
- 实验问题分析:
问题1:判断是否以com|cn|net|gov|edu|org结尾用的是if嵌套
原因:应该是或者关系
3.字符串统计
- 程序设计思路:编写一个方法,在方法里用split方法以“,”为拆分符进行拆分,利用循环把拆分后的字符串变成字符数组,将字符数组的开头字母变成大写并赋给一个新的字符串,判断新的字符串是以什么结尾的,将个数传给输出函数,进行输出。
4.身份证识别
- 程序设计思路:输入一个身份证号,对字符串进行截取,截取出来前两位、生日、倒数第二位,如果倒数第二位和2取余等于0,则性别是女,否则是男。编写一个函数将前两位数传给该函数,定义两个二维的字符传输组,一个用来存放地址,一个用来存放地址代码,用一个双重循环判断传过来的前两位数是否与存放地址代码的数相等,相等返回地址。
- 实验问题分析:
问题1:没有返回值
原因:因为你的return值是在循环的if条件里面,也就是if条件成立的时候返回了String
对象,但是如果if条件不成立的话,就没有返回值了。
解决方案:加上return null;
(三)代码托管
- 码云commit历史截图
(四)学习进度条
代码行数(新增/累积) | 学习时间(新增/累积) | 本周学习内容 | |
---|---|---|---|
目标 | 5000行 | 300小时 | |
第2-4周 | 100/100 | 20/20 | 学习了数组和方法 |
第5周 | 200/300 | 30/50 | 学习了String类和StringBuffer类 |
第6周 |