字符串是程序开发中使用最为频繁,因此为了工作的高效和作为一名想进阶的程序员,了解并掌握字符串的处理显得尤为重要。java为我们提供了String、StringBuffer、StringBuilde三个处理字符串的类,下面我们对其做一个总结和介绍。

1、分别介绍

  1)String

  解答1:

  我们在查看API文档的时候,会发现有这么一句话“字符串是常量,它们的值在创建之后不能更改”。众所周知常量是用final修饰的,一旦创建在程序的其他地方无法修改。这时我们就会快速的回想,在我们日常的开发中String是可以随时随地可对其赋值的,难道是jdk的API文档写错了?其实不然,下面我们对其原理进行讲解。


public static void main(String arg[]){
String str1 = "a";
String str2 = str1;
String str4 = str2;
System.out.println(str1 == str2);//true,说明引用stt1和引用str2指向了同一地址
String str3 = "b";
str1 = str1 + str3;
System.out.println(str1 == str2);//false,说明引用str1所指向的地址已经改变
System.out.println(str2 == str4);//true
str2 = str2 + str3;
System.out.println(str2 == str4);//false,说明引用str2所指向的地址已经改变
System.out.println(str1 == str2);//false
}

  因为String是引用类型,引用类型在内存中的存储如下图

  

  也就是说,当我们在对str1做改变的时候,只是改变了其在栈内存中存储的引用所指向的地址,与此同时java虚拟机会为其在堆内存中重新分配新的空间,而原来堆内存地址存储的值(因为是常量)并没有发生改变,会作为无用的引用被java回收站处理,到此相信可以顺利理解上述代码。

  解答2:

public class Test {

    private final static String s1 = "abc";
private final static String s2 = "abc"; public static void main(String arg[]){
String str1="abc";
String str2="abc";
String str3="ab"+"c";
String str4=new String(str2);
System.out.println(str1 == str2);//true,说明str1、str2指向同一地址
System.out.println(str1 == str3);//true,说明str1、str3指向同一地址
System.out.println(str1 == str4);//false,说明str1、str4指向不同的地址
System.out.println(s1 == s2);//true,说明s1、s2指向同一地址
System.out.println(str1 == s1);//true,说明str1、s1指向同一地址
} }

    上述现象是有常量在内存中的存储规则决定的,java代码在编译的阶段会在代码区中分配出一块存储区域,作为常量池,用于存储常量值。当再有常量被申明时,编译器会去常量池中查找这个字符串是否存在,若存在则将这个字符串的引用直接指向字符串所在地址,否则为其在常量池中分配新的空间,也就是说所有值相同的常量的引用会指向同一个存储地址。至于str4是编译器为其new了新的存储空间,将其作为对象处理,而不是常量。

  下面给出常量的内存中的存储分配

  

  注意:stack为栈,Heap为堆,Method Area为方法区,也即代码区。

  解答3:String的常用方法

  equals(Object anObject)和equalsIgnoreCase(String anotherString):equals是开发中使用非常频繁的方法,需要区分equals和“==”所比较的对象,equals比较的是两个对象(引用)的值是否相等,“==”比较的对象既可以是基本数据类型,也可以是引用类型,当比较对象为基本数据类型时就是值的比较,当比较对象是引用类型的时候比较的是引用(引用所指的地址),而不是引用所指向的值。后者是不考虑大小写的比较。

  contentEquals(CharSequence cs)、contentEquals(StringBuffer sb):字符串与指定的CharSequence/StringBuffer比较。

  compareTo(String anotherString) 和compareToIgnoreCase(String str) :按字典顺序比较两个字符串,后者忽略大小写。

      matches(String regex):当前字符串是否匹配给定的正则表达式。

      length():返回次字符串的长度

  isEmpty():当且仅当 length() 为 0 时返回 true

      split(String regex)、split(String regex, int limit) :据给定正则表达式拆分字符串

  substring(int beginIndex) 、substring(int beginIndex, int endIndex):按规则返回此字符串的子字符串

  replace(char oldChar, char newChar)、replace(CharSequence target, CharSequence replacement)、replaceAll(String regex, String replacement):替换

  valueOf(boolean b)等:返回基本数据类型的字符串表示形式

  valueOf(Object obj):返回Object的字符串形式

  toLowerCase()和toUpperCase():使用默认语言环境将此字符串中的所有字符转换为小写/大写

  toCharArray():将字符串转为字符数组

  contains(CharSequence s) :当且仅当字符串包含指定的char值序列时返回true。

  indexOf(int ch) 、indexOf(int ch, int fromIndex) 、indexOf(String str) 、indexOf(String str, int fromIndex) :按规则返回索引。

  lastIndexOf(int ch) 、lastIndexOf(int ch, int fromIndex)、lastIndexOf(String str)、lastIndexOf(String str, int fromIndex):按规则返回指定字符或字符串最后出现位置的索引。

  concat(String str):指定字符串连接到此字符串的结尾。(一般用+号解决了,所以用的很少)

  trim() :返回字符串的副本,忽略前导空白和尾部空白

  2)StringBuffer

    线程安全的可变字符序列。

  append(String str)等:将字符串追加到此字符串后面

  insert(int offset, String str)等:将字符串插入此字符序列中

  reverse():将此字符序列用其反转形式取代。这是一个非常有用的方法,可方便的将指定字符串逆序输出。

  toString():将StringBuffer串转换为String

  3)StringBuilde

    一个可变的字符序列,基本和StringBuffer相同,但是是非线程安全的,所以效率高于StringBuffer、Stringj。

