zoukankan      html  css  js  c++  java
  • 201621123008 《Java程序设计》第二周学习总结

    1. 本周学习总结

    通过查询API掌握了一下几种类的基本用法:

    • String类
    • StringBuilder类
    • ArrayList类
    • BigInteger类
    • BigDecimal类
    • Arrays类

    认知两种基本变量:

    • primitive主数据类型
    • 引用

    2. 书面作业

    1. String-使用Eclipse关联jdk源代码

    1.1 查看String对象的源代码,分析String使用什么来存储字符串?

    String对象源代码部分截取:

    /** The value is used for character storage. */
    private final char value[];

    • 分析: String用字符数组来存储字符串。

    1.2 分析其构造函数public String(char value[])的作用?

    String对象源代码部分截取:

    * Allocates a new {@code String} so that it represents the sequence of
    
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * @param  value
     *         The initial value of the string
     *
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }
    
    • 分析: 由以上可知该够造函数可接收一个char数组,生成一个String对象。
      举例:
      char[] ch={'c','h','a','r'}; String str=new String(ch); System.out.println(str)
      运行结果:
      char

    1.3 阅读public String replace(char oldChar, char newChar)方法的代码,回答String的不可变性在该函数中如何体现?

    String对象源代码部分截取:

    • 分析:在进行字符串替换时并不是直接对原有字符串进行操作,而是建立了一个新的字符串,将新的字符放入到新字符串的适当位置上,将新字符串作为返回值赋给Sting类型的引用。总结来说,此过程中是String类型的引用由一个旧的对象指向一个新的对象。

    1.4 简述String与字符数组的关系,使用字符数组就可以处理字符串,为什么还需要String呢?

    Java是面向对象的。类是创建对象的模版,类中包含了许多的方法,当我们用new方法创建一个对象时,就有许多现成的方法可供我们调用,相比其他语言,Java使用更为方便。运用new方法创建一个String类的对象时,若我们需要进行一些操作则只需调用String类中的方法就可,相比于字符数组,String更便捷;另一方面,由于String的不变性,若我们对字符串进行增添,修改,等操作时,便会生成新的对象,而那些旧的对象失去了对其的引用,将会失去生命力,垃圾回收器若不及时回收这些废弃的对象,整个程序将会非常低效,而此时若用字符数组则会显得比较灵活。不过,若是追溯到底层,String对字符串的存储及操作也是借助字符数组来实现的。

    2. StringBuilde

    2.1 结合PTA -2(StringBuilder),说明为什么频繁修改字符串时,应该使用StringBuilder而不是String?

    以该题为例,通过输入n将0至n-1之间的数作为字符串存入变量中。
    String:因其具有不可变性,每进行一次循环将会在堆上生成一个新的对象,大大降低了程序运行的效率。
    StringBuilder:每次循环是对对象本身进行操作,而不是生成新的对象。

    2.2 阅读jdk文档,查询StringBuilderappend(char[]str)方法功能是什么?试分析StringBuilder内部使用什么来存放字符?调用StringBuilder的append(char[]str)方法时,是如何实现添加字符的操作?

    该方法的功能:将 char 数组参数的字符串表示形式追加到此序列。

    StringBuilder对象源代码部分截取:

    AbstractStringBuilder对象源代码部分截取:


    • 分析:String其内部使用字符数组来存放数组。

    添加操作的实现过程:添加这个序列的char数组参数的字符串表示形式。字符数组参数按顺序追加,该序列的内容。这个序列的长度增加该参数的长度。

    3. 字符串与字符串池

    3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象:

    String str1 ="hi",
    String str2="hi";
    String str3 = new String(str1) System.out.println(str1==str2);

    • 执行该程序输出结果为true,共创建了两个对象。

    • 执行第一行代码结果:在字符串常量池创建一个对象,其引用为str1,该对象存放的内容为hi

    • 执行第二行代码结果:此时字符串常量池中已存在字符串histr2直接指向str1所指向的对象,而不是再创建一个新对象。

    • 执行第三行代码结果:通过new方法在堆上新建了一个对象,该对象存放的内容为hi

    • 执行第四行代码结果:对于引用类型==可以理解为判断两个引用所指向的对象的内存地址是否相同。而此题srt1str2分别指向相同的对象,故其相等。

    3.2 对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?

    对于引用类型==可以理解为判断两个引用所指向的对象的内存地址是否相同。
    若要比较两对象内容是否相等,调用equals方法即可。例:str1.equals(str2),其返回值为boolean

    4. Wrapper(包装类)

    4.1 Integer i = 100;100是基本类型,i是引用类型,为什么可以将100赋值给i?Integer x = 100; int y = x+1;x++;这一串命令中包含了些什么操作?

    • 第一串命令:Integerint的包装类,能将int类型的值赋给Integer类型的,是因为包装类具有自动装箱功能。
    • 第二串命令:Integer x = 100;装箱
      int y = x+1;装箱
      x++;先拆箱后装箱

    4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?

    • 可以通过包装类,实现String和基本类型之间相互转换。
    • 可以通过包装类,实现基本数据类型的相互转换。
    • Integer是一个引用类型,在传参,返回参数方面比int,即值类型,更兼容。

    5. 实验总结

    5.1 结对编程实践

    使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。

    结对对象:林文秀

    由于PTA上的大部分题目在上星期就已完成,在宿舍也就和舍友讨论了下PTA上格式输入,输出的问题。有时候代码打完在eclipse上可以运行,但是放到PTA上却无法通过,可能是格式的错误或是对题目理解的错误,这时候和舍友讨论一下,看一下舍友的做法,比一个人在那里死扣好。但是如果自己没有深入的思考就开始问别人,一方面自己养成不了独立思考的能力,另一方面也是浪费别人的时间。每个人都有思维的盲区,我们面对问题的时候都是以一贯的思维来思考,如是遇到自己实在无法解决的问题时,就要与别人探讨交流,换个角度去想问题的解决方法。

    5.2 PTA-1综合小测验

    • 基本思路:
    • 创建一个私有的静态整形数组,用于存储整形元素。static private int[] arr;
    • 通过while (sc.hasNext())控制输入。
    • 根据用户输入的关键字进入不同的switch分支。
    • 输入相应数据进入函数:
      public static void sort(String[] str)
      主要功能:Strig类行的数组str转化为int型数组,存入arr<并对其排序,通过System.out.println(Arrays.toString(arr));进行输出。

    public static void search(int e)
    主要功能:通过Arrays.binarySearch(arr, e)查找元素e,返回其下标,若不存在则返回-1

    public static void getBirthDate(String id)
    主要功能:通过substring方法对输入的id进行截取,输出其出生日期。

    public static void fib(int n)
    主要功能:通过参数n打印出斐波那契数列的前n项,采用累加法。

    5.3 PTA-3身份证排序。并回答:使用sort2方法进行排序可以对出生年月日进行升序排序,如果现在有需要对其进行降序排序,或者按照其中的出生月份排序,怎么解决呢?

    • 使用Arrays.sort方法对数组进行的排序为升序,若需降序排序则将通过Arrays.sort方法排序后的数组从最后一项开始输出即可,或者采用冒泡法,其他排序方法也可以。
    • 通过substring方法截取id中的月份,将其转化为int型存入数组,调用Arrays.sort方法对数组进行的排序。

    5.4 PTA-4动态数组

    基本思路:

    • 通过while (sc.hasNext())控制输入。
    • 进入getDynamicMatrix 函数
      private static void getDynamicMatrix(int n)
      主要功能:根据输入的n值打印相应的乘法表。通过双层for循环来实现,将每一行的输入存入的String类型的二维数组中,通过System.out.println(Arrays.deepToString(str));打印二维数组。

    5.5 PTA-8ArrayList入门。并回答:为什么有了数组还要使用ArrayList?

    基本思路:

    • 查询API文档即可。

    • 通过使用ArrayList类我们可以动态添加数组元素,因为java是面向对象的,ArrayList中提供了许多方法,更便于使用。

    5.6 浮点数计算

    基本思路:运用math包中的BigDecimal类。在创建对象时若需精确计算则需向其构造函数中传入Sctring类型的参数。调用add方法实现两数相加;调用multiply方法实现两数相乘。

    5.7 枚举

    基本思路:enum相当与class,可以理解为一些常量的集合。根据PTA的输出要求,注意不要把其定义在Main类中就可以。

    5.8 大整数相加

    基本思路:运用math包中的BigInteger类。

    • BigInteger sum = new BigInteger("0");sum存储其和
    • 通过while (sc.hasNext())控制输入。
    • 按行读取字符串。
    • 若字符串为eE,跳出循环。
    • 通过add方法进行相加。
    • 通过System.out.println(sum.toString());输出和。

    6. 选做:公交卡里应该还有多少钱?请分析原因

    分析:公交卡已欠费。将4294967276转为十六进制产生了溢出,而在系统中以无符号整形来存储,故而出现了余额很大的显示界面。

    7. 选做(难):package与javac、 java、 -classpath、 -d与Eclipse

    com.ibm 包中编写 StringUtil 类,内有一方法
    public static void foo1(){ System.out.println(StringUtil.class+" method:foo1"); }
    在edu.jmu包中编写Main类,调用com.ibm.StringUtil的foo1方法。


    7.1 尝试用命令行进行编译并运行,截图

    在edu.jmu包中编写Main类,其中掉了com.ibm.StringUtil的foo1方法

    7.2 将生成的StringUtil.class放到d:\lib下正确的目录结构下,将Main.class放到d:\test下正确的目录结构,尝试在命令行下运行,并截图。

    7.3 Eclipse中自己编写的源代码放在哪个目录、class文件放在哪个目录(给出绝对目录)?在Eclipse项目中按一下Ctrl+F11就可以直接运行Main,当按下Ctrl+F11时,到底在哪个目录下执行了什么样的java命令?

    class文件目录:E:\java workspace2\MyProject3\bin\JavaLearn2

    源文件目录:E:\java workspace2\MyProject3\src\JavaLearn2

    按下 ctrl+F11,是执行了bin下相应的字节码文件。

    3. 码云及PTA

    3.1 码云代码提交记录

    3.2 截图题集“Java基本语法”PTA提交列表



    3.3 使用老师发的jar程序统计每周的代码量

    周次 总代码量 新增代码量 总文件数 新增文件数
    2 665 665 20 20

    4. 小任务

    2.1 加分考核点:新建n个大小的数组,往数组中随机填入1-100之间的整数(写成函数形式),然后统计并输出其中大于50与小于等于50的百分比(写成函数形式)。(注意:可以使用for each循环进行统计,随机数用法见参考资料 )

    代码:


    运行结果:

  • 相关阅读:
    Linux常用命令
    Linux静态函数库与动态函数库
    解决MySQL5.7的表无法插入中文的问题
    MySQL与postgreSQL在left join查询时的区别
    《刻意练习》读书笔记
    在Golang中实现与Python装饰器类似功能的方法
    项目中使用进程内缓存的一些经验及注意事项
    Golang中使用recover捕获panic的操作及遇到的一个坑
    Python与Golang中给列表中字典按照某个key排序的实现
    浅谈Python与Golang中的“延迟绑定机制”
  • 原文地址:https://www.cnblogs.com/Dzwh/p/7581958.html
Copyright © 2011-2022 走看看