对字符串的花式处理一直是现代应用系统的主要操作之一,也是对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. Linux入门第五天——shell脚本入门(中)基础语法之判断与条件

    一.判断式 利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test  test:test 示例:结合回传值 $? 进行判断:关于$?:$? [root@localhost tm ...

  2. maven拓展——使用tomcat插件运行maven项目

    首先,在pom.xml中配置插件: <build> <plugins> <plugin> <groupId>org.apache.tomcat.mave ...

  3. 加分项——C语言实现Linux的pwd命令

    加分项--C语言实现Linux的pwd命令 实现要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd pwd pw ...

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

    20155322 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 第10周学习的主要内容Java和Android开发学习指南(第二版)(EPUBIT,Jav ...

  5. linux Ubuntu Kali 安装flash

    http://jingyan.baidu.com/article/fa4125accdeeec28ad709252.html

  6. PostgreSQL的 synchronous_standby_names 参数学习

    磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页[作者 高健@博客园  luckyjackgao@gm ...

  7. 【BZOJ3110】【LG3332】[ZJOI2013]K大数查询

    [BZOJ3110][LG3332][ZJOI2013]K大数查询 题面 洛谷 BZOJ 题解 和普通的整体分治差不多 用线段树维护一下每个查询区间内大于每次二分的值\(mid\)的值即可 然后再按套 ...

  8. L012-linux系统文件属性知识深入详解小结

    L012-linux系统文件属性知识深入详解小结 最近的学习重点不在这上面,所以更新的比较慢,再加上母亲住院,感情问题,一系列吧,愿快点度过这黑色的4月份,希望我能在5月份阳光起来,加油! 回归正题 ...

  9. Python 爬虫之模拟登录

    最近应朋友要求,帮忙爬取了小红书创作平台的数据,感觉整个过程很有意思,因此记录一下.在这之前自己没怎么爬过需要账户登录的网站数据,所以刚开始去看小红书的登录认证时一头雾水,等到一步步走下来,最终成功, ...

  10. python2 - 列表

    列表 a = [1,2,3,4,5,6,7] a[0:4:1]//正向索引 a[-1:-2:-1]//反向索引 列表添加 a = [1, 2] b = [3, 4] +:a + b//把a和b连接,重 ...