Java string 字符串数据类型

发布于 2024-08-20 19:48:12 字数 8775 浏览 15 评论 0

一个字符串就是一个字符序列,字符串被广泛应用于 Java 编程,Java 语言将字符串作为 String 类型的对象进行处理。

// str1 的值为 null,表示没有指向任何字符串对象
String str1;
// str2 已经指向了一个字符串对象,这个对象的字符序列内容为空
String str2 = "";
// str3 是显式地调用构造函数创建字符串对象,该对象的字符序列内容为空,与第二行代码是基本一样的
String str3 = new String();

String str1 = "abc";
String str2 = str1 + "def";
str1 += "def";

// shustr
String str = "123456";
str.substring(3); // 从下标 3(注意下标从 0 开始) 开始截取一个子字符串
System.out.println(str); // str 本身不可变,所以打印出来依然是 123456
String str2 = str.substring(3); // 将产生的新对象赋值给一个新的引用变量
System.out.println(str2); // str2 的内容为 456

format 方法

String name = "David";
int age = 18;
String hobby = "篮球";
String formatString = "我的名字是%s,我今年%d 岁,我的爱好是%s";
String output = String.format(formatString, name, age, hobby);
// 方法一
System.out.println(output);
// 方法二
System.out.format(formatString, name, age, hobby);

如果 String.format 中有 % 不想呀格式化,应该使用 %% , 这里

String 常用方法的比较

  • boolean equals(Object anObject) : 判断内容是否相同
  • boolean equalsIgnoreCase() : 判断内容是否相同,在比较时忽略字母大小写
  • int compareTo(String anotherString) : 比较两个字符串的字典顺序
  • int compareToIgnoreCase(String anotherString) : 比较两个字符串的字典顺序,在比较时忽略字母大小写
  • == : 比较两个引用,是否指向同一个 String 对象
  • charAt(int index) : 查看字符串中 index 值指定的 char
  • indexOf(int ch) : 返回字符串中第一个出现 char 字符的 index

format 方法的 formatter

字符用以格式化的数据类型
d整数型(10 进制 )
cUnicode 字符
bBoolean 值
sString
f浮点数(10 进制)
e浮点数(科学计数)
x整数(16 进制)

String 查找

方法功能
char charAt(int index)返回指定索引 index 位置上的字符,索引范围从 0 开始
int indexOf(String str)从字符串开始检索 str,并返回第一次出现的位置,未出现返回-1
int indexOf(String str,int fromIndex)从字符串的第 fromIndex 个字符开始检索 str
int lastIndexOf(String str)查找最后一次出现的位置
int lastIndexOf(String str,int fromIndex)从字符串的第 fromIndex 个字符查找最后一次出现的位置
boolean startsWith(String prefix,int toffset)测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean startsWith(String prefix)测试此字符串是否以指定的前缀开始
boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束
boolean contains(String str)测试此字符串是否包含指定的字符串

String 的替换

方法功能
String replace(char oldChar,char newChar)把原来的 oldChar 字符替换为 newChar 字符,返回新串
String replace(CharSequence target,CharSequence replacement)把原来的 target 子序列替换为 replacement 序列,返回新串
String str1 = "abcabcabcxyz";
String str2 = str1.replace("abc", "x");
// xxxxyz

String 的截取

方法功能
String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串
String substring(int beginIndex,int endIndex)返回一个新的字符串,它从下标 beginIndex 开始到 endIndex-1 的子串
String trim()把字符串前后的空格都删除,返回新串

StringBuffer

StringBuffer 表示可变长的和可修改的字符序列.我们可以 StringBuffer 进行插入或者追加字符序列、翻转字符序列等操作

StringBuffer 必须通过构造函数进行初始化,它有三个构造方法

  • StringBuffer() : 默认的构造方法预留 16 个字符的空间
  • StringBuffer(int size) : 第二种形式接收一个整数参数,显示的设置缓冲区的大小
  • StringBuffer(String str) : 第三种形式接收一个 String 参数,设置 StringBuffer 对象的初始内容,同时多预留 16 个字符的空间
