Java中的String类、常用类及包装类
一、String类
1、String类定义
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
代码示例:
String str_1="abc";
String str_2="abc";
System.out.println(str_1==str_2);
String str_3=new String("abc");
String str_4=new String("abc");
System.out.println(str_3==str_4);
代码解析:
String类是不可变的,所以在创建对象时,如果直接赋值,相当于多个对象指向同一个内存区域;当创建对象使用new关键字时,相当于开辟不同的内存,所以指向也不同。“==”判断引用数据类型时,判断的是内存地址,所以输出结果为true和false。
2、字符串的特点
- String类是被final修饰的,是不能被继承的。
- String类底层使用数组结构。jdk9以前使用的是char[],jdk9以后使用的是byte[]。
- String的对象一旦创建就不能修改,底层维护了一个字符串常量池,实现共享。
- String类的对象每次修改都会产生一个新的对象。
3、String类的常用方法
- charAt(int index) :返回字符串中第index个字符,index从0开始
- toCharArray():将String转为字符串数组
- length() :返回字符串的长度
- indexOf(String str):返回字符串中出现str的第1个位置
- indexOf(String str, int fromIndex):返回字符串中, 从第fromIndex个字符数起,
出现str的第1个位置, 这个方法是上面方法的重载 - lastIndexOf(String str):返回字符串中出现str的最后1个位置
- equals(String str):比较两个字符串是否相等
- equalsIgnoreCase(String str):忽略大小写, 比较两个字符是否相等.
- replace(char oldChar, char newChar):返回1个新字符串,
该新字符串内的oldChar被newChar替换掉, 注意旧字符串没有被修改. - startsWith(String prefix):判断字符串是否以 prefix 开头
- endsWith(String suffix):判断字符产是否以suffix 结尾
- subString(int beginIndex):截取从第beginIndex个字符开始到最后1个字符, 返回1个新字符串
- subString(int beginIndex, int endIndex):截取从第beginIndex个字符开始,
第endIndex个字符, 返回1个新字符串, 是上面方法的重载 - valueOf(…):这个是静态方法. 可以把其他基本数据类型转换成String对象
4、String、StringBuffer和StringBuilder
String、StringBuffer和StringBuilder的联系
三者都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
String、StringBuffer和StringBuilder的区别
- 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer >
String(String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。) - 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
StringBuffer和StringBuilder的常用方法有:
- append方法:将字符(或字符串)追加到该序列的末尾
- insert方法:将字符(或字符串)插入到该序列的指定位置
- delete方法:从该序列中删除指定位置的字符
- replace方法 :替换该序列中指定位置的字符串
- substring方法:字符串截取,返回一个替换好的String值
- reverse方法:反转该字符序列
- toString方法: 将对象转换为String
总结String、StringBuffer和StringBuilder
- String:适用于少量的字符串操作的情况
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
二、常用类
1、Math类
Math类中包含了用于执行基本数学运算的方法,如:小数取整、绝对值、随机数等;Math类中提供的方法都是静态方法,可以通过类名直接调用
- PI静态常量: 表示圆周率
- floor方法:小数取整,向下取整
- ceil方法:小数取整,向上取整
- round方法:小数取整,四舍五入
2、 Random类
用于生成随机数
- nextBoolean方法:用于生成一个随机boolean值
- nextDouble方法:用于生成一个0-1(不包括1)之间的随机小数
- nextInt(int end)方法:用于生成一个0至指定值的随机整数,不包括整个指定的值
3、Date类
获取日期
- getTime方法:获取当前时间的毫秒数,从1970年1月1日开始
- toLocaleString方法: 获取当地时间,返回值是一个字符串
4、SimpleDateFormat类
日期、时间格式化类
- format方法:格式化日期(yy-MM-dd hh:mm:ss)
- parse方法:将字符串转换为日期
三、包装类
Java是面向对象的语言,但是为了便于开发者的使用,Java中保留了基本数据类型,在进行基本的数据计算时,开发者可以直接使用基本数据类型。但是当需要和其他对象结合使用,如存入集合中,就需要将基础数据类型实例化为Java对象,为了面向对象的这一特性,基本数据类型中的每一个类型在java.lang包中都有一个包装类,即将每个基本类型都包装成了一个类。
基本数据类型和引用数据类型的对应关系
基本数据类型和引用数据类型的相互转化
- 装箱:基本数据类型转换为包装类
- 拆箱:包装类转换为基本数据类型。
自动装箱就是自动将基本数据类型转换为包装器类型;自动拆箱就是自动将包装器类型转换为基本数据类型。自动装箱和拆箱都是在编译阶段就完成的。自动装箱的时候,java编译器会默认调用valueOf进行装箱,拆箱时会调用**Value方法。
//1.自动装箱
int t1=1;
Integer t2=t1;
//2.手动装箱
Integer t3=new Integer(t1);
System.out.println("int类型t1="+t1);
System.out.println("自动装箱,Integer类型对象t2="+t2);
System.out.println("手动装箱,Integer类型t3="+t3);
//1.自动拆箱
int t4=t2;
//2.手动拆箱
//通过intValue()方法返回int值,还可以利用其他方法装换为其他类型
int t5=t2.intValue();
System.out.println("自动拆箱,int型t4="+t4);
System.out.println("手动拆箱,int型t5="+t5);
Java包装类注意事项
- 所有包装类都可以将与之对应的基本数据类型作为参数来创建它们的实例对象
- 除了Character类之外,其他包装类都可以将一个字符串作为参数来构造它们的实例
- Boolean类的构造方法参数为String类型时,若该字符串为true(不论大小写),则该对象表示true,否则表示false
- 当包装类Number构造方法的参数为String类型时,字符串不能为null,并且该字符串必须能够解析为基本类型的数据
- 集合不允许存放基本数据类型,故常用包装类
- 包含了每种基本数据类型的相关属性,如最大值、最小值、所占位数等
- 作为基本数据类型对应的类型,提供了一系列实用的对象操作,如类型转换、进制转换等方法
Java中的比较“==”和“equals”
包装类中的equals方法和String类一样,都是重写了Object类中的equals方法,因此比较的是内容而不是地址,而“= =”比较的依然是引用变量的地址,只是当包装类型和与之相对应的基本类型进行“= =”比较时会先做自动拆箱处理。