目标: 通过完成笨题目学习java编程的同时,通学java的String类。
一. java String学习 【 参考学习链接: http://sarin.iteye.com/blog/603684 好文章!!!】 测试代码: StringTest
【 学习链接 : http://www.importnew.com/9622.html 】
1) 内存分配:
栈内存 : 对象的引用 >>>>>>>> 堆内存 : 对象
常量区 String
2) Sting类 本质是 字符数组 char[] ;
其次String类是final的,是不可被继承的,这点可能被大多数人忽略;
再次String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的(不同于别而 类);
String池的概念,Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。String池不属于堆和栈,而是属于常量池。
任何重新修改String都是重新分配内存空间,这就使得String对象之间互不干扰。即String中的内容一旦生成不可改变,直至生成新的对象。
使用+连接字符串每次都生成新的对象,而且是在堆内存上进行,而堆内存速度比较慢(相对而言),那么再大量连接字符串时直接+是不可取的,当然需要一种效率高的方法。Java提供的StringBuffer和StringBuilder就是解决这个问题的。区别是前者是线程安全的而后者是非线程安全的,StringBuilder在JDK1.5之后才有。不保证安全的StringBuilder有比StringBuffer更高的效率。
二. 代码实现:
参考链接: http://www.2cto.com/kf/201501/369347.html http://www.programcreek.com/2012/12/leetcode-string-to-integer-atoi/
<span style="font-size:12px;">public class Solution {
public int myAtoi(String str) {
// if(str == NULL || str.length()<0) //null是大小写敏感的,不能写成NULL 、 Null等。
if(str == null || str.length()<=0)
return 0;
//下面的判断都是在str非空的情况的进行的
//首先去掉前面的空格
str = str.trim();
//判断String中是否很有正负号(因为数据的正负号肯定在数据的最前面)
char flag ='+'; //char是单引号('')
int i = 0;
if(str.charAt(i) == '-'){
flag = '-';
i++;
}else if(str.charAt(i) == '+'){
i++;
}
//接下来string to integer
double res = 0;
//不存在单独对字母的判断,因为如果刚开始是字母,就不会执行下面的,如果中途有字母也会终止,返回前面的值
while(str.length()>i && str.charAt(i)>='0' && str.charAt(i)<='9'){
res = res *10 + str.charAt(i)-'0'; //因为charAt返回的是char类型,所以通过-‘0’将char类型转换成int型
i++;
}
if(flag == '-')
res = -res; //因为正数和负数绝对值差1,所以这里需要先标出正负,在进行int越界的判断
if(res > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
if(res < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
return (int)res;
}
}</span>