Java 第二周总结

1.本周学习总结

(1)斐波那契函数

public static int fibonacci(int n)//斐波那契函数
{
	if(n<=2)
	{
		return 1;
	}
	else
	{
		return fibonacci(n-1)+fibonacci(n-2);
	}
}

(2)关于Arrays.sort()

PS:后来有问其他人,好像这个就是这样,不能直接对字符串数组排序,必须要转换成整形。

  • 由于这周的作业一些地方涉及排序,所以对这个函数就有大量的引用。在写代码的过程中,发现了一些小问题,不知道是bug还是他本身的设定就是这样,又或者是我的使用方法的问题。由于网上查了很多都没有提到,所以想想还是写一下吧。
  • Arrays类中的sort()使用的是“经过调优的快速排序法”,能快速的对对象进行升序排序。要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组。
  • 但是在对字符串数组的排序中,发现了几个问题。
    • 当目标字符串数组内的几个字符串长度不一的时候,没法进行全部排序,只能对相同位数的排序。情况如下:

但是同样位数的时候,排序正常,负数的-算做一位


以上运行结果均为同一段代码,没有做任何修改。代码如下:

Scanner in1=new Scanner(System.in);
String s=in1.nextLine();					
String[] ss=s.split(" ");
Arrays.sort(ss);
System.out.println(Arrays.toString(ss));

后来考虑是不是因为我是由控制台输入,然后再转为字符串数组,影响了结果。但是后来测试定义静态的字符串数组,也是同样的情况。

代码如下:(我也不知道这个函数到底好不好用了......)

String[] aaa={"255","3","11561","-6"};
Arrays.sort(aaa);
System.out.println(Arrays.toString(aaa));

(3)String[] sea=search.split(" "); 以空格为间隔分解字符串,建立字符串数组

(4)int imput=Integer.parseInt(imput1); 字符串imput1转换成整形imput

(5) System.out.println(b1.add(b2)); 加法

    System.out.println(b1.multiply(b2));  乘法

(6)枚举

(7)大数处理 BigInteger和BigDecimal,分别表示大整数类和大浮点数类

int a=3;
       BigInteger b=BigInteger.valueOf(a);
     则b=3;
         String s=”12345”;
       BigInteger c=BigInteger.valueOf(s);
      则c=12345;

2.add(); 大整数相加
   BigInteger a=new BigInteger(“23”);
   BigInteger b=new BigInteger(“34”);
a.      add(b);

3.subtract(); 相减
4.multiply(); 相乘
5.divide();    相除取整
6.remainder();取余
7.pow();   a.pow(b)=a^b
8.gcd();   最大公约数
9.abs(); 绝对值
10.negate();取反数
11.mod(); a.mod(b)=a%b=a.remainder(b);
12.max(); min();
13.punlic int comareTo();
14.boolean equals(); 是否相等
15.BigInteger构造函数:
  一般用到以下两种:
   BigInteger(String val);
将指定字符串转换为十进制表示形式;
   BigInteger(String val,int radix);

2.书面作业

1.使用Eclipse关联jdk源代码(截图),并查看String对象的源代码?简单分析String对象的设计思路。

#####之前一直没能连上源码库,按照百度的方法也不行,总感觉哪里怪怪的。同学说她重装了JDK,突然点醒了我。因为我用的jdk和eclipes不是安装在同一个地方,所以换了种方法连接,果然有效。 #####String的源码,感觉像在看C语言的程序,很多是一些很基础的语句判断,通过函数调用我们可以很方便的使用

