首页 > 编程语言 >java中String类型的相关知识的简单总结

java中String类型的相关知识的简单总结

时间:2023-01-07 18:44:48浏览次数:64  
标签:总结 aaa String int value char 字符串 java

java中String类型的相关知识总结

一、常用方法:

1.构造方法:

  • byte数组

    • 可指定offset和length

    • 可指定charset

  • char数组

    • 可指定offset和count
  • 字符序列

    • String
    • StringBuffer
    • StrngBuilder

2. 实例方法:

  • 获取字符/码点/字节

charAt(int index) char

codePointAt(int index) int

getBytes() byte[]

getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) void

toCharArray() char[]

  • 长度

length() int

codePointCount(int beginIndex,int endIndex) int

  • 字符串操作

concat(String str) String

substring(int beginIndex,int endIndex) String

split(String regex) String[]

trim() String

toUpperCase()/toLowerCase String

replace(char oldChar,char newChar) String

replace(CharSequence target,CharSquence replacement) String

replaceAll(String regex,String replacement) String

replaceFirst(String regex,String replacement) String

  • 判断

contains(CharSequence s) boolean

endsWith(String suffix)/startsWith(String prefix) boolean

equals(Object anObject) boolean

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

matches(String regex) boolean

  • 序号

indexOf(int ch/String str)/lastIndexOf()

3. 静态方法:

String.format(String format,Obect... args) String

String.valueOf(xxx) String

二、底层实现:

jdk1.8中String类型底层就是一个char数组:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}

三、不可变性:

String最为人所津津乐道的便是它的不可变性(immutable),这里就引出两个问题,String如何做到不可变的,以及不可变的好处

1. 如何实现不可变:

jdk1.8中String的字符存储在一个char数组里

  • char数组final,不可变
  • 没有提供任何可以修改数组内容的方法

2. 不可变的好处:

  1. 不可变,线程绝对安全
  2. 作为参数不可变,更安全
  3. 字符串常量池的需要,可以共享而不用担心被谁改变
  4. hash值不可变,只要算一次,可以缓存hash

3. String和StringBuffer和StringBuilder的区别:

  • String不可变,线程安全

  • StringBuffer可变,线程安全

  • StringBuilder可变,线程不安全

四、缓存池:

1.字符串常量池(String pool)里存放着所有的字符串字面量

String a="aaa";
String b="aaa";
//a,b引用到的String pool里的同一个对象
a==b//true

2. new 出来的String对象放在堆区

String a=new String("aaa");
String b=new String("aaa");
a==b//false
a=="aaa"//false
//这里实际是先创建字面量"aaa",再去创建对象的

new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!

  • 关于String str=new String("123")创建了几个对象的问题

    ​ 很显然,new只调用了一次,也就是说只创建了一个对象。而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念,该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象(堆上)。

  • public String(String original) {
    	this.value = original.value;
    	this.hash = original.hash;
    }
    

3. intern()方法

先判断字符串常量池里是否已经有了这个字符串,如果有就返回常量池中该字符串的引用,没有就在常量池中添加并返回常量池中的引用

String a=new String("aaa");
a=="aaa"//false
a=a.intern()
a=="aaa"//true

五、参考资料

  1. 深入理解Java中的String - 平凡希 - 博客园 (cnblogs.com)
  2. 《java核心技术卷Ⅰ》
  3. Java 基础 - 知识点 | Java 全栈知识体系 (pdai.tech)

鄙人只是一名在读的软件工程专业的本科生,正在复习找工作,故而将复习时遇到的一些有意思的东西总结出来,既是加深理解,也是便于日后复习。

鄙人才疏学浅,若文中有谬误之处,还望诸位不吝斧正,以免误人子弟。若有同道中人想一同讨论学习,也可以联系我=>[email protected]。未经作者允许,请勿转载!

路漫漫其修远兮,吾将上下而求索。

标签:总结,aaa,String,int,value,char,字符串,java
From: https://www.cnblogs.com/legolas-PRC/p/17033246.html

相关文章

  • Qt浅谈之一:内存泄露(总结)(转)
    一、简介Qt内存管理机制:Qt在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系......
  • 卷积神经网络压缩方法总结
    卷积神经网络的压缩方法一,低秩近似二,剪枝与稀疏约束三,参数量化四,二值化网络五,知识蒸馏六,浅层网络我们知道,在一定程度上,网络越深,参数越多,模型越复杂,其最终效果越好......
  • k8s教程(pod篇)-总结
    文章目录​​01引言​​​​02总结​​​​2.1定义与基本用法​​​​2.2容器共享volume​​​​2.3配置管理​​​​2.4容器获取pod信息(DownwardAPI)​​​​......
  • 尤大大(尤雨溪)的年度总结、预期
    一、前言刚刚在浏览Vue官网的时候,看看博客,发现​​尤大大​​​写了年度总结和展望预期,感觉挺好的,这也预示着​​Vue​​新的一年的发展方向!看一下,顺便边缘OB一下哈!!下面我们......
  • Java的特性和优势
    Java的特性和优势简单性面向对象(以人的思维)可移植性(writeonce,runanywhere)高性能分布式动态性多线程安全性健壮性......
  • Java的三大版本
    Java的三大版本JavaSE:标准版(桌面程序,控制台开发)JavaME:嵌入式开发(手机,小家电)JavaEE:E企业级开发(web端,服务器开发)......
  • JavaScript-DOM
    DOM文档对象模型(DocumentObjectModel)提供系列的属性与方法,让我们在JS中操作页面元素。DOM由W3C定义,“一个与系统平台和变成语言无关的接口,程序和脚本可以通过这个接口动......
  • 【Java】原子类
    【Java】原子类前言保证线程安全是Java并发编程必须要解决的重要问题。Java从​​原子性​​​、​​可见性​​​、​​有序性​​这三大特性入手,确保多线程的数据一致......
  • javaScript-DOM-获取元素,事件基础,操作元素
    javaScript-DOM目录javaScript-DOM1.DOM简介1.1什么是DOM1.2DOM树2.获取元素2.1如何获取页面元素2.2根据ID获取2.3根据标签名获取2.4通过HTML5新增的方法......
  • Apache Pulsar——Java API操作tenant、namespace、topic
    一、添加pom.xml依赖<dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client</artifactId> <version>2.10.0</version></dependency>二、ten......