Java高级

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值