Java基础之字符串

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";

是如何处理的? 推测可能的方法有:

  1. “zhang”所在的空间存入”wang”,x的值不变
  2. 新分配一块内存存储”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吧。