编程方法学 - 公开课学习笔记(五)

时间:2023-01-25 23:10:27
第13课:对字符串的处理 2011.7.25

  接着上一课介绍String,进行了char和String的区分。

  介绍了StringTohenizer的用法,以前我一般使用的是String[] str.split的方式,从C过来,比较习惯[]的数组方式。同样适用单纯分割,可以用于文本啊消息的解析。缺省是“ ”分割,如果需要使用其他的分割或者增加某些分割,可以在构造函数中指定,例如new StringTohenizer(str, ", ");,这里表示使用空格和逗号作为分割。可以用hasMoreTokens()检查,以及用nextToken()方法来获取。

  接着是一个奇技淫巧,字母的移位,可以向后移动,也可以向前移。如果想前迁移,可修订为26-(-key % 26),其中key就是位移,向前位移3,key=-3。另一方面也就是我们程序需要注意的,key不仅仅可以为正,也可以为负,不仅在正负26范围内,也可以在之外,key可以是任何整数,而不是人为的想当然只是某些值,这会导致程序是否正确运行。


编程方法学 - 公开课学习笔记(五)

第14课:内存 2011.7.26、27

  介绍内存,这绝对是C程序员中痛苦的回忆,尤其在开发服务的时候,不要导致内存泄漏,不要忘了释放内容。以前曾经有书说java没有指针,其实每个对象都是指针,只是程序员无需关心回收内存,避免很多异常。

  在java中,char占2 bytes。

  数据存储有静态变量,在调用程序的时候就已经分配。动态变量数据,存储的方式成为HEAP,例如一个变量存储在地址2000,那么下一个变量存储在2004,地址分配是不断增加的。local变量数据,存储的方式成为stack。例如一个变量存储在地址FFFF,下一变量存储在地址FFFC,地址是不断减少。

  Heap的地址在增加,stack的地址在减少,如果他们的地址空间重叠,就会出现崩溃。但是大部分的程序不需要考虑这个问题,因为内存足够。只是如果服务器是不简单允许,必须要跟踪这种情况,如果内存一直涨得不到收敛,就很麻烦了。

  无论是Heap还是stack在分配的时候一个4bytes的overhead,例如一个method,有2个local变量,那么先分别一个overhead,表示这个method,然后分配两个变量的内存,如果其中一个变量是通过new来创建一个对象,在运行时,运行到new的时候,这就是一个动态变量,从heap中分配一个overhead,这个overhead的地址就是这个对象的地址,然后在heap中为这个对象分配内存。Object o = new Object(......);通过这个"=",将对象的地址也就是指针的数值填入之前在stack中为这个变量分配的4 bytes中的内存中。

  由于所需学习C,所以对java的内存分配还是很能理解,只是不知道分为heap和stack两种存放方式。


第15课:指针要点回顾和文件 2011.7.27

  先继续上一课对指针作进一步说明。对于primitive,也就是包括int,double,boolean,char这些,不是对象,所以内存中保持是当前的数值,如果作为method中的parameter,那么就是给出一份copy。这点和对象传递指针有重大不同,copy一份指针,实际还是指向同一对象。

  接着介绍文件,通过类BufferReader去读文本,通过类PrintWriter去写文本。文件处理完毕要记住close()。

  介绍java的异常捕获和处理。try{...}catch(IOException e1){}catch(Exception e2){},这是java比C/C++中更适合服务器开发的方式,可以轻松处理你想到和你没有想到的异常。Yeah,这确实是价值连城。try中的语句数量要少,对危险操作才进行catch,尽量不要将大量的处理统统扔进来,不过如果你感觉不可靠,都可以扔进来。catch我也经常喜欢用于调测,例如程序挂了的原因定位。可以throw一个异常,给调用者进行处理。


相关链接:我的与编程思想相关的文章