Java - API与字符串¶
Java.lang 包是自动导入的,不需要我们手动导入 System.in是在InputStream当中的.
String 类 Java.lang包当中. 所有字面量字符串都是这个类型,如"abc"
创建后不能修改. +拼接的字符串是一个全新的String.
主要还是使用直接赋值.
但是:
- 直接赋值的方式:
实际上JVM当中有块区域叫做StringTable(串池).它JDK7以前在方法区当中,后来在堆内存当中
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在:创建新的
存在:复用
- new方式:
则像一般的对象一样,在堆里开辟空间.
如果这样写,那么这几个字符串并不是指向同一块空间,而是指向不同的堆内存.因为:
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 类 是存储字符串的容器,内容是可变的.

打印对象的特例:

我们注意到append方法是返回自身的,因此是可以链式调用的.也就是对返回值直接调用别的函数.
StringBuilder 主要用于字符串的拼接和翻转.
如果我们是主要用来需要修改内容,那么我们需要转成字符数组.
StringJoiner 类 更加快捷的容器
JDK8出现
注意,add()方法添加了之后,会根据构造方法当中的间隔符号隔开.
字符串的原理
也就是说,在s2 = s1+"b"这句,实际上是执行了:
注意,StringBuild的toString是在堆上创建对象的.
也就是说,上面这个代码,s1指向串池中的字符串,s2和s3都是指向堆中内存的.
JDK8以后:会预估生成的大小,创建一个StringBuilder,然后进行拼接.
我们再回想以前,会发现String的拼接如果有变量参与,实际上也是借助StringBuilder进行的.
也就是说,在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开头.
按照字典序进行比较
返回值:s1和s2第一个不同的字母当中,s1中的字母的acill码 - s2中的字母的acill码