Skip to content

Java - API与字符串

Java.lang 包是自动导入的,不需要我们手动导入 System.in是在InputStream当中的.


String 类 Java.lang包当中. 所有字面量字符串都是这个类型,如"abc"

创建后不能修改. +拼接的字符串是一个全新的String.

367f53ee61951fd774d7a6d6ed8f1a49_MD5 主要还是使用直接赋值.

但是: - 直接赋值的方式: 实际上JVM当中有块区域叫做StringTable(串池).它JDK7以前在方法区当中,后来在堆内存当中 当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。 不存在:创建新的 存在:复用 - new方式: 则像一般的对象一样,在堆里开辟空间. 6d7de270b2e2c5dcc10c66aaf0ea4417_MD5 如果这样写,那么这几个字符串并不是指向同一块空间,而是指向不同的堆内存.因为: new关键字只会拷贝复制,不会复用空间.

注意,我们通过Scanner sc = new Scanner(System.in); String str1 = sc.next(); 这样得到的str1,实际上是new出来的.


== 号:基本数据类型比较的是具体数据值.引用数据类型比较的是地址值. equals:比较内容. equalsIgnoreCase:忽略大小写的比较


String实际上也可以类似数组一样通过索引得到字符,但是不是通过[] charAt(int index)根据索引返回字符. length()返回字符串长度. 注意,数组的长度是通过.length这个属性返回的.而String是通过length()方法. 另外,length返回的并不是字节数而是字符数.

String substring(int beginIndex,int endIndex)截取字符串 包括begin 不包括end.如果不写endIndex,那么就截取到末尾.

String replace(旧值,新值) 注意这样不会修改旧值:

String s = "Hello world";
String ans = s.replace("o","e")//则s为Helle,werld 
如果s当中没有o,那么就返回原来的值.


StringBuilder 类 是存储字符串的容器,内容是可变的. 4592a3bac726ad6a364cf60ef9164ddf_MD5 bcd95301367ae3da0a0dc7400772992a_MD5

打印对象的特例: a7ae8c5dd54e7e565f23157f293ae9f6_MD5

我们注意到append方法是返回自身的,因此是可以链式调用的.也就是对返回值直接调用别的函数. StringBuilder 主要用于字符串的拼接和翻转. 如果我们是主要用来需要修改内容,那么我们需要转成字符数组.


StringJoiner 类 更加快捷的容器 JDK8出现 3e76a789c4f4f55c50150ddeb83477c0_MD5 fbd4c4322416285a29a560630ac0a6a3_MD5 注意,add()方法添加了之后,会根据构造方法当中的间隔符号隔开.


字符串的原理 5c4133d3050639de7ae3d1b0795462ea_MD5 839e0071534e5a7c78c317522e50c0ab_MD5 也就是说,在s2 = s1+"b"这句,实际上是执行了: 0abb2a4c8a1490edc66e3e3d8d9f5c2f_MD5 注意,StringBuild的toString是在堆上创建对象的. 也就是说,上面这个代码,s1指向串池中的字符串,s2和s3都是指向堆中内存的. JDK8以后:会预估生成的大小,创建一个StringBuilder,然后进行拼接.

我们再回想以前,会发现String的拼接如果有变量参与,实际上也是借助StringBuilder进行的.

4ba48802ca30b5389975bd3863b990a4_MD5 也就是说,在s4的时候,会预估创建有三个字符大小的StringBuilder,然后append,然后toString赋值给s4.


StringBuilder的底层实际上类似于C++String,是有一个字节数组组成的.一开始的默认Capacity为16字符.(当然length是0); 如果Capacity不够,那么就会扩容.扩容规则: - 如果一次性添加的长度不超过Capacity2 + 2,那么就会扩容到Capacity2 + 2。 - 如果超过了,那么实际多长,Capacity就会变成多长. 我们可以通过Capacity()函数访问Capacity. Capacity最大为Integer.MAX_VALUE字符.


char[] arr = str.toCharArray();可以转化成字符数组,方便操作.

boolean startsWith(String s) :判断某个字符串是否是以s开头.

按照字典序进行比较 88d379354c8a6bbb7ef07719e5b2ae76_MD5 返回值:s1和s2第一个不同的字母当中,s1中的字母的acill码 - s2中的字母的acill码