1 前言 String类是Java编程语言中最为重要的对象之一 。通常,字符串对象在内存中总是占据了很大的空间,因此,如何高效的处理字符串是提升系统性能的关键 。这也是String操作总是出现先面试题中的原因所在 。
2 String类的特点 String类是Java语言中重要的数据类型,但它并不是Java的基本数据类型 。在C语言中,对字符串的处理通常的做法是使用char数组,但这种方式的弊端是显而易见的,即数组本身无法封装字符串操作所需要的基本方法 。在Java语言中,Java的设计者对String对象进行了大量的优化,主要表现在以下3个方面:
不变性;在Java语言中String字符串一旦创建,则不能再对它进行修改 。这一特性主要作用于当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅提高系统性能 。
常量池;当两个String对象拥有相同的值时,它们只引用常量池中的同一个拷贝 。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间 。
类的final定义作为final类的String对象在系统中不能有任何子类,这主要是对系统安全性的保护 。
下面我们通过一段代码示例,来分析一下String内存分配机制 。
String s1 = "aaa";String s2 = "aaa";String s3 = new String("aaa");System.out.println(s1==s2);System.out.println(s1==s3);System.out.println(s1==s3.intern());
输出:
truefalsetrue
以上代码显示s1和s2引用了相同的地址,但是s3却重新开辟了一块内存空间 。我们又通过intern()方法发现s1和s3所指向的实体是一样的 。由此我们可以确定s1和s3引用了常量池中的同一个引用 。如下图所示:
String常量池内存
3 String操作 3.1 字符串查找 在软件开发过程中经常会遇到这样的问题:判断一个字符串的开始和结束子串是否等于某个子串 。例如,判断字符串str是否以Java开头,通常的做法是可以使用String类的startWith()方法 。但即便是这样的Java内置函数,其效率也远远低于charAt()方法 。
因此,在高频率情况下建议使用charAt()方法 。
3.2 字符串分割 字符串分割是处理字符串的最常用的方法之一 。字符串分割是指将一个原始字符串,根据某个分割符切割成一组小字符串 。
方案一:String对象的split()方法便实现了这个功能 。String.split()方法使用简单,功能强大,但是效率最差,在性能敏感的系统中频繁使用这个方法是不可取的 。方案二:StringTokenizer类是JDK中提供的专门用来处理字符串分割子串的工具类 。StringTokenizer性能优于split()方法,因此在能够使用StringTokenizer的模块中,就没有必要使用split();
方案三:使用String类的两个方法——indexOf()和substrin
推荐阅读
- ios数组排序的技巧 ios字符串转数组的方法
- c语言字符和字符串区别 c语言字符串定义
- java后端接口开发详细教程 java开发接口怎么写
- 验证java环境变量 java验证文件路径最佳方法
- 常用的java设计模式 java设计模式有哪些
- php查找字符串位置 php查找字符串是否存在
- Java培训机构排名 java技术培训班哪个好
- java中socket的用法 socket java编程
- java后端框架排名 java spring框架入门
- 为什么Python的受欢迎程度可能超过Java