一丶学习总结
1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别
‘==’比较的是字符的地址 ‘equals’比较的是字符串的内容
例:
截图
public class lianxi {
public static void main(String[] args){
String str1 ="hello";
String str2 =new String("hello");
String str3=str2;
System.out.println("str1==str2->"+(str1==str2));
System.out.println("str1==str3->"+(str1==str3));
System.out.println("str2==str3->"+(str2==str3));
}
}
截图
public class lianxi {
public static void main(String[] args){
String str1 ="hello";
String str2 =new String("hello");
String str3=str2;
System.out.println("str1str2->"+(str1str2));
System.out.println("str1str3->"+(str1str3));
System.out.println("str2str3->"+(str2str3));
}
}
‘==’比较的地址不相同 所以有false,而‘equals’比较内容则都是true
2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
构造方法是一种特殊的方法,与一般的方法不同是:
1.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
3.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
方法重载就是同一个方法名,不同的传参。
这个程序构造函数Foo()未定义 应该改为
public class Test {
public static void main(String args[]) {
Foo obj = new Foo(0);
}
}
class Foo{
int value;
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");
}
}
}
double或float是不需要准确计算精度的数字可以用的,而这个需要精确的计算小数点后面的位数
应该改为
import java.math.BigDecimal;
public class lianxi {
public static void main(String args[]) {
BigDecimal b1 = new BigDecimal ("0.1");
BigDecimal b2 = new BigDecimal ("0.1");
BigDecimal b3 = new BigDecimal ("0.1");
if(b1.add(b2).add(b3).doubleValue()==0.3){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
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 lianxi {
public static void main(String[] args) {
MyClass[] arr={new MyClass(),new MyClass(),new MyClass()};
arr[1].value=100;
}
}
class MyClass{
public int value=1;
}
5.在一个10000次的循环中,需要进行字符串的连接操作,那么,应该使用String类还是StringBuffer类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
通过在网上查阅资料,了解到由于String类是不可变的,每次对其改变都要创建新字符串对象,所以它是最慢的; StringBuilder不需要执行同步操作,速度要比StringBuffer快
public static void main(String[] args) {
long begin = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i=0;i<10000;i++){
sb.append(i);
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}
}
同样循环调用10000次,换成StringBuffer,结果是5毫秒。
public static void main(String[] args) {
long begin = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str+i;
}
long end = System.currentTimeMillis();
long time = end - begin;
System.out.println(time+"");
}
用String,循环调用10000次,得出的结果是639毫秒
(二)实验总结
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
①程序设计思路
先写一个输入,利用for循环 输入十次,再用一个for循环套在外面,使得能够循环5次,得出五个学生的总成绩,设计一个求最大值最小值的函数程序,返回最大最小值,用总成绩减去最大值最小值并除以8就能得到成绩,之后利用冒泡排序程序,得出成绩的顺序。
②问题1
在算成绩时一直显示的跟计算器算出来的不一样
③原因
除号用错了,用的求余的符号
④解决方案
将%改为/
问题2:
之前函数调用一直出错,
解决方案:
public static void paixu(double d[])
类名换成了上面的写法,原来是在函数里面定义的 d[]
2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
程序设计思路
用的int aite = email.indexOf("");
来定义‘@’和‘.’,通过判断符号的地址来判断这俩符号的前后位置,在判断以什么结尾时,用的endsWith("");
3.统计文件:输入一个字符串,包含各种文件类型的文件名。文件名之间用“,”分隔,要求将各个文件名的首字母大写后分别输出,并统计各种类型文件的文件个数。
程序设计思路
用String s[] = str.split("\,") ;
来将输入的数据按逗号来分离,之后利用for循环将分开的数据输出
在将循环的次数输出就是分开的个数
(三)代码托管
https://git.oschina.net/hebau_cs15/Java-CS01QH.git
| 项目 | 代码行数(新增/累计) | 学习时间(新增/累计) |本周学习内容 |
| -------- | -----: | :----: |
| 目标 | 5000行 | 300小时 |
| 第2-4周 | 234/300 | 41 |
| 第5周 | 123/300 | 28 |学会了indexof的使用,学会了用符号将一段数据分隔的方法,复习了函数调用
| 第6周 | | |