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:\test目录下,尝试命令行下运行,截图。
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斗争好累......就这样。