- Java中的字符串详解
- 前言
- 一、字符串
- 1.字符串的构造
- 2.字符串的特点
- 3.格式化字符串
- 二、字符串类的使用(功能)
- 1.字符串的比较
- 2.字符串长度,字符以及组合字符串
- 3.获取子串
- 4.字符串的转换,替换与分隔
- 5.获取字符串中特定字符或子串的位置
- 6.字符串与基本类型之间的转换
- (1)将字符串转换为基本类型
- (2) 将基本类型转换为字符串
- 7.字符类Character
- 8.StringBuilder/StringBuffer类
- (1)StringBuilder类的构造方法
- (2)StringBuilder类修改字符串的方法
- (3)StringBuilder类其他一些获取属性的方法
- 总结
前言
字符串(String)是由字符构成的一个序列,在许多语言中,字符串常常作为一个 字符数组来处理,比如在C语言中,我们经常用char数组或者char指针数组来定义 字符串。但是在Java中,字符串是一个对象。Java定义了字符串类String,接下来 让我们了解一下这个类。
一、字符串 1.字符串的构造
可以使用字符串直接量或字符数组创建一个字符串对象。
何为字符串直接量呢?
其实就是用双引号括起来的任何字符。
使用字符串直接量的话有两种方法,
第一种:
String s = new String("welcome to java");
这里使用的是字符串类的构造方法,创建一个String对象s
第二种:
String s = "welcome to java";
由于Java可以将字符串直接量看作string对象,所以上面的语句是正确的 实际上我们习惯于用第二种,因为它更方便。
使用字符数组:
char[] c = {'w','e','l','c','o','m','e',' ',
't','o',' ','j','a','v','a'};
String s = new String(c);
2.字符串的特点
不可变性:
String s = "java"; String s = "html";
String对象是不可变的 ,它的内容是不能改变的。 以上的代码首先创建了一个内容为“Java”的String对象,将其赋值给s。 接着又创建一个内容为“html"的String对象,将其赋值给s。 赋值后第一个String对象仍然存在,但是不能在访问它了,因为现在的s 指向了新的对象。
限定性:
因为字符串在程序设计中是不可变的,但同时又会频繁地使用,所以Java虚拟机(JVM) 为了节约内存,对具有相同字符串序列的字符串直接量使用同一个实例。
String s1 = "welcome to java";
String s2 = new String("welcome to java");
String s3 = "welcome to java";
System.out.println("s1 == s2 is " + s1 == s2);
System.out.println("s1 == s3 is " + s1 == s3);
结果如下:
s1 == s2 is false s1 == s3 is true
看到这里大家是不是很疑惑,脑子里瞬间多了???为什么s1和s2不相等呢?它们俩明明是相同的字符串序列啊?
原因呢,是因为直接定义一个字符串和new一个字符串对象的内存不在同一个地方。具体说明看这个:链接:传送门
String类中有一个静态的format()方法,它可以创建一个格式化的字符串。具体用法如下:
语法:
String.format(format,item1,item2,item3,...,itemk);
例如:
String s = String.format("%5.2f",45.556);//s = 45.56
二、字符串类的使用(功能)
下面小编直接上图了,常用的会另外说明的哦
考虑到有小伙伴看不懂图,所以现在这里介绍一下:
UML类图(拿下面第一个图第一个方法说明) 第一行是类名:java.lang.String 图中“ + ”号表示公共的,同理,“ - ”号表示私有的,不可访问的。 +equals(s1: String): boolean中: s1是参数名,String是参数名的类型,boolean是返回值类型。1.字符串的比较
这里要说明的是我们常容易用 == 运算符来比较字符串,其实它比较的是字符串变量是否指向同一个对象。其实就是上面介绍的字符串的特点中的限定性(这不就联系起来啦嘛)。例如:
String s1 = "welcome to java";
String s2 = "welcome to java";
String s3 = new String("welcome to java");
String s4 = "good day";
System.out.println(s1 == s2);//这里会输出true
System.out.println(s1 == s3);//这里会输出false
System.out.println(s1 == s4);//这里会输出false
如果我们要比较内容的话,可以使用上图的equals和compareTo方法。具体用法如下(注:这里继承上面定义的变量):
//s1.equals(s2)方法返回boolean类型,如果s1和s2的内容相同,返回true,否则返回false System.out.println(s1.equals(s2));//true System.out.println(s1.equals(s3));//true System.out.println(s1.equals(s4));//false System.out.println(s1.compareTo(s2));//0 System.out.println(s1.compareTo(s3));//0 System.out.println(s1.compareTo(s4));//因为按照字典码的顺序s1大于s4, //且s1和s2第一个字符不同,w和g,两者相差16,所以返回一个大于0的数,16 String s5 = "zhang san"; System.out.println(s1.compareTo(s5));//按照字典码的顺序s1小于s5, //且s1和s2第一个字符不同,w和z,两者相差3,所以返回一个小于0的数,-3
下面是上述代码的运行结果:
2.字符串长度,字符以及组合字符串
这里先说明一下,前两个最好记下来
(1)
Java里提供了获取字符串和数组的长度方法,在此区别一下这两种方法:
获取字符串s的字符个数使用s.length() 获取数组a的元素个数使用a.length
(2)
由于Java允许在不创建新变量的情况下,使用字符串直接量直接引用字符串。 所以,我们还可以这样: "welcome to java".charAt(0); 它返回w。
charAt()方法获取字符串中特定下标的字符,我们可以用这个方法干什么呢?
可以用这个方法获取字符后,再使用字符character类中的各种方法来操作获取到的字符。至于例子呢,等稍后介绍了character类后再来举叭(这里我们要记住字符串类中有一个和字符character类有关系的方法)。
(3)
concat()方法可以连接两个字符串,例如:
String s3 = s1.concat(s2);
这条语句将s1和s2连接构成新字符串s3(将s2追加到s1后面)。
因为我们会经常用到字符串的连接,所以为了方便,Java可以使用加号(+)连接两个和更多的字符串。这里说个小技巧:
我们使用加号(+)来连接两个或多个基本类型数据的时候是会直接计算的。 而连接字符串的时候是连接内容的。所以我们可以这样: int a = 4; String s = a + ""; 就把一个基本类型转换成了字符串类型。于是,我们得到: 字符串+基本数据类型=字符串3.获取子串
这里就不多说了,注意参数的下标别出界就行。
(1)
字符串一经创建,其内容就不能改变。所以以上方法会返回一个源自原字符串的新字符串。
(2)
通过指定某个模式来匹配,分隔,替换一个字符串。这种模式通常成为正则表达式。是一个非常强大的字符串匹配工具,不过就是有点复杂。小伙伴们可以自行百度,为什么呢?因为在下也不会呗。
以上方法返回特定字符或子串的下标。
Java为每一种基本类型提供了一个包装类,在java.lang中。除了char和int的包装类名分别叫Character和Integer外,其他的包装类名都是基本类型的首字母大写。每种包装类里都有一个parse的方法来将字符串转换为与其对应的类型(除了character类)。例如:
String s = "5"; int a = Integer.parseInt(s); double b = Double.parseDouble(s); System.out.println(a);//5 System.out.println(b);//5.0
我们使用String类中的toCharArray()方法来将字符串转换为字符数组类型:
String s = "java";
char[] chars = s.toCharArray();//chars = {'j','a','v','a'}
(2) 将基本类型转换为字符串
还有一种方法是每个基本类型的包装类中的toString()方法。
字符类可以对字符进行操作,这里我们接着第2节String的charAt()方法来介绍,例如:
String s = "welcome to java";
if(Character.isLowerCase(s.charAt(5))){
System.out.println(Character.toUpperCase(s.charAt(5)));
}
运行结果为 M
8.StringBuilder/StringBuffer类由于String类对象一经创建内容就不能再更改了,所以当我们需要更改时就得使用StringBuilder/StringBuffer类了。这两个类是可以代替String类的另一种处理字符串的解决方案。
其中,StringBuilder类适合用于单任务访问;而StringBuffer类适合用于多任务并发,并且StringBuffer类与StringBuilder类相比,它修改缓冲区的方法是同步的。除了这些以外,这两个类几乎是完全一样的。所以,这里小编介绍StringBuilder类。
这里要注意的是改变StringBuilder字符串生成器中的内容之后,返回的对象仍然是这个字符串生成器,并且内容改变了,例如:
StringBuilder s1 = new StringBuilder("welcome to java");
StringBuilder s2 = s1.reverse();
System.out.println(s1 == s2);//true
因为返回的是原来的对象,所以s1和s2指向同一个对象。
(3)StringBuilder类其他一些获取属性的方法在这介绍之前,小编先让大家看一下这个情况:
char[] a = new char[2];
a[0] = '0';
for(int i = 0;i != a.length;i++){
System.out.println(a[i]);
}
运行结果如下:
注意这里是0和一个换行符,也就是说,一个字符数组(必须是字符数组!!)定 义以后,有元素的会显示(0也是元素),没有元素的不会显示。 只能说存在这个位置,但没有任何元素。
capacity()返回字符串生成器当前的容量。容量是指在不增加生成器大小的情况 下,能够存储的字符数量。在计算机内部,字符串生成器是一个字符数组,所以 容量就是数组的大小,也就是长度。生成器的容量会自动增加的:如果在没有设 置新长度的情况下,追加一个字符串后超出了生成器的容量,就用新数组代替原 来的数组,新数组大小 = (原来数组长度 + 1)x 2。
length()方法返回字符串生成器实际存储的字符数量。
setLength( newLength )方法设置字符串生成器的长度。
如果新长度newLength小于生成器的当前长度(不是容量!!!),那就会把生成器截短到新设置的长度;
如果新长度newLength大于生成器的当前长度,那就会在生成器上追加足够多的null字符(这里的原因就是上面介绍的啦,追加后会显示的),
使其长度成为新设置的长度。
总结
好了,这里就全都介绍完了。第一次写,不足之处还请指教。
最后认识一下吧,我是北迁。一名正在努力ing的大一学生。hhh~~~



