字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示。从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变字符串,即String初始化之后不可更改。

  估计到这就有人问了,字符串不是都可以改的吗?下面两种不都是更改吗?

String a = "123";

a = "1234";

a = a + "F";

  这里需要指出的是,字符串在内存中的存放分为两部分,首先内存堆中存放着具体内容,即char[],其次在内存栈中存放着具体内容所在的地址。上面说的不可更改是针对堆中的部分,而我们平时所做的字符串修改是在堆中新建一个char[],然后将栈中的部分修改为新char[]所在的地址,所以与C语言中的字符串更改相比Java中的字符串内容修改效率要稍低一些,而牺牲效率换来的就是不可变的字符串可以共享。

  在这里推荐大家在日常的开发工作中使用StringBuffer或StringBuilder来替代“+”,StringBuffer和StringBuilder创建的是可变字符串,在修改结束后调用toString()方式即可使其转变为不可变字符串。StringBuffer和StringBuilder的API相同,区别在于前者是线程安全的,后者线程不安全,而少了线程同步处理换来的就是更高的效率,记得之前测试的好像是StringBuilder的效率是StringBuffer的三倍左右,两者的速度都远高于“+”进行的传统拼接。虽然说三种方式速度都是在毫秒级别处理完,但是在频繁的调用时还是会有不小的差距,所以强烈建议使用StringBuffer和StringBuilder进行字符串的拼接。

  再一点就是关于字符串的比较,日常开发中经常会对字符串进行比较,上面说到字符串在内存中的存放方式,所以会出现这么一种情况,堆中的两个char[]内容一样,但是存放的位置不一样,使用==比较时发现两者不相等,所以Java中的字符串比较需要使用equals()方法,此方法比较的是字符串的内容,与存放位置无关。使用==比较会出现这么一个问题:程序中有一个间歇性的BUG,时有时无,原因就是两个字符串对象指向同一个char[]还是指向了两个内容相同的char[]。

  更多的关于String的方法可以查看API详细了解。

再回首,Java温故知新(八):Java基础之字符串的更多相关文章

  1. Java学习2_一些基础2_字符串_16.5.5

    接上一次的博客. 不可变字符串: Java中String类没有提供用于修改字符串的方法.如果想将greeting中的“Hello”改为“Help!”需要先提取所需要的的字符,然后再拼接.即 greet ...

  2. java虚拟机(八)--java性能监控与故障处理工具

    问题定位: 除了个人经验,知识,工具也是很重要的,通过数据进行问题分析,包括:运行日志.异常堆栈.GC日志.线程快照(threaddump/javacore文件 ).堆转储快照(heapdump/hp ...

  3. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

  4. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

  5. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  6. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  7. 再回首,Java温故知新(十一):Java反射

    最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用 ...

  8. 回首Java——再回首JDK

    如果你是刚要被Java军训的新兵,可有几时对环境搭建而不知所措?又如若你是驰骋Java战场多年的老将,可曾拿起陪伴你许久的82年的JDK回味一番?今天我们就来道一道JDK,重新来认识认识这个既熟悉又陌 ...

  9. Java回顾之Spring基础

    第一篇:Java回顾之I/O 第二篇:Java回顾之网络通信 第三篇:Java回顾之多线程 第四篇:Java回顾之多线程同步 第五篇:Java回顾之集合 第六篇:Java回顾之序列化 第七篇:Java ...

  10. JAVA第八次作业

    JAVA第八次作业 (一)学习总结 1.用思维导图对本周的学习内容进行总结 参考资料: XMind. 2.通过实验内容中的具体实例说明在执行executeUpdate()方法和executeQuery ...

随机推荐

  1. jQuery幻灯片skitter-slider插件学习总结

    @(关键词)[skitter|jquery|网页幻灯片|slider] Skitter 是一个非常酷炫的jQuery网页幻灯片插件,支持非常多种酷炫幻灯片切换方式,下载前往官网,另有参考文档 下面简单 ...

  2. [R] /usr/share/doc/apache2/README.Debian.gz

    Contents======== Apache2 Configuration under Debian GNU/Linux Files and Directories in '/etc/apache2 ...

  3. javascript content

    1. Chrome, Mozila, IE 2. jQuery, underscore, zepto 3. underscore 4. Backbone, AngularJS 5. RequireJS ...

  4. Delphi调用WINAPI时到底应该是指针还是结构体(注意是Delphi变量本身就是指针)

    看MSDN,GetWindowRect的说明如下: BOOL WINAPI GetWindowRect( _In_  HWND   hWnd, _Out_ LPRECT lpRect // 注意,没* ...

  5. Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)

    一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...

  6. Linux 统计文件夹下文件个数

    查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep "^-" | wc -l Linux下查看某个目录下的文件.或文件夹个数用到3个命令:ls列目录.用gre ...

  7. 【算法Everyday】第一日 二叉查找树转双向链表

    算法题目链接:http://bbs.csdn.net/topics/350093707 题目 // 1.把二元查找树转变成排序的双向链表 // 题目: // 输入一棵二元查找树,将该二元查找树转换成一 ...

  8. 【JS】壹零零壹

    function f1() { } var f2 = function() { } var O = {} O.f1 = f1 O.f2 = f2 console.log(O)

  9. CGI编程完全手册

    一.基本原理 CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口.通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器 ...

  10. module_init和init_module的区别

    今天在看CS8900的驱动时,发现其驱动的模块加载函数是init_module(),由于看到大多数的驱动用的模块加载函数大多是module_init()函数,所以一时没缓过神来,总是在找CS8900的 ...