对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面。事实上,Java字符串类的底层是通过数组来实现的。具体来说,String类是固定长度的数组,StringBuffer和StringBuilder则是可变长度的,其底层是通过Arrays.copyOf的方法,复制了另外的一个数组,实现了一个内部扩容机制,从而实现一种“伪可变”。

Java字符串要点

1. String类是不可变类,一旦创建,包含在String对象中的字符数组是不可变的,直至该对象被回收。但是正如数组一样,可以更改对象的引用,指向另一个String对象。

2. StringBuffer在使用上呈现出一个可变的字符数组的对象,因此有增删查改的方法。该类通过synchronized同步方法实现线程安全。

3. StringBuilder的构造方法和API与StringBuffer类似,不过是线程不安全的,因此性能较高。

String类构造方法和方法说明

 package org.leo.demo.arrays;

 import java.io.UnsupportedEncodingException;
//因为String类的不可变性,因此所有的连接、截取操作,都不改变原字符串的值。
public class TestString { public static void main(String[] args) throws UnsupportedEncodingException {
//字符串初始化
String s1 = "Hello World!";
System.out.println(s1);
//通过byte[]和码表来构造字符串
byte[] b = {21, 97, 12, 100};
String s3 = new String(b, "utf-8");//有UnsupportedEncodingException异常抛出
System.out.println(s3); //返回字符串长度
String s2 = new String("aeiou");
System.out.println(s2.replace('a', '$'));
System.out.println("s2.length()" + s2.length());
//通过索引查找字符
System.out.println("s2.charAt(2):" + s2.charAt(2));
//查找索引
System.out.println("s2.indexOf('o')" + s2.indexOf('o'));
System.out.println("s2.indexOf(\"io\")" + s2.indexOf("io"));
//查找前缀/后缀
System.out.println("s2.endsWith(\"ih\")"+s2.endsWith("ih"));
System.out.println("s2.startsWith(\"ae\")" + s2.startsWith("ae"));
//字符串的比较
String s21 = new String("aeiouwww");
String s22 = new String("aewou");
System.out.println("s2.compareTo(s21):"+s2.compareTo(s21));
System.out.println("s2.compareTo(s22):"+s2.compareTo(s22));
StringBuffer sb1 = new StringBuffer("aeiousss");
System.out.println("s2.contentEquals(sb1):"+s2.contentEquals(sb1));
System.out.println("s2.equals(s22)"+s2.equals(s22));
//连接
System.out.println(s1.concat(s2));//相当于"+"
char[] c = new char[] {'a','e','i','h','h','j'};
String s4 = String.copyValueOf(c, 1, 3);
System.out.println(s4);
//数组化
byte[] b1 = s4.getBytes();
System.out.println(b1.toString());
s4.getChars(1, 2, c, 2);
System.out.println(c.toString());
System.out.println(s4.toCharArray()); for(byte cc:b1) {
System.out.print(cc + " ");
}
} }

StringBuilder常用方法说明

 package org.leo.demo.string;

 public class TestStringBuilder {

     public static void main(String[] args) {

         StringBuilder sb = new StringBuilder();
System.out.println(sb.hashCode());
//增(追加)
sb.append("Java");
//增(插入)
sb.insert(0, "Hello ");
//改
sb.replace(5, 6, ",");
//删
sb.delete(5, 6);
System.out.println(sb);
//查
char c = sb.charAt(5);
System.out.println(c);
//反转
sb.reverse();
System.out.println(sb);
//长度及容量
System.out.println("sb.length():" + sb.length());
System.out.println("sb.capacity():" + sb.capacity());
//取子串
String string = sb.substring(2, 6);
System.out.println(string);
//改变长度,将保留前n的StringBuilder对象
sb.setLength(4);
System.out.println(sb);
System.out.println(sb.hashCode());
} }

Java容器深入浅出之String、StringBuffer、StringBuilder的更多相关文章

  1. [改善Java代码]正确使用String,StringBuffer,StringBuilder

    CharSequence接口有三个实现类与字符串有关:String,StringBuffer,StringBuffer.虽然它们都与字符串有关,但是其处理机制是不同的. String类是不可改变的量, ...

  2. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  3. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

  4. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  5. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  6. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  7. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  8. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

  9. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

随机推荐

  1. Js中处理数据的常用内置方法

    以下方法均不会修改操作数本身,只是将操作数处理后的数据返回 1.丢弃小数部分,保留整数部分 parseInt(x);//丢弃x中的小数部分,保留x中的整数部分 2.Math对象常用的方法 ceil(x ...

  2. Django模型中的元选项和object对象

    1.元选项,在模型类型中定义一个Meta类,用于设置元信息 class Student(models.Model): name = models.CharField(max_length=20) se ...

  3. mybatsi中文乱码问题

    乱码问题:待总结,这里先贴出网友的博客: http://blog.csdn.net/zht666/article/details/8955952

  4. 20155204 2016-2017-2 《Java程序设计》第4周学习总结

    20155204 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承是类与类之间的联系,接口是方法与类之间的联系,多态就是指利用接口和继承来派生许多类. 有 ...

  5. 20155232 2016-2017-3 《Java程序设计》第3周学习总结

    20155232 2016-2017-3 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 1.对象(Object):存在的具体实体,具有明确的状态和行为. 2.类( ...

  6. 20155339 2016-2017-2 《Java程序设计》第4周学习总结

    20155339 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承.多态与is-a 继承就是避免多个类间重复定义共同行为. 可以把相同的成粗代码提升为父类 ...

  7. SimpleDateFormat,Calendar 线程非安全的问题

    SimpleDateFormat是Java中非常常见的一个类,用来解析和格式化日期字符串.但是SimpleDateFormat在多线程的环境并不是安全的,这个是很容易犯错的部分,接下来讲一下这个问题出 ...

  8. Redash二次开发-开发环境搭建

    环境:win7+pycharm 2018.2 +redash 1.安装pycharm并如何正常使用,找度娘. 2.配置pycharm vcs,设置github用户,从github新建redash项目 ...

  9. 常用常忘的delegate,记一下。

    多线程: 1 new Thread(new ThreadStart(Method1))).Start(); 1 new Thread(new ParameterizedThreadStart(Meth ...

  10. 180729-Quick-Task 动态脚本支持框架之任务动态加载

    Quick-Task 动态脚本支持框架之任务动态加载 前面几篇博文分别介绍了整个项目的基本架构,使用说明,以及整体框架的设计与实现初稿,接下来则进入更细节的实现篇,将整个工程中核心实现捞出来,从为什么 ...