String字符串
String是一个类,属于引用类型。
Java程序中一切使用""引起来的内容,都是这个类的实例,称为字符串对象。
字符串定义后是一个常量,值不可更改。字符串实际上是一个字符数组。
频繁更改String类型变量的值,不要使用String对象操作字符串,效率很低又浪费内存空间。
如果要频繁更改字符串中的值,建议使用StringBuilder类或StringBuffer类。
如何创建一个字符串对象
1.使用""赋值创建
String str = "hello";
2.通过构造方法创建
常用构造方法 | 说明 |
---|---|
String() | 创建一个空字符串对象,实际创建一个空字符串数组 |
String(String str) | 创建一个指定的字符串对象,实际是创建以后形参字符串的副本 |
String(char[] list) | 创建一个指定字符数组的字符串对象 |
String(byte[] list) | 按默认编码创建一个指定字节数组的字符串对象 |
String(byte[] list,String charsetName) | 按指定的编码格式创建一个指定字节数组的字符串对象 |
总结
-
在使用字符串时,如果要比较其值是否相同时,不要使用==,因为==判断的是内存地址,要使用String重写的equals方法判断。
-
String中的equals方法判断原理:将两个字符串保存到字节数组中,再岁每个字符逐一比较,全部一致则返回。
-
在使用equals方法时,要将已知的非空字符串作为调用者。
字符串常用方法
可变字符串
String字符串对象是一个常量,在定义后其值不可改变。
如果使用String类的对象,对其频繁更新时,就会不停的创建新的对象,重新引用。
StringBuilder类
用于表示字符串的一个类,是非线程安全的,建议在单线程环境下使用,效率略高于StringBuffer。
StringBuffer类
是线程安全的,建议在多线程环境下使用。
StringBuilder和StringBuffer中的 方法作用一致,只不过StringBuffer中的方法使用了synchronized关键字修饰,表示一个同步方法,在多线程环境下不会出现问题。
构造方法
常用构造方法 | 作用 |
---|---|
StringBuilder() | 创建一个大小为16的字符数组。类似于String str=""; |
StringBuilder(int capacity) | 创建一个指定大小的字节数组 |
StringBuilder(String str) | 创建一个str长度的字符串数组后,将str添加到其中。类似于String str="初始值"; |
普通方法
方法 | 作用 |
---|---|
append(Object obj) | 将指定内容添加到原可变字符串对象末尾 |
delete(int start,int end) | 删除[start,end)范围内的字符 |
deleteCharAt(int index) | 删除指定索引的字符 |
insert(int index,Object obj) | 将obj添加到index位置上 |
replace(int start,int index) | 将[start,end)范围内的字符替换为str |
reverse() | 翻转原字符串 |
注意
-
以上方法都是直接操作原字符串,每个方法调用后,原字符串都会变化。
-
StringBuilder和StringBuffer中并没有重写equals方法,所以要比较两个可变字符串对象的值是否相同时,需要将可变字符串对象转换为String对象后,调用equals方法比较。
可变字符串与不可变字符串之间的转换
有些方法如getBytes()、contains()等,只能通过String调用,这时就需要进行转换。
不可变字符串转换为可变字符串
通过创建一个可变字符串对象,将不可变字符串作为参数实现转换
String str = "hello"; StringBuilder sb = new StringBuilder(str);
可变字符串转换为不可变字符串
通过调用可变字符串的toString()方法实现转换
StringBuilder sb = new StringBuilder("hello"); String str = sb.toString();
可变字符串面试题
比较String、StringBuilder、StringBuffer这三个类的区别
相同点
-
都可以用于表示或操作一个字符串
-
有公共的方法,如indexOf()、charAt()等
-
都是被final修饰的 类,不能被继承
不同点
-
String定义的字符串是一个常量,不可变;StringBuffer和StringBuilder定义的字符串是一个变量,可以改变。
-
String类中的方法调用后,会创建字符串副本,不会影响原字符串;可变字符串对象调用的方法,直接操作原字符串,会影响。
-
StringBuilder是非线程安全的,StringBuffer是线程安全的,其中的方法使用synchronized修饰为同步方法。在多线程环境下,需要使用StringBuffer。StringBuilder效率略高于StringBuffer。
System类
这个类包含了一些系统相关的信息和操作数组的方法。其中的方法和属性都是静态的。
常用属性和方法 | 作用 |
---|---|
System.in | 获取系统输入流对象,通常用于获取输入信息 |
System.out | 打印输出流对象,打印普通信息 |
System.err | 打印输出流对象,通常用于打印异常信息 |
System.exit(int statues) | 终止虚拟机运行,0表示正常结束 |
System.getenv(String key) | 获取系统指定环境变量信息 |
System.arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,原数组要赋值的元素数量) | 将原数组中指定长度的元素复制到新数组中 |
System.currentTimeMills() | 获取1970.1.1 0:0:0至今经过了多少毫秒。中国的是UTC(+8)所以从1970.1.1 8:0:0至今经过了多少毫秒,返回long类型 |
Runtime类
Runtime类的对象,用于表示程序运行时对象
包含了程序运行环境相关信息。常用于获取运行环境信息(如虚拟机内存)或执行某个命令。
特点
这个类不是一个抽象类,但是不能创建对象,因为其构造方法是私有的。
但是它提供了一个静态方法getRuntime(),通过这个方法,可以获取一个Runtime类的对象。
这就是java中的一种设计模式--单例模式(只能有一个对象创建)
简单使用
Runtime类的对象,可以通过exec()方法执行一个指令,如notepad指令打开记事本,或执行一个存在于硬盘中的.exe可执行文件。该方法返回值是一个Process进程对象,通过Process进程对象调用destory()方法可以摧毁当前进程。
总结
参数只有是引用类型(类、数组、接口),且方法中直接操作该参数时,才会对实参造成影响。
包装类
Java是纯面向对象语言,宗旨是将一切事物视为对象处理。
但原始类型不属于对象,,使用时无需创建对象,保存在栈中。包装类就是原始类型对应的类的类型。
在web应用中,从浏览器获取到的后台数据,全是String类型,一定要使用转换的方法。
-
所有包装类中都有一个compareTo(参数1,参数2)方法,用于比较两个参数
-
如果是数值型,参数1>参数2返回1,参数1<参数2返回-1,相同返回0
-
如果为Boolean型,两个参数相同返回0,不同返时,如果参数1为true返回1
-