1.学习使用Eclipse关联jdk源代码,查看String类的equals()方法,截图,并学习其实现方法。举例说明equals方法和==的区别。
Eclipse关联jdk源代码的方法如上图所示
举例说明equals方法和==的区别
如图所示 ‘==’比较的是字符的地址 而‘equals’比较的是字符串的内容
2.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
构造方法就是与类同名的那个方法,它的作用是可以用来初始化
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
构造方法可以重载。
上述程序并不能翻译 因为在Foo类中定义int型的value, Foo obj = new Foo()没有传递参数。 需要对Foo(int)进行传参。
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
因为Java中的简单浮点数类型float和double不能够进行运算,在大多数情况下,计算的结果是准确的,但进行多次运算或者循环运算经常出错,double属于floating binary point types,也就是说都double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
package org.lxh.demo11.numberdemo;
import java.math.BigDecimal;
public class BigDecimalDemo01 {
public static void main(String[] args) {
BigDecimal bi1=new BigDecimal ("0.1");
BigDecimal bi2=new BigDecimal ("0.1");
BigDecimal bi3=new BigDecimal ("0.1");
BigDecimal c= new BigDecimal("0.3");
bi2=bi1.add(bi1.add(bi1));
if(bi2.compareTo (c)==0){
System.out.println("等于0.3");
}else {
System.out.println("不等于0.3");
}
}
}
定义BigDecimal类 如上 结果等于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;
}
结果 不能运行
原因 空指针异常
更改方法
package org.lxh.demo11.numberdemo;
public class Test {
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类,为什么?性能有差异吗?能否写出测试代码证明你的结论。(可查阅资料)
首先 两种类的区别
(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append()方法来修改值
(2)String类对象的性能远不如StringBuffer类。
关于以上具体解释如下:
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
String类
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 10000;
long lstart1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
str += tempstr;
}
long lend1 = System.currentTimeMillis();
long time = (lend1 - lstart1);
System.out.println(time);
String Buffer类
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < times; i++) {
sb.append(tempstr);
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);
由以上两个程序测试得出结论 StringBuffer 的速度几乎是String 上万倍当然这个数据不是很准确
6.其他需要总结的内容。
(二)实验总结
实验内容:
1.评分系统:一共10个评委,满分10分,假设有5个选手,分别由评委打分,去掉一个最高分和一个最低分后的平均分为该选手得分,将选手的得分从高到低进行输出。定义适当的方法。
设计思路: 定义数组循环按照逻辑依次循环,并在其中求出最大值最小值,最终值为去掉最大值最小值的平均值
问题一:得分输出不正确,随机值
解决方法:定义double数组 将每次得分成绩放入数组
public class test{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int score[]=new int[10];
int max=0;
int min=0;
int sum=0;
double arv=0;
System.out.println("请评委打分:");
for(int i=1;i<5;i++){
System.out.println("请评委给第"+i+"选手打分:");
for(int q=0;q<10;q++){
int a=in.nextInt();
score[q]=a;
}
max=min=score[0];
for(int v=0;v<score.length;v++){
if(score[v]>max){
max=score[v];
}
if(score[v]<min){
min=score[v];
}
sum=score[v]+sum;
}
arv=(sum-max-min)/8.0;
double[] avg=new double[5];
avg[i]=arv;
System.out.println("最高分为"+max);
System.out.println("最低分为"+min);
System.out.println("最后得分为"+avg[i]);
}
2.Email验证:在各种应用中,需要对用户输入的email地址进行验证,编写一个方法,判断一个email地址是否有效。(判断条件:A:@和.同时存在 B: @在.之前 C: 不能@开头 D: 以com|cn|net|gov|edu|org结尾 )
设计思路:定义地址成功与否的返回值条件 在按照题目要求定义条件
问题:“@”和“。”判断错误
解决方案:if((a!=-1&&b!=-1&&a<b&&a!=1)) 进行一次判断
解决方案:XXXXXXX
(三)代码托管(务必链接到你的项目)
https://git.oschina.net/hebau_cs15/java-cs01hm.git
学习进度条