• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
奇怪蕊儿~
博客园    首页    新随笔    联系   管理    订阅  订阅
Java第6次作业

《Java技术》第XX次作业

(一)学习总结

1.用思维导图对本周的学习内容进行总结。


2.当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。可使用printStackTrace 和getMessage方法了解异常发生的情况。阅读下面的程序,说明printStackTrace 方法和getMessage 方法的输出结果分别是什么?并分析异常的传播过程。

 public  class PrintExceptionStack {
        public static void main( String args[] )
        {
             try {
                 method1();
              } catch ( Exception e ) {
                 System.err.println( e.getMessage() + "\n" );
                 e.printStackTrace();
              }
        }
       public static void method1() throws Exception
       {
          method2();
       }
       public static void method2() throws Exception
       {
          method3();
       }
       public static void method3() throws Exception
       {
          throw new Exception( "Exception thrown in method3" );
       }
    }
  • printStackTrace()的输出结果:
  • getMessage()的输出结果:

    getMessage()只会获得具体的异常名称.
    printStackTrace()会打出详细异常,异常名称,出错位置,便于调试用。
    3.阅读下面程序,分析程序的运行结果,解释产生错误的原因,如果删除的是books集合的最后一个对象,运行的结果又是什么?你能对此作出解释吗?如果在遍历时非要删除集合中的元素,应如何实现?
  import java.util.*;
    public class Test
    {
        public static void main(String[] args) 
        {
            Collection<String> books = new ArrayList<String>();
            books.add("One book");
            books.add("Two book");
            books.add("Three book");
            System.out.println("原始元素之后:"+books);
            Iterator<String> it = books.iterator();
            while(it.hasNext())
            {
                String book = (String)it.next();
                System.out.println(book);
                if (book.equals("One book"))
                {
                    books.remove(book);
                }
            }
            System.out.println("移除元素之后:"+books);
        }
    }
  • 运行结果:

    Iterator直接使用remove()方法直接删除,上面的删除方法在使用Iterator输出时集合对象调用了自身的删除方法,运行时就会出现错误
  • 删除最后一个对象:

    在使用Iterator输出时集合的大小没有发生变化,原始的元素正常输出,但是删除时调用了集合的remove()方法,使集合的大小发生变化,输出发生异常。
  • 如果在遍历时非要删除集合中的元素
    import java.util.*;
    public class Test
    {
        public static void main(String[] args) 
        {
            Collection<String> books = new ArrayList<String>();
            books.add("One book");
            books.add("Two book");
            books.add("Three book");
            System.out.println("原始元素之后:"+books);
            Iterator<String> it = books.iterator();
            while(it.hasNext())
            {
                String book = (String)it.next();
                System.out.println(book);
                if (book.equals("One book"))
                {
                    books.remove(); 
                }
            }
            System.out.println("移除元素之后:"+books);
        }
    }

4.HashSet存储的元素是不可重复的。运行下面的程序,分析为什么存入了相同的学生信息?如果要去掉重复元素,应该如何修改程序。

  import java.util.*;
    class Student {
        String id;  
        String name;
        public Student(String id, String name) {
            this.id = id;
            this.name = name;
        }
        public String toString() {
            return "Student id=" + id + ", name=" + name ;
        }
    }
    public class Test
    {
        public static void main(String[] args) 
        {
            HashSet<Student> set = new HashSet<Student>();
            set.add(new Student("1","Jack"));
            set.add(new Student("2","Rose"));
            set.add(new Student("2","Rose"));
            System.out.println(set);                
        }
    }

存入的信息是分别实例化的hash码是不一样的。

  • 去掉重复元素:重写hashcode()和equals()方法。
import java.util.*;
 class Student {
	
	    String id;  
	    String name;
	    public Student(String id, String name) {
	        this.id = id;
	        this.name = name;
	    }
	    public String toString() {
	        return "Student id=" + id + ", name=" + name ;
	    }
		 @Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + ((id == null) ? 0 : id.hashCode());
			result = prime * result + ((name == null) ? 0 : name.hashCode());
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Student other = (Student) obj;
			if (id == null) {
				if (other.id != null)
					return false;
			} else if (!id.equals(other.id))
				return false;
			if (name == null) {
				if (other.name != null)
					return false;
			} else if (!name.equals(other.name))
				return false;
			return true;
		}
	} 
public class Test
    {
        public static void main(String[] args) 
        {
            HashSet<Student> set = new HashSet<Student>();
            set.add(new Student("1","Jack"));
            set.add(new Student("2","Rose"));
            set.add(new Student("2","Rose"));
            System.out.println(set);                
        }
    }
  • 运行结果:

    5、其他总结:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

(二)实验总结

实验内容:
1.模拟KTV点歌系统
分别用LinkedList和ArrayList集合,实现一个模拟KTV点歌系统的程序。实现以下功能:
(1)显示歌曲列表
(2)添加歌曲到列表
(3)删除歌曲
(4)将歌曲置顶
(5)将歌曲前移一位
(6)退出

  • 程序设计思路:只定义了一个类,先用一个集合存放选好的歌曲,用自带的方法实现删除和置顶,实现上移可以先用一个字符串存储当前的歌曲,然后删除当前歌曲,在插入上一个位置。
    2.模拟微博用户注册
    用HashSet实现一个模拟微博用户注册的程序。用户输入用户名、密码、确认密码、生日(格式yyyy-mm-dd)、手机号码(11位,13、15、17、18开头)、邮箱信息进行微博的注册。要求对用户输入的信息进行验证,输入信息正确后,验证是否重复注册,如果不是则注册成功,否则注册失败。
    提示:
    (1)设计一个用户类存储用户注册信息
    (2)设计一个校验信息类,定义校验方法完成对输入信息的校验。学习使用正则表达式完成对生日、手机号码和邮箱的验证。
    (3)设计一个用户注册类模拟注册过程。用HashSet存储用户数据列表,定义一个initData()方法添加初始用户信息。在main方法中完成用户注册功能。
  • 程序设计思路:
    (1)用户类:定义用户的基本属性
    (2)初始化类:用HashSet存储几个原本已有的几个用户、判断新输入的用户名和原有的是否重复。
    (3)Check:判断用户的生日、邮箱、电话的格式是否满足要求。
    (4)Test类:输入新用户注册的信息,调用初始化类和Check类里的方法判断是否满足要求,用循环控制。如果都满足要求,则输出注册成功的提示。
  • 问题1:在注册用户时,只有输入密码的提示,只要输入密码 就会注册成功
  • 原因:while循环是错误的
  • 解决方案:在判断生日的格式是否满足的方法中,满足返回1,在测试类中while循环的变量值应该等于0,才会执行循环里面的语句。
  • 问题2:在判段邮箱和手机号码时,要同时判断两个属性,如果有一个正确,就会通过审核。
  • 原因:这样判断b会有两个值,只要有一个正确b就会等于1.

  • 解决方案:只有两个条件都满足时,b才等于1.

(代码托管)

https://git.oschina.net/hebau_cs15/Java-CS01yxr.git

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 150/300 30/30 学习了....
第5周 220/300 30/50 学习了关于double类型存在精度问题,取指定位置和截取字符串;数组的应用
第6周 550/600 60/80
第8周 700/800 60/80 面向对象的继承和多态
第9周 800/800 80/100 工厂设计和Java常用的类
第10周 800/800 80/100 异常处理和集合类
posted on 2017-05-04 09:33  奇怪蕊儿~  阅读(201)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3