2、String、StringBuilde、StringBuffer比较

  1、StringBuilde是非线程安全的,StringBuffer是线程安全的。

  2、效率上String<StringBuffer<StringBuilde

    原因在于String是字符串常量,另外两个是字符串变量,String在每次赋值时都需要new一个新的对象(上面有详细介绍),原有对象会被GC当垃圾回收,会大大降低执行效率。而StringBuffer与StringBuilder是字符串变量,改变发生在同一对象,少了创建、销毁对象环节。

  最后建议,如果操作少量数据则使用String,如果单线程下操作大量数据则用StringBuilder,如果是多线程下操作大量数据则用StringBuffer。

java基础知识(二)字符串处理的更多相关文章

  1. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  2. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  3. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  4. Java基础知识二次学习--第六章 常用类

    第六章 常用类   时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...

  5. Java基础知识二次学习-- 第二章 基础语法与递归补充

    第二章 基础语法与递归补充   时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...

  6. java 基础知识六 字符串1

    java  基础知识六  字符串1 String 不是java的基本数据类型 String 不是java的基本数据类型 String 不是java的基本数据类型 字符串是是一个字符序列 1.创建 创建 ...

  7. Java基础知识二次学习--第七章 容器

    第七章 容器   时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...

  8. Java基础知识二次学习--第五章 数组

    第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...

  9. Java基础语法<二> 字符串String

    1. 代码点与代码单元 Java字符串由char序列组成.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length()方法将返回采用UTF-16编码表示 ...

  10. java基础知识(二)

    java的布局管理: borderLayout:则将板块分为东西南北中五个方向,每添加一个组件就要指定组件摆放的方位,放置在东西南北四个方向的组件将贴边放置.当拉大Frame的时候,处在center( ...

随机推荐

  1. 洛谷P3407 散步[分组]

    题目描述 一条道路上,位置点用整数A表示. 当A=0时,有一个王宫.当A>0,就是离王宫的东边有A米,当A<0,就是离王宫的西边有A米. 道路上,有N个住宅从西向东用1-N来标号.每个住宅 ...

  2. AFNetWorking3.0源码分析

    分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end

  3. 分布式服务框架 dubbo/dubbox 入门示例

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  4. Gradle 10分钟上手指南

    java的源码构建工具,大致经历了 ant -> maven -> gradle 这个过程,每一次进步,都是在解决之前的工具所带来的问题,简单来说: 1. ant 功能虽然也很强大,但是过 ...

  5. 跨域的另一种解决方案——CORS(Cross-Origin Resource Sharing)跨域资源共享

    在我们日常的项目开发时使用AJAX,传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片 ...

  6. .bat文件和Jar包的生成及运行

    .bat文件和Jar包的生成及运行 1.Jar包简单介绍 Jar包是Java中所特有的一种压缩文档,有点类似于zip包,区别在于Jar包中有一个META-INF\MANIFEST.MF文件(在生成Ja ...

  7. rsyslog配置报错解决

    配置过程中,查看/var/log/meassage 有报错信息: action '*' treated as ':omusrmsg:*' - please use ':omusrmsg:*' synt ...

  8. 【原创】相对完美的垂直居中popup(modal/dialog),无需监听window.resize事件

    <table class="popup" style="position: absolute; background-color: black; border-ra ...

  9. QQ个人文件夹中的文件被占用,解决办法

    我的情况是记住密码的账号不可以登录,不记住密码的账号确可以登录,突然就这样,我也很郁闷. 找到路径C:\Users\Public\Documents\Tencent\QQ下的UserDataInfo. ...

  10. javascript中怎么判断对象{}为空

    有时候通过AJAX方法调用返回的是一个JSON对象,而这个对象可能在开发过程中会没有数据是一个空{}. JavaScript判断object/json 是否为空,可以使用jQuery的isEmptyO ...