API&字符串
API
API(Application Programming Interface):应用程序编程接口
简单理解:API就是别人已经写好了的东西,我们不需要自己编写,直接使用即可。
public static void mian (String[] args){ Random r = new Random(); int number = r.nextInt(100); }
java API:指的就是JDK中提供的各种功能的java类
这些类将低层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具
如何使用帮助文档
-
打开API帮助文档
-
点击显示,并找到索引下面的输入
-
在输入框中输入类名并点击显示
-
查看类所在的包
-
查看类的描述
-
查看构造方法
-
查看成员方法
字符串
字符串在开发中的应用场所
String概述:
java.lang.String 类代表字符串,java程序中的所有字符串文字(例如"abc")都是此类的对象
String name = "张三"; String schoolName = "程序猿";
String的注意点
字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String name = "张三"; String schoolName = "程序猿"; System.out.println(name+schoolName);//字符串拼接产生一个新的字符串
创建String对象的两种方式
-
直接赋值
String name = "张三";
-
new
空参构造:可以获取一个空白的字符串对象
String s2 = new String(); System.out.println("@"+s2+"!");//""
传递一个字符串,根据传递的字符串内容在创建一个新的字符串对象、
String s3 = new String("abc"); System.out.println(s3);
传递一个字符数组,根据字符数组的内容在创建一个新的字符串对象
需求:我们要修改字符串的内容
char[] chs ={"a","b","c","d"}; String s4 = new String(chs); System.out.println(s4);//abcd
传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象 应用场景:以后在网路当中传输的数据其实都是字节信息
需求:我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了
byte[] bytes = {97,98,99,100}; String s5 = new String(bytes); System.out.println(s5);//abcd
java的内存模型
直接赋值的String
注意:StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存
public class StringDemo{ public static void main(String[] args){ String s1 = "abc"; String s2 = "abc"; } }
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
不存在:创建新的
存在:复用
new出来的String
public class Test{ public static void main(String[] args){ char[] chs ={'a','b','c'}; String s1 = new String(chs); String s2 = new String(chs); } }
每new出来的String都会在堆内存中开辟一个新的空间,不会复用,比较浪费内存空间
java的常用方法(比较)
String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2);//true
String s1 = "aaa"; String s2 = "bbb"; System.out.println(s1 == s2);//false
String s1 = new String('abc'); String s2 = "abc"; System.out.println(s1 == s2);//false
== 号比较的到底是什么?
-
基本数据类型
int a = 10; int b = 20; System.out.println(a == b);//false
基本数据类型比较的是数据值
-
引用数据类型
String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1 == s2);//false
引用数据类型比较的是地址值
字符串比较
-
boolean equals方法(要比较的字符串) 完全一样结果才是true,否则为false
-
boolean equalslgnoreCase(要比较的字符串) 忽略大小写的比较
Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串"); String str1 = sc.next();//abc String str2 ="abc"; System.out.println(ster1 = ster2);//false
结论:以后只要想比较字符串的内容,就必须要用String里面的方法
遍历字符串(案例)
-
public char charAt(int index): 根据索引返回字符
-
public int length(): 返回此字符串的长度
-
数组的长度:数组名.length
-
字符串的长度:.字符串对象.length()
手机号屏蔽
-
String substring(int beginIndex , int endIndex) 截取
注意点:包头不包尾,包左不包右
只有返回值才是截取的小串
-
String substring(int beginIndex) 截取到末尾
敏感词替换
-
String replace(旧值,新值)替换
注意点:只有返回值才是替换之后的结果
StringBuilder
StringBuilder概述
StringBuilder可以看成一个容器,创建之后里面的内容是可变的
-
作用:提高字符串的操作效率
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
StringBuilder sb = new StringBuilder("abc");
StringBuilder常用方法
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
StringJoiner
StringJoiner概述
-
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的
-
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场很少有人用
-
JDK8出现的
StringJoiner构造方法
方法名 | 说明 |
---|---|
public StringJoiner(间隔符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号,结束符号 |
StringJoiner sj = new StringJoiner("---"); StringJoiner sj = new StringJoiner(", ","[","]");
StringJoiner的成员方法
方法名 | 说明 |
---|---|
public StringJoiner add(添加的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串就是拼接之后的结果) |
字符串原理
-
扩展底层原理1:字符串储存的内存原理
-
直接赋值会复用字符串常量池中的
-
new出来不会复用,而是开辟一个新的空间
-
-
扩展底层原理2:==号比较的到底是什么?
-
基本数据类型比较数据值
-
引用数据类型比较地址值
-
-
扩展底层原理3:字符串拼接的底层原理
-
扩展底层原理4:StringBuilder提高效率原理图
-
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存
-
-
扩展底层原理5:StringBuilder源码分析
默认创建一个长度为16的字节数组
添加的内容长度小于16,直接存
添加的内容大于16会扩容(原来的容量*2+2)
如果扩容之后还不够,以实际长度为准