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语言的经验,花了很长时间,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了很多遍,才彻底领悟了。

posted @ 2022-04-11 10:13  jjsholy  阅读(33)  评论(0)    收藏  举报