本文实例总结了Java中的字符串用法。分享给大家供大家参考。具体分析如下:
字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对象。这也正体现了Java完全面向对象的语言特点。
String 类
1、String类对象表示的是一个常量字符串。它是不可变长度的。也就是说,一旦创建了一个String类的实例,那么这个实例所表示的串是不可改变的。类似于
str = str + "Hello";
这样的操作,实质上是将 str 和 "Hello" 这两个String对象合起来创建了一个新的String对象,然后将新String对象的引用赋给了str。大量使用这种操作,就会造成性能上的缺陷。如果需要经常改变字符串的内容,应该使用StringBuffer类或StringBuilder类。我们可以用一段小程序来看看 String 和 StringBuffer类的性能差异到底有多大。
class StringTest { public static void main(String[] args) { /** * 分别用String 对象和 StringBuffer 对象执行10,000次追加操作 * 测试执行时间 * 2013.3.18 */ String constStr = ""; long lTime = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; ++i) constStr += i; System.out.println("Const String:"+(System.currentTimeMillis()-lTime)); StringBuilder strBuf = new StringBuilder(""); lTime = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; ++i) strBuf.append(String.valueOf(i)); System.out.println("Buffered String:"+(System.currentTimeMillis()-lTime)); } }
执行结果:
可以看到,StringBuilder秒过,而String类却要用300ms的时间,可见性能差异之巨大。
StringBuilder 和 StringBuffered都表示一个可变长度(mutable)的字符串对象,它们之间的区别在于,StringBuffered类会在线程同步方面做一些安全性处理,而StringBuilder则反之。所以如果只是在单线编程的话,StringBuilder要比StringBuffered效率稍高一些(其实区别也并不大)
2、"Hello World" 是一个String对象
我们可以直接把"Hello World"当作一个对象来使用,如:
if("Hello".equals("Hello")) System.out.println("Yes");
输出结果为Yes.
3、字符串对象比较要用equals()方法,而不能单纯地使用 == 来判断。因为 == 比较的是两个引用名称所引用的实例是否相同,equals()方法则比较的是两个对象中的字符串是否相等。
一个常见的问题是,下面的代码片断一共产生了几个String对象?
String str1 = new String("Hello"); String str2 = new String("Hello");
可能多数人会回答,2个。但事实上这里一共产生了3个String对象。除了str1 和str2,别忘了"Hello"也是一个String对象哦。
4、String池(Pool)
Java执行时会维护一个String池。当出现一个由双引号声明的字符串时,JVM会首先核查在内存中是否存在相同的String对象(字符相同),如果存在,则返回内存中已经存在的对象的引用 ,如果不存在才会创建一个新的String对象。这样可以节约内存。如下面一段代码,str1和str2实际上是指向的同一个String对象.
String str1 = "Hello"; String str2 = "Hello";
5、接收命令行参数
我们在声明main方法时,会声明一个String[] 类型的形参。这个String对象的数组就保存了用户在执行这个程序的时候所传递进来的命令行参数。注意,与C语言不同的是,Java里的命令行参数是从程序名称后第一个变量开始的。也就是说,String[]数据并不包括应用程序名。例如:
class strCmd { public static void main(String[] args) { if(args.length > 0) { for(String str : args) System.out.println(str); } } }
执行 java strCmd Hello World!时的输出结果为:
6、字符串的分离
类似于C语言中的strtok,String类也有一个split的方法可以以指定的格式分离一个字符串。split方法返回一个String对象的数组,表示分离出的每一段字符串。如:
class strSplit { public static void main(String[] args) { String str = "Hello\tWorld\tI\tLove\tYou!"; System.out.println("Original String : " + str); String[] strArr = str.split("\t"); for(String s : strArr) System.out.println(s); } }
其中,split()方法的参数可以是正则表达式。可以使用java.util包中的Matcher类的静态方法matches()来判断一个字符串是否符合正则表达式
String类还有更多其它强大的功能,我们应该学会阅读API文档。在这里就体现了英语的重要性了、、
希望本文所述对大家的java程序设计有所帮助。
本文向大家介绍Java常用字符串方法小结,包括了Java常用字符串方法小结的使用技巧和注意事项,需要的朋友参考一下 下面是对字符串操作的代码小总结。大部分是String类的 操作方法,需要的朋友可以参考下 上面代码学习的朋友可以参考下
问题内容: 我听到一位同事说,即使我将String成员放在Java类中,即使String为空,我也要支付“ 24字节”的费用。准确吗?Integer,Float,Double是否相同?(与int,float,double相对,后者分别为4、4和8个字节)。 问题答案: 你要付4首或8个字节的 参考 。是否为每个“容器”对象实例额外的 对象 付费,取决于您如何获取空字符串。例如,如果您使用文字,那么
问题内容: 我正在解决一个简单的问题: 在Java中删除字符数组中的某些字符,想法很简单: 我想输入一个信号,表示当我们想要使用例如生成一个字符串时,不必考虑数组的其余部分 Java中是否有这样的字符?(我想是,但我不确定) 例如,当我们调用: 这将被打印: 虽然我想得到,但我不想使用新的数组来做到这一点 问题答案: Java不会像C那样“标记”字符串的结尾。它跟踪长度和值,因此字符串中可以包含零
问题内容: 显然,javac中初始化字符串的大小受到限制。谁能帮助我确定最大限额? 谢谢 编辑: 我们正在构建一个初始化字符串,看起来像这样的“ {1,2,3,4,5,6,7,8 ......}”,但理想情况下应包含10,000个数字。当我们为1000执行此操作时,10,000会引发错误,提示代码对于try语句而言太大。 为了产生这种效果,我们使用了一个stringbuilder并在附加值的数组上
本文向大家介绍Java的字符串中对子字符串的查找方法总结,包括了Java的字符串中对子字符串的查找方法总结的使用技巧和注意事项,需要的朋友参考一下 Java中字符串中子串的查找共有四种方法,如下: 1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引。 2、int indexOf(String str, int startIndex):从指定的索引处
问题内容: 为什么以下算法对我来说不停止?(str是我要搜索的字符串,findStr是我要寻找的字符串) 问题答案: 最后一行造成了问题。永远不会为-1,所以会有无限循环。可以通过将代码的最后一行移到if块中来解决此问题。