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()和substring()手动完成字符串分割算法虽然性能最好,但是代码的可读性和系统的可维护性最差因此,在实际的软件开发过程中,开发人员需要在系统的各个方面进行权衡,采用最合适的方法处理问题3.3 字符串拼接很多时候,程序开发过程中并不能预知字符串的实际值,因此需要在程序运行过程中通过拼接的形式动态生成字符串例如:String str = "大家好,"+"我是"+"码农洞见";
然而上段代码的效率并不高,为了更高效的生成字符串,需要使用StringBuffer和StringBuilder类StringBuilder str = new StringBuilder();str.append("大家好,");str.append("我是");str.append("码农洞见");
3.4 StringBuilder和StringBuffer的选择它们都实现了AbstractStringBuilder抽象类,拥有几乎相同的对外接口两者的最大不同在于,StringBuffer几乎对所有的方法都做了同步,而String-Builder并没有做任何同步 由于方法同步需要消耗一定的系统资源,因此StringBuilder的效率也高于StringBuffer但是在多线程系统中,StringBuilder无法保证线程的安全,不能使用无论是StringBuilder还是StringBuffer,在初始化时都可以设置一个容量参数如果能够预先评估StringBuilder的大小,则能够有效地减少容量扩充的操作,从而提高系统的性能4 码农来洞见很多时候,开发人员的一些不以为然的习惯往往造成了系统性能的下降通过上面的讲解我们不难发现,其实,很多优化并没有想象中那么复杂和困难我们只要稍微思考权衡一下系统可能就会因为这一转变而产生巨大的变化不要因为这段代码性能不差几毫秒,然而对于一个系统来说,代码片段量何其庞大,少许的差别累加起来就会造成几秒甚至更大的差距以上就是我今天分享的内容,程序优化的方式方法有很多我分享的只是冰山一角我是码农洞见,为初学者提供学习指南,为从业者提供参考价值我坚信码农也具有产生洞见的能力欢迎大家关注交流(图片来源网络,侵删)
0 评论