Sting类
Java中的字符串不是一个数据类型,而是一个预定义类。
String name = "ZhangSan";
对name进行操作,相当于对一个对象进行操作,应使用成员运算符.
调用String类的方法substring()
String lastName = name.substring(0, 5);
//此时,lastName为“Zhang”
拼接
Java中可用 +
对字符串进行拼接:
String name2 = lastName + "Dapao";
与C/C++的区别
Java中的String,不是字符数组char name[] = "ZhangSan"
,而是类似C中的char *指针char *name = "ZhangSan"
。
String name = "ZhangSan";
name = "WangWu";
当在Java中执行上述语句时,先在栈中分配name
这个变量的内存,再在堆中分配字符串"ZhangSan"
的内存,并把"ZhangSan"
的地址存在name
变量中。又在堆中分配"WangWu"
的地址,把"WangWu"
的地址存入name
变量的内容。若没有指针指向"ZhangSan"
,Java将自动进行垃圾回收。
P.S. 在C中,
char * x = "zhang"; x = "wang";
是如何处理的? 推测可能的方法有:
- “zhang”所在的空间存入”wang”,x的值不变
- 新分配一块内存存储”wang”,x的值改变,指向了”wang”。那么,新的疑问:”zhang”的空间会如何处理?会不会在程序运行时自动释放?还是说需要用free()手动释放?
判断字符串相等
boolean isEqual;
isEqual = name.equals(name2);
isEqual = name.equals("ZhangDapao");
isEqual = "Zhangsan".equals(name2);
以上三种方式都是可行的。
但不能用==
进行判断,因为==
判断的是指针,即两个字符串是否在同一个位置。在同一个位置,字符串不一定相等;不在同一个位置,也不一定不相等。如
if (name == name.substring(0,5)) //判断的结果是false
空串和Null串
空串""
长度为0,有内容(即空),有很多方法可以判断一个字符串是否为空
1.
if (string.length() == 0)
2.
if (string.equals(""))
3.
if (string.isEmpty())
Null串与空串不同,表示没有对象与变量关联(注意String是一个类),判断方法为
if (null == string)
要检查一个字符串既不为null也不为空:
if (name!=null && name.length()!=0)
如果对一个null串使用.isEmpty()
或.isBlank()
方法,则会抛出一个NullPointerException
。因此,在判断一个字符串是否为空之前,一定要先判断是否为null。或者使用StringUtils工具类,判断不为null也不是空:
if (StringUtils.isNotBlank(name))
P.S. 那么空串是否在堆中分配了空间?分配了多少?变量是否存有指针?
构建字符串
用拼接,即"AB" + "CD"
的方式构建字符串效率比较低,每次拼接都会构建新的String对象,耗时耗空间。
应该使用StringBuilder类来构造:
StringBuilder builder = new StringBuilder();
每次添加内容,用append方法:
builder.append("Zhang");
builder.append('S'); //方法参数不同
//或:
buider.append("Zhang").append('S');
用toString()
方法构造字符串:
String name = builder.toString();
最后
想要深入理解Java字符串,要先了解一下Java类和C/C++。虽然Java里没有指针,但理解了指针,肯定能更好地理解Java。大神们都说把C学好再去学其他语言就是小菜一碟,好好学C吧。