![](http://images2015.cnblogs.com/blog/1109779/201702/1109779-20170228213142157-1080545814.png)

2.为什么要尽量频繁的对字符串的修改操作应该是用StringBuilder而不是String?

  • 首先,字符串对象一旦建立,就无法更改对象中的任何内容,如果频繁的对字符串做修改操作,会产生大量的新的字符串对象。
  • StringBuilder每次append()调用过后,都会返回原有的StringBuilder对象,方便进行下一次的操作。这个程序片段只产生一个StringBuilder对象,只进行一次输出,效果上比最初看到的程序片段好得多。
  • StringBuilfer对象之后可以直接使用他们的toString方法来得到String。关于效率问题,Java的官方文档有提到说使用StringBuilder的toString方法会更快一些。

3.比较两个字符串的值是否相等?为什么不能用==直接进行比较?

  • Java是一种面向对象的语言,==比较的是字符串池,而不是比较内容。
  • 一般来说,以" "包括的字符串,不论在程序代码中出现几次,只要内容相同,JVM都只会把他放在一个字符串池中维护。eg: String =name1="Justin"
  • 用" "写下的字符串称为字符串常量,eg: String name 2=new String("Justin")因为new,一定是建立新对象,所以都是新建的string实例。

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

       String str1 ="hi", str2="hi";
       String str3 = new String(str1);
       System.out.println(str1==str2);
  • 输出结果:true

这段代码一共创建了两个字符串对象,str1和str2都是在同一个字符串池里的同一个"hi",str3单独建立一个对象"hi"

如果代码改成下面这样: ``` String str1 ="hi", str2="hi"; String str3 = new String(str1); System.out.println(str1==str3); ``` - 那么输出结果为false ###5.Integer i = 100;//100是基本类型,i是引用类型,为什么可以将100赋值给i - int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别:ing是基本类型,可以直接存数据,如题中的100。而integer是对象,用一个引用指向这个对象。 - int 和Integer都可以用来表示某一个数值,但是不能够互用,因为他们是两种不同的数据类型 - 所以```Integer i = 100``` 在编译的时候被翻译成 Integer i=Integer.valueOf(i)l ###6.尝试分析下面代码输出结果 ``` Integer i1 = 127;Integer i2 = 127; i1 == i2;//true of false? Integer i1 = 128;Integer i2 = 128; i1 == i2;//true of false ``` - 结果分别为 true 和 false - 因为127在-128~127之间,在IntgerCache.low与IntgerCache.high的范围内,所以相同。但是128超出这个范围了,所以会建立一个Integer实例。但是两个数都分别建立了一个实例,用的又是==,所以结果自然是false - 综上,比较是否相等的时候,还是使用```equals()```比较保险。 ###7.package与javac、 java、 -classpath、 -d在``` com.ibm```包中编写 StringUtil类,内有一方法在`edu.jmu`包中编写Main类,调用com.ibm.StringUtil的foo1方法 ``` public static void foo1(){ System.out.println(StringUtil.class+" method:foo1"); } ```

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

7.2 将生成的StringUtil.class放到d盘的lib目录下,将Main.class在d: est目录下,尝试命令行下运行,截图。

7.3 Eclipse中源代码放在哪个目录、class文件放在哪个目录。在Eclipse项目中按一下ctrl+f11就可以直接运行Main,尝试分析背后实现的原理。

  • 源代码放在scr目录下,但是eclipse有时连接的源码库并不是和他放在同一个文件夹里,所以具体位置还是看具体JDK安装的地方。
  • 运行main就是通过编译.java文件,得到字节码文件。然后找到字节码文件,运行。

8.自己在这门课的目标与计划

  • 请描述一下你的技术基础
    • 只会学过的语言,虽然在看python,但由于基本没怎么用,所以约等于不会。写的代码行数在最近呈直线增长,以前没这么大的代码量。
  • 一周准备花多少时间在这门课上?一周准备写多少行代码?采用怎样的学习方式?遇到困难打算怎样解决?
    • 这周几乎所有时间都花这门课上了......从码云的提交上就能看出来,这还不包括第一题一直没写完所以一直没提交的。写的代码我也不知道有多少行,反正写了删,删了写。遇到困难首先百度= =,说不定以后就是首先谷歌了。百度实在解决不了的,再和同学讨论。其实和同学讨论我觉得挺好的,有时候可以少走很多弯路,就是怕已经山路十八弯了,她才把你拉回正途上......
  • 关于这门课的smart目标
    • 目标啊......能够通过考试吧......我觉得我是那种非常不擅长考试的人,自从C语言挂科之后就已经没什么其他追求了

3.码云

4.PTA实验总结

  • 排序很麻烦,尤其是用Arrays.sort()排序感觉更麻烦了......总是有数不清的bug,到最后还不如写个冒泡省时间
  • 关于Scanner in=new Scanner(System.in); 在第二题的时候,明明答案没错,但是PTA就是不给通过,说是答案错误。愣是找了好久的问题,终于是靠同学的一份已经通过的代码找到了问题所在。
Scanner in=new Scanner(System.in);
while(true){}

其实是比较耗资源,但是PTA就是不给过。。。。。

while(true){
    Scanner in=new Scanner(System.in);
}
  • 调了好久的格式结果不能用,,,,还是放上来吧,不要浪费了

				for(int y=0;y<=x;y++){
					if(x==0)
					{
						System.out.printf("[[");
						System.out.print(a[x][0]);
						System.out.printf("]");
						System.out.printf(",");
						
						y=N;
					}
					else{
						if(y==0){
							System.out.printf("[");
						}
						System.out.print(a[x][y]);
						if(y==N-1){
							System.out.printf("]");
						}
						if(y!=x)
						{
							System.out.printf(",");
						}
						
						while(y==x){
							System.out.printf("]");
							if(x!=N-1)
							{
								System.out.printf(",");
							}
							break;
						}
					}
					
				}

			}
  • 总之写代码用半个小时,提交猜套路大概还要半个小时的样子......第一题提交了两三天了,最后还是只有两分。和已经过了的同学代码做对比,有些地方简直改的都快复制粘贴了,但是分点部分还是评判为答案错误。我怀疑这个是连锁反应的吧......总之,我觉得第一题写的是没什么问题的,但是,两分的我们简直是那个排名表上的一股清流啊......夹在一堆9分里面。
  • 比起上周的绝望,嗯......这周不是很绝望了,但是一周的生活除了代码还是代码。因为写代码总钻牛角尖,所以写的属于比较慢的那种,从周二晚上开始就基本没停过,感觉人生除了敲代码已经没什么其他事情了。最后总结,和PTA斗争好累......就这样。
原文地址:https://www.cnblogs.com/ycll/p/6478457.html