方法功能
int length()得到当前 StringBuffer 的长度
int capacity()得到总的分配容量
void ensureCapacity(int capacity)为构造好的 StringBuffer 预分配空间,设置缓冲区的大小,在已知需要追加大量的字符的情况下很有用
void setLength(int len)在 StringBuffer 对象内设置缓冲区的大小
char charAt(int index)从 StringBuffer 对象中得到单个字符
void setCharAt(int index, char ch)将 StringBuffer 的 index 位的字符置为 ch
void getChars(int sourceStart, int sourceEnd, char target[], int targetStart)将 StringBuffer 的子字符串复制给数组
StringBuffer append(Object obj)将其他类型数据的字符串形式拼接到 StringBuffer 对象后面
StringBuffer append(String str)将 String 类型的字符串拼接到 StringBuffer 对象后面
StringBuffer append(StringBuffer sb)将 StringBuffer 类型的字符串拼接到 StringBuffer 对象后面
StringBuffer append(char[] str)将字符数组类型的字符串拼接到 StringBuffer 对象后面
reverse()在 StringBuffer 对象中的字符串反转
StringBuffer sb = new StringBuffer();
sb.append("abc");
sb.append("123");
sb.append("xyz");
sb.reverse();
System.out.println(sb.toString());

sb.setCharAt(2, 'X');  // setCharAt 要用单引号,不能用双引号

String、StringBuilder、StringBuffer 区别

  • String、StringBuilder、StringBuffer 用法比较
    • String、StringBuilder、StringBuffer 都在 java/lang/ 目录下
      • String: 字符串常量
      • StringBuffer: 字符串变量(线程安全)
      • StringBuilder: 字符串变量(非线程安全,JDK 5.0(1.5.0) 后支持)
  • String : 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的.
  • StringBuffer : StringBuffer 每次对对象本身进行操作,而不是生成新的对象,再改变对象引用.所以在一般情况下我们推荐使用 StringBuffer,特别是字符串对象经常改变的情况下.主要操作是 append 和 insert 方法.常用的方法有 append appendFormat insert remove replace
  • StringBuilder : java.lang.StringBuilder 一个可变的字符序列是 5.0 新增的.此类提供一个与 StringBuffer 兼容的 API,但不同步.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快.两者的方法基本相同.
  • StringBuffer 和 StringBuilder 都继承于 AbstractStringBuilder 父类,实现了 java.io.Serializable,CharSequence。在大部分情况下,三者的效率如下: StringBuilde > StringBuffer > String
// StringBuffer 比 String 快,应该是第一句比第二句慢,事实上却是第一句快
String S1 = "This is only a” + " simple" + " test”;  // 这个在 JVM 来说等同于 String S1 = "This is only a simple test";
StringBuffer Sb = new StringBuilder("This is only a").append(" simple”).append(" test");

FAQ

找到字符串中第二个字符出现的位置

int secondIndex = a.indexOf('{', a.indexOf('{')+1);

equal 与==的区别

两个字符串变量指向的字符序列内容完全一样, equals() ​ 返回 true,如果两个字符串变量指向同一个对象,==返回 true

判断字符串是否为空

// 原始的方法
null == s || "".equals(s)

// 直接调用的方法
import org.apache.commons.lang.StringUtils;
StringUtils.isEmpty(pkId)

字符串实现 pad 功能

org.apache.commons.lang.StringUtils.leftPad

//String.format 方法
// 如果替换前的是字符串类型
String.format("%10s", "foo").replace(' ', '*'); // *******foo
String.format("%-10s", "bar").replace(' ', '*'); // bar*******
// 如果替换前的是数字类型
int i = 10
String.format("%010d", i);

// 最通用的方式 StringUtils.leftPad StringUtils.rightPad
import org.apache.commons.lang.StringUtils;
StringUtils.leftPad(String str, int size);
// StringUtils.leftPad("bat", 5)  = "  bat"
// StringUtils.leftPad("bat", 1)  = "bat"
StringUtils.leftPad(String str, int size, char padChar)
// StringUtils.leftPad("bat", 5, 'z')  = "zzbat"
// StringUtils.leftPad("bat", 1, 'z')  = "bat"

隐藏字符串关键信息如密码等

隐藏敏感信息如密码等

// 与 字符串实现 sql 的 pad 功能 的实现方式类似
String password = "secret123";
String padded = String.format("%" + password.length() + "s", "").replace(' ', '*');

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

上一篇:

下一篇:

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

聊慰

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

忆伤

文章 0 评论 0

眼泪也成诗

文章 0 评论 0

zangqw

文章 0 评论 0

旧伤慢歌

文章 0 评论 0

qq_GlP2oV

文章 0 评论 0

旧时模样

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文