201621123028《Java程序设计》第二周学习总结
Week02-Java基本语法与类库
1.本周学习总结
1.1 java中数据类型分为基本数据类型和引用数据类型。基本数据类型中boolean是java特有的,它的取值只有true和false,并且boolean型的默认初始化值是false。对于引用数据类型,它的变量名不直接指向数据本身,而是指向存储数据对象的地址。null是一种比较特殊的引用类型,虽然是空但不是0,它的默认值是任何引用类型的默认值。String作为最常用的引用类型之一,常常需要对两个字符串进行比较,因为变量名不是直接指向数据本身,所以不能直接用==来进行比较,这时可以使用``变量1.equals(变量2)``它会判断变量1与变量2指向的值是否相等。当我们直接让变量用双引号创建某字符串时,而不使用new来创建一个新对象时,当第一个变量创建后,就会在字符串常量值中创建该字符串的对象,之后如果第二个变量用双引号也创建了同一个字符串,此时在字符串池中不会新建一个对象,而是使用第一次已经创建好的字符对象,这样变量1==变量2就会成立,如下图。因为String的 不变性,所以使用+进行连续求和会一直创建String对象,内存占用过度。可使用StringBuilder
或者StringBuffer
解决问题.
1.2学过C语言知道了for循环,即for(初始化表达式;循环条件表达式;循环后的操作表达式),在java中可以使用foreach循环,格式:for(type element:arr)比较简单操作。多维数组中的不规则数组如int a[][]=new int[4][];
表示初始化数组a,a中又有4个元素,而每个元素又是一个数组。学习ArrayList的基本操作,如add添加,remove删除,get获取,size返回元素的个数,set修改等等。
2.书面作业
1.String-使用Eclipse关联jdk源代码
1.1 例如:String str1 = new String("abc");
这时abc
存储在堆内存中,堆内存存储的是数组和对象(数组其实就是对象)凡是new都建立在堆中。此时每一个实体都有一个首地址值。而如String str2 = "abc";
则存放在栈内存中,栈内存存储的都是局部变量,而且所属的作用域一结束,该变量就会被自动释放。
1.2 public String(char value[])
的功能是让字符型数组value来创建String对象。
1.3 public String replace(char oldChar, char newChar)
用一个字符代替所有现有字符。
参数 | 描述 |
---|---|
oldChar | 现有字符替换。 |
newChar | 用oldChar替换的字符。 |
就是oldChar的所有现有字符串已被newChar所替换 |
1.4 String与字符数组之间可以相互转换,如字符串转换为字符数组char[ ]ch=s.toCharArray();
,字符数组转化为字符串String str=string.valueOf(c);
2.StringBuilder
2.1 频繁修改字符串时,当使用String时,会一直创建String对象,内存占用过度。而是用StringBuilder就不会。了解StringBuilder可先了解StringBuffer。
Java.lang.StringBuffer 是线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
--引用自《我是一个包子的博客》
2.2 StringBuilder的append(char[] str)
方法功能是将char数组参数的字符串表示形式追加到此序列。StringBuilder内部使用values的字符串数组来存放字符。调用StringBuilder的append(char[] str)
方法时,添加这个序列的char数组参数的字符串表示形式。字符数组参数按顺序追加,该序列的内容。这个序列的长度增加该参数的长度。
3.字符串与字符串池
3.1 尝试使用字符串池的概念解释如下程序段输出结果,并回答这段代码创建了几个字符串对象。
String str1 ="hi", str2="hi"; String str3 = new String(str1) System.out.println(str1==str2);
输出为true,创建了两个字符串对象,首先在字符串常量池中建立了“hi”,接着输入str2="hi"
时,在池中寻找,发现“hi”已经存在,所以直接让str2指向“hi”。此时,str1==str2。而str3是用new新建立了字符串“hi”。
3.2 重点:对基本类型我们可以使用比较两个值是否相等,对于引用类型(如String, Integer、数组等)为什么不能使用比较?应该怎样比较他们的值是否相等呢?
对于引用类型,因为变量名不是直接指向数据本身,所以不能直接用==来进行比较,这时可以使用 变量1.equals(变量2)它会判断变量1与变量2指向的值是否相等。
4. Wrapper(包装类)
4.1 Integer i = 100;
//100是基本类型,i是引用类型,为什么可以将100赋值给i?
Integer x=100; int y = x+1;x++;
这一串命令中包含了些什么操作?
Integer是int的包装类,是引用类型,它在对象中包装了一个基本类型int的值,所以可以将100直接赋值给i.Integer x = 100
自动装箱,将基本数据类型int型转换为Integer类型。int y = x+1
自动拆箱,将Integer类型转换为基本数据类型int型。x++
先拆箱后装箱。
4.2 Java为什么有了基本数据类型,还需要其包装类呢?包装类能给我们带来什么好处呢?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
-- 引用自《一转身就是一辈子的博客》
5.实验总结
5.1 结对编程实践:使用结对编程的方式完成本周编程题目,即两个人同时合作完成实验题目(可1题也可多题,但最好是是两个人都没做过的题目)。推荐实施步骤:1.两个人坐在同一台电脑屏幕前判题,讨论、决定大概由谁先写。2. 1个人先编5分钟(自己商量多少分钟),同时另一个人观察对方编程或者查相关资料。3. 5分钟后,简单讨论后,换另外一个人继续编(请一定要换,另一个人如果无法接受应由第一个人讲解大概思路以方便其接受)。并完成如下作业:a.描述结对队友姓名、结对过程,提供非摆拍的两人在讨论、细化和编程时的结对照片。b.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会(如是否有利于自己编程水平的提高、是否有利于开拓编程思路)。
队友:郑玉波。和舍友郑玉波同学畅所欲言,比如那道大整数相加的题,我们讨论了好久,在软件上测试PTA的例子没有问题,但是两个人的提交都有问题,花了好久没找到问题点,后来想到输入可能不止输入两行,最终解决了问题。感想:两个人一起讨论问题能尽可能的将自己的想法说出来,这样解决问题的效率又高了一些。
5.2PTA-1综合小测验
这题会用到Arrays,以及如何截取和拼接字符串。有四个选项,fib,sort,search,getBirthDate
,对应不同功能,比如输入sort
时,要求对输入的数字进行排序,最后结果要用[]包裹,一开始我是想[]可以自己输入,但是最后报错,还影响的后面的功能,进过查询,发现使用System.out.println(Arrays.toString(y));
输出的结果中就会自己写入[];并且后面的功能也全都实现了。
5.3 PTA-3身份证排序。
这题的还是有字符串的截取,还有比较。在进行比较时,我使用p[j].substring(6,14).compareTo(p[j+1].substring(6,14))
来对输入的字符串的第6位到第14位的字符串进行比较,根据返回值来决定要不要换位置,根据返回值,也能实现降序排序,如果要按照出生月份排序,只需要修改substring(6,14),改为substring(10,14),即可。
5.4 PTA-4动态数组
考察的是多维数组中不规则数组的相关操作,可用for循环嵌套,主要第2点输出格式要求高点,要输出锯齿形的乘法表,可以用一个判断让他换行,即碰到如11,33等时换行。System.out.printf("%-7s",array[i][j])
实现最后一行的输出,这题我碰到个问题,以前的乘法表是11=1,12=2...,而这题是11=1,21=2...,所以我的输出array[i][j]=(i+1)+"*"+(j+1)+"="+(j+1)*(i+1);
之前没改前提交一直报错,还找不到问题,最后才发现了。
5.5 PTA-8 ArrayList入门。
考察ArrayList入门操作,add添加,remove删除,get获取,size返回元素的个数,set修改等等。ArrayList是动态数组,比一般性的数组灵活的许多,可以动态的增加或删除数组内的元素。功能多。
5-5(浮点数计算)
对于输入的字符串,可以使用BigDecimal函数来更精细的计算。BigDecimal b1 = new BigDecimal(i);
和BigDecimal b=b1.add(b2);
5-6(枚举)
使用switch对输入结果进行判断,枚举中是enum Grade{A,B,C,D,E}
,构建代码块public static Grade getGrade(int score)
,在main中调用。
5-7(大整数相加)
这题看着不难,但是提交一直出错,因为提示的错误是对'e'和'E'的报错,一直在修改,后来请教了下,原来关键点是题目的要求是不止可以输入两行大整数。
6.选做:公交卡里应该还有多少钱?请分析原因
机器故障了,显示就会出错,比如会出现溢出的问题,机器有可能将余额的数据显示的很大,其实真实余额是没多少的,就像a=2147483647;a=a+1;
这个时候就出现溢出了,a就等于-2147483648了。
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方法
这题出现了点问题,我想就写下自己理解的那部分吧,以后懂了再修改。首先是代码,分别建两个包,一个Main类,一个StringUtil类,用软件写的话,直接运行出来了。(还是软件好啊,不像DOS命令里搞不定啊23333),用命令到达StringUtil类的ibm目录下执行javac -d . StringUtil.java
这句话的意思应该是在当前路径下('.'这个是表示当前路径)打包(-d)生成StringUtil.class字节码文件。接着应该同理啊,javac -d . Main.java
,可是这里出问题,如下,一直卡这里,我觉的问题应该是出在代码上。
7.2 将生成的StringUtil.class放到d:\lib下正确的目录结构下,将Main.class放到d:\test下正确的目录结构,尝试在命令行下运行,并截图。
因为第一问没做出来所以这一问也只能空着了。
7.3 Eclipse中自己编写的源代码放在哪个目录、class文件放在哪个目录(给出绝对目录)?在Eclipse项目中按一下Ctrl+F11
就可以直接运行Main,当按下Ctrl+F11时,到底在哪个目录下执行了什么样的java命令?
Eclipse中自己编写的源代码放在src目录下,class文件放在bin目录下。当按下Ctrl+F11时,应该是在bin目录中执行javac编译.class的字节码文件,之后在src目录下执行java运行.java的源文件。