Blog的作业
这几次作业都重点考察字符串的使用
字符串是不可变的,意味着一旦被创建,他们就会一直存在直到垃圾回收器回收它们。然而对于一个数组来说,你可以明确的改变它们的元素。使用这种方法,敏感信息(如密码)就不会长期存在于系统中。
作业的算法有点难想
特别是测试点与格式化输入输出








我的BUG
字符串转换为数字异常:NumberFormatException
这是因为你没搞清楚java中int类型的范围,在java中int取值是从-2147483648到2147483647,2的31次方.而我的超过了这个最大的值,当然会抛NumberFormatException这个异常,说明不能转换类型.去掉一个能成功是因为他在范围内.
string.length()的长度获取法
length()比较直观,表示的就是该字符串的长度。
1、所对应的用法:
String[] list={"a","b","c"};
System.out.println(list.length);
2、所对应的用法
String a="apple";
System.out.println(a.length());
为什么String有length()方法?
String背后的数据结构是一个char数组,所以没有必要来定义一个不必要的属性(因为该属性在char数值中已经提供了)。和C不同的是,Java中char的数组并不等于字符串,虽然String的内部机制是char数组实现的。(注:C语言中,并没有String类,定义字符串通常使用char string[6] = "hollis";的形式)
字符串的产生
由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对
象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象是不检查字符串
池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。上述原则只适用于通过直接量给String对象引用赋值的情况。
我学到了
1、equals():比较两个字符串是否相等
str是一个用来与调用字符串(String)对象做比较的字符串(String)对象。如果两个字符串具有相同的字符和长度,它返回true,否则返回false。这种比较是区分大小写的。(与c语言的大不同不能用==)
简单的说,“==”用于判断引用是否相等,equals()用于判断值是否相等。除非你要比较两个字符串是否是同一个对象,否则你应该使用equals()方法。如果你知道字符串驻留的概念会更好。
2、equalsIgnoreCase( ):两个字符串是否相等比较
其缺失忽略了大小写的比较
3、charAt():返回指定位置的char值
4、indexOf():指出 String 对象内子字符串的开始位置
int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。
int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引。
int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字\
在JDK 6,substring()方法不会创建一个新的字符数组,而是使用原有字符串的字符数组,为了创建一个新的字符数组组成的字符串,你可以在后面加上一个空字符串,如下:
str.substring(m, n) + ""
这会创建一个新的字符数组,组成新的字符串对象。使用这种方法有时候会提高性能,因为垃圾回收器能回收无用的大字符串,只保留剩下的子字符串。
在JDK7,substring()方法会创建一个新的字符数组,而不是使用已有的,可以参考以下链接了解更多关于JDK6和JDK7中substring()方法的异同。
String/StringBuffer/StringBuilder它们之间的区别?为什么要引入其它两种字符串处理类?
答:目的是提高字符串连接效率。在大部分情况下,字符串拼接速度为:StringBuilder>StringBuffer>String.
String是不可变的,因此每次对其操作改变变量值,其实都是生成一个新的对象,然后将变量引用指向新的对象,因此速度慢。
StringBuffer则不同,对其操作即直接操作对象指向的引用,无需产生新的对象,速度很快;它的线程是安全的,在维护多线程的同步上也会损耗一些性能。
StringBuilder是JDK5之后新增的,其用法与StringBuffer一致,但它的线程是不安全的,在单线程中最佳,因为其不需要维护线程安全,因此也是最快的。
String 字符串常量(线程安全)。StringBuffer 字符串变(线程安全)。StringBuilder 字符串变量(非线程安全)。String是不可变的,StringBuffer/StringBuilder 是可变的;String/StringBuffer是线程安全的,StringBuilder是非线程安全的。
18、这里引入一个新的问题,了解String.intern()方法吗?
String.intern()查找常量池中是否有相同的unicode字符串常量,如果有则返回其引用,如果没有,则在常量池中增加一个unicode等于str的字符串并返回它的引用。因此在用String进行字符串拼接时,会产生很多临时变量。建议多使用StringBuffer/StringBuilder。
19、String/StringBuffer/StringBuilder都分别存放在什么地方?
String是存放在常量池中,在编译期间已经被确定了。new String()不是字符串常量,他有自己的地址空间,放在堆空间,而其他两个都存放在堆空间中。
学习心得
java是一种面向对象的操作语言,必须要明白这点,才能从总体上把握java。学习编程,首先要从分析别人的代码开始,明白他们的思路,认真分析,在学习的过程中一定要动手做、写代码,九比如说老师布置的试验作业,一定要自己做,不能抄同学的,首先不是为了应付老师,而是要让自己真正懂得java,这样慢慢的,以后的试验自己就又实力去做。学习java不是抱一本书看看就行。很多东西和体会必须自己动手才能真正属于自己,实践失最重要的。而且还可以从实验中,体会到编程的乐趣,感受到自己做好一个程序,然后运行出结果,失很有成就感的!
在学习Java的语法时,Java的语法是类似c语言的,所以学习的比较轻松。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,和同学一起讨论了好久才得以解决。
在学习Java的面向对象的编程语言的特性。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C语言的经验,花了很长时间,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了很多遍,才彻底领悟了。

浙公网安备 33010602011771号