wordpress安装后查看站点失败,照明设计师培训,一个空间怎么做两个网站 跳转,wordpress如何将分类调用到菜单String Java String 类概览
String 类是 Java 中最常用的类之一#xff0c;用于处理字符串。以下是 String 类的主要特性和操作#xff1a;
特性/操作描述不可变性String 对象一旦创建就不能被修改创建方式使用双引号 “” 或 String 构造函数字符串池Java 维护字符串常量池…String Java String 类概览
String 类是 Java 中最常用的类之一用于处理字符串。以下是 String 类的主要特性和操作
特性/操作描述不可变性String 对象一旦创建就不能被修改创建方式使用双引号 “” 或 String 构造函数字符串池Java 维护字符串常量池以优化内存使用比较操作equals() 比较内容compareTo() 比较顺序连接操作使用 运算符或 concat() 方法
String的常用Method
方法描述示例length()返回字符串的长度Hello.length()返回 5charAt(int index)返回指定索引处的字符Java.charAt(0)返回 ‘J’substring(int beginIndex, int endIndex)返回一个新的字符串它是此字符串的一个子字符串Hello.substring(0, 3)返回 “Hel”equals(Object anObject)将此字符串与指定的对象比较Hello.equals(Hello)返回 truetoLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写HELLO.toLowerCase()返回 “hello”toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写hello.toUpperCase()返回 “HELLO”trim()返回字符串的副本忽略前导空白和尾部空白 hello .trim()返回 “hello”replace(char oldChar, char newChar)返回一个新的字符串它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的hello.replace(l, w)返回 “hewwo”contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时返回 trueHello.contains(He)返回 truesplit(String regex)根据给定正则表达式的匹配拆分此字符串a,b,c.split(,)返回 [“a”, “b”, “c”]
下面的流程图展示了 String 对象的生命周期和常见操作 #mermaid-svg-OCTkY5QAAXWdIuYE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .error-icon{fill:#552222;}#mermaid-svg-OCTkY5QAAXWdIuYE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OCTkY5QAAXWdIuYE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-OCTkY5QAAXWdIuYE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OCTkY5QAAXWdIuYE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OCTkY5QAAXWdIuYE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OCTkY5QAAXWdIuYE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OCTkY5QAAXWdIuYE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OCTkY5QAAXWdIuYE .marker.cross{stroke:#333333;}#mermaid-svg-OCTkY5QAAXWdIuYE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OCTkY5QAAXWdIuYE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .cluster-label text{fill:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .cluster-label span{color:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .label text,#mermaid-svg-OCTkY5QAAXWdIuYE span{fill:#333;color:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .node rect,#mermaid-svg-OCTkY5QAAXWdIuYE .node circle,#mermaid-svg-OCTkY5QAAXWdIuYE .node ellipse,#mermaid-svg-OCTkY5QAAXWdIuYE .node polygon,#mermaid-svg-OCTkY5QAAXWdIuYE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OCTkY5QAAXWdIuYE .node .label{text-align:center;}#mermaid-svg-OCTkY5QAAXWdIuYE .node.clickable{cursor:pointer;}#mermaid-svg-OCTkY5QAAXWdIuYE .arrowheadPath{fill:#333333;}#mermaid-svg-OCTkY5QAAXWdIuYE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OCTkY5QAAXWdIuYE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OCTkY5QAAXWdIuYE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-OCTkY5QAAXWdIuYE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-OCTkY5QAAXWdIuYE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OCTkY5QAAXWdIuYE .cluster text{fill:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE .cluster span{color:#333;}#mermaid-svg-OCTkY5QAAXWdIuYE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OCTkY5QAAXWdIuYE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 否 是 否 是 否 创建 String 对象 是否使用字面量? 检查字符串池 在堆中创建新对象 池中是否存在? 返回池中的引用 在池中创建并返回引用 执行字符串操作 是否修改字符串? 创建新的 String 对象 返回原始引用 垃圾回收旧对象 继续使用 这个流程图说明了 String 对象从创建到使用的过程包括字符串池的检查、字符串操作和不可变性原则。理解这个过程有助于更高效地使用 String 类。
Stirng的继承关系
在 Java 中String类最终继承自java.lang.Object类并且它实现了java.io.Serializable、java.lang.ComparableString和java.lang.CharSequence接口。以下是用 Mermaid 语法展示的更详细的关系图
说明如下
Object类
所有 Java 对象的根类String继承了Object的一些通用方法如toString()、equals()和hashCode()等。
Serializable接口
标记接口表示一个类的对象可以被序列化和反序列化。String类的对象可以被写入到输出流并从输入流中读取从而实现序列化和反序列化操作。
ComparableString接口
定义了一个类型参数为String的泛型接口用于定义对象之间的自然顺序。String类实现了这个接口意味着可以比较两个字符串的字典顺序。通过compareTo方法可以比较两个字符串的大小关系。
CharSequence接口
表示一个字符序列。String类实现了这个接口提供了一些方法来访问字符串中的字符如length()返回字符串的长度charAt(int index)返回指定索引处的字符subSequence(int start, int end)返回一个子序列。
缺点
由于String的不可变性在进行大量字符串操作时可能会创建很多中间对象这可能会影响性能。为了避免这种情况可以使用StringBuilder或StringBuffer类它们是可变的字符串类适用于频繁修改字符串的场景。
字符串的特性
字符串的连接
字符串连接 String c a b 进行字符串连接操作。在 Java 中使用 运算符连接两个字符串时实际上会创建一个新的 String 对象。这个过程中Java 会先创建一个 StringBuilder或 StringBuffer在单线程环境下通常是 StringBuilder对象然后调用 append 方法将 a 和 b 的内容添加到 StringBuilder 中最后调用 toString 方法将 StringBuilder 转换为 String 对象并将其赋值给 c。
String a abc;
String b MASU;
String c a b;
System.out.println(c); // 输出 abcMASU注意事项
频繁进行字符串连接操作可能会在性能上产生一些开销特别是在循环中进行大量的字符串连接时。因为每次连接都会创建新的 StringBuilder 和 String 对象。在这种情况下可以考虑使用 StringBuilder 或 StringBuffer 显式地进行字符串连接操作以提高性能。
StringBuilder builder new StringBuilder();
builder.append(abc);
builder.append(MASU);
String c builder.toString();StringBuffer
基本介绍
StringBuffer是 Java 中用于处理可变字符串的类。与String类不同String对象是不可变的.StringBuffer允许对字符串进行修改例如添加、插入、删除字符等操作且不会产生新的对象除非重新赋值。这在需要频繁修改字符串内容的场景中非常有用能够避免创建大量中间字符串对象从而提高性能。
StringBuffer 的继承结构图 常用方法 追加append方法 append方法用于在StringBuffer对象的末尾添加各种类型的数据如字符、字符串、数字等。例如 StringBuffer sb new StringBuffer(Hello);sb.append( World);System.out.println(sb.toString());//输出Hello World它有多个重载版本可以接受char、int、long、float、double、boolean、char[]、String等多种类型的参数。插入insert方法 用于在StringBuffer对象的指定位置插入各种类型的数据。例如 StringBuffer sb new StringBuffer(Hello);sb.insert(2, inserted);System.out.println(sb.toString());//输出Heinsertedllo它的第一个参数是插入的位置索引从 0 开始第二个参数是要插入的内容同样有多个重载版本可插入不同类型的数据。 删除delete方法 可以删除StringBuffer对象中指定位置的字符。例如 StringBuffer sb new StringBuffer(Hello);sb.delete(1, 3);System.out.println(sb.toString());//输出Hlo其参数delete(start, end)表示删除从start包含到end不包含位置的字符。 替换replace方法 用于替换StringBuffer对象中指定位置的字符。例如 StringBuffer sb new StringBuffer(Hello);sb.replace(1, 3, replaced);System.out.println(sb.toString());//输出Hreplacedlo它的参数replace(start, end, str)表示将从start包含到end不包含位置的字符替换为str。反转reverse方法 可以将StringBuffer对象中的字符序列反转。例如 StringBuffer sb new StringBuffer(Hello);sb.reverse();System.out.println(sb.toString());//输出olleH与 StringBuilder 的比较 StringBuilder和StringBuffer功能相似都用于可变字符串的操作。主要区别在于StringBuffer是线程安全的其内部方法大多是synchronized同步的这使得它在多线程环境下能够正确运行但性能上会有一定损耗。而StringBuilder不是线程安全的在单线程环境下性能更好通常在不需要考虑线程安全的情况下推荐使用StringBuilder。 容量管理 StringBuffer对象有一个容量capacity的概念它表示StringBuffer内部用于存储字符序列的缓冲区大小。当向StringBuffer中添加字符导致字符序列长度超过当前容量时StringBuffer会自动扩容。扩容的策略一般是新容量 旧容量 * 2 2。例如初始容量为 16当字符序列长度超过 16 时新容量可能会变为16*2 234。可以通过capacity方法查看当前容量如System.out.println(sb.capacity());。
StringBuffer常用方法
方法名介绍示例append(Object obj)将指定对象的字符串表示形式追加到当前StringBuffer对象的末尾。可以接收多种数据类型如String、char、int、double等StringBuffer sb new StringBuffer(abc); sb.append(def); // sb的值变为abcdefinsert(int offset, Object obj)在当前StringBuffer对象的指定位置offset插入指定对象的字符串表示形式。offset表示索引位置从 0 开始计数StringBuffer sb new StringBuffer(abc); sb.insert(1, x); // sb的值变为axbcdelete(int start, int end)删除当前StringBuffer对象中从start包括到end不包括之间的字符StringBuffer sb new StringBuffer(abcde); sb.delete(1, 3); // sb的值变为adereplace(int start, int end, String str)将当前StringBuffer对象中从start包括到end不包括之间的字符替换为指定的字符串strStringBuffer sb new StringBuffer(abcde); sb.replace(1, 3, xx); // sb的值变为axxdereverse()反转当前StringBuffer对象中的字符序列StringBuffer sb new StringBuffer(abc); sb.reverse(); // sb的值变为cbasubstring(int start)返回一个新的String它包含当前StringBuffer对象从start位置到末尾的字符序列StringBuffer sb new StringBuffer(abcde); String sub sb.substring(2); // sub的值为cdesubstring(int start, int end)返回一个新的String它包含当前StringBuffer对象从start包括到end不包括之间的字符序列StringBuffer sb new StringBuffer(abcde); String sub sb.substring(1, 3); // sub的值为bccapacity()返回当前StringBuffer对象的容量。容量是指用于存储字符序列的内部缓冲区大小一般初始容量为 16当内容超过容量时会自动扩容StringBuffer sb new StringBuffer(abc); System.out.println(sb.capacity()); // 可能输出16length()返回当前StringBuffer对象中字符序列的长度StringBuffer sb new StringBuffer(abc); System.out.println(sb.length()); // 输出3setCharAt(int index, char ch)将当前StringBuffer对象中指定索引index位置的字符设置为chStringBuffer sb new StringBuffer(abc); sb.setCharAt(1, x); // sb的值变为axc
StringBuilder
StringBuffer 的继承结构图 StringBuffer和StringBuilder的比较用表格
比较项目StringBufferStringBuilder可变性可变允许通过多种方法如 append、insert、delete 等对字符串内容进行修改修改操作在原对象上进行不会产生新的对象除非重新赋值可变提供与 StringBuffer 类似的修改方法如 append、insert、delete 等也是在原对象基础上进行修改线程安全性线程安全。其内部大部分方法都使用了synchronized关键字修饰这使得在多线程环境下多个线程访问同一个 StringBuffer 对象时可以正确地同步保证数据的一致性和正确性但这也导致了一定的性能损耗非线程安全。在单线程环境下由于不需要进行同步操作其性能比 StringBuffer 更好。在多线程环境下如果没有正确的外部同步机制可能会导致数据不一致的问题性能单线程由于同步机制的存在在单线程频繁操作字符串的场景下性能稍逊一筹在单线程环境下特别是频繁进行字符串操作如大量的 append 操作时性能优于 StringBuffer因为它不需要额外的同步开销性能多线程可以安全地在多线程环境下使用虽然同步机制会带来性能损失但保证了数据的准确性在多线程环境下如果没有外部的同步措施可能会出现数据错误不过如果正确地进行外部同步如使用锁在性能优化较好的情况下可能会接近或优于 StringBuffer 的性能但代码复杂度会增加适用场景适用于多线程环境下对字符串进行修改的场景例如在多个线程可能同时访问和修改同一个字符串对象的服务器端程序、共享资源处理等情况适用于单线程环境下对字符串进行高效操作的场景如在一个简单的本地工具程序、临时字符串处理等情况下进行大量的字符串构建或修改操作初始容量可以通过构造函数指定初始容量默认容量为 16。如果预估字符串长度变化较大可以指定合适的初始容量以减少扩容操作与 StringBuffer 类似可以通过构造函数指定初始容量默认容量为 16也能在一定程度上通过合理设置初始容量优化性能扩容策略当内容长度超过容量时会自动扩容一般扩容策略是新容量 旧容量 * 2 2扩容策略与 StringBuffer 相同当内容长度超过容量时会自动扩容新容量 旧容量 * 2 2