字符串与包装类
目录
-
字符串
-
String类的常用方法
-
获取信息方法
-
操作方法
-
判断方法
-
-
StringBuffer
-
基本数据类型的包装类
字符串
String类位于java.lang包下 这个包下的类使用的时候都不需要导包
创建字符串对象有两种形式
一种是引用字符串常量给字符串变量赋值
String s1 = "hello";
一种是通过构造方法赋值
String s2 = new String();
对于字符串常量 如果内容相同 java认为他们代表同一个String对象
用关键字new调用构造方法 总是会创建一个新的对象 无论内容是否相同
String类型数据可以用"+“或”+="符号表示连接
String s = "we";
s = s + "are";
s += "students";
面试题
为什么普通对象打印的是地址 而字符串打印的是内容?
答
普通对象调用的是Object的toString方法 会将完整的包名+类名+@+十六进制的地址值打印在控制台上 而String类重写了Object的toString方法 会将字符串转换为字符数组 再将字符数组输出到控制台上 所以打印的是内容
public static void main(String[] args){
String s1 = new String("hello");
Student s2 = new Student();
System.out.println(s1);
System.out.println(s2);
}
面试题
String s1 = "hello";//1
String s2 = new String();//1
String s3 = new String("hello");//1
String s4 = new String("hel1o");//2
String s5 = new String("hello world");//2
String s6 = "hello world";//0
问:上述代码一共创建了几个对象?
答
共创建七个对象 String的字符串常量位于字符串常量池中 而字符串常量池在1.6时位于方法区 1.8之后位于堆区 而常量池在设计的时候为了减少内容 如果字符串常量已经存在 则再次使用的时候会直接引用 而如果需要的字符串常量不存在 就需要在常量池中创建出来 不管常量池中如何 只要有new就会在堆区中创建一个字符串对象 所以同时考虑堆区和常量池的问题 上述代码应该共创建了七个对象
String类的常用方法
获取信息方法
length()方法
用于返回字符串的长度 包括空格 返回类型为int
String s = " hello everyone ";
System.out.println(s.length());
indexOf()方法–正向查找
返回参数字符串在此字符串中第一次出现处的索引 从指定的索引开始 如果没有检索到 方法返回值为-1
返回类型int
String s = " hello";
System.out.println(s.indexOf("l"));
lastIndexOf()方法–反向查找
返回参数字符串在此字符串中最后一次出现的索引 从指定的索引开始反向搜索 如果没有检索到 方法返回值为-1
返回类型int
String s = " hello";
System.out.println(s.lastIndexOf("l"));
charAt()方法
返回参数索引位置的字符
返回类型char
String s = " hello";
System.out.println(s.charAt(4));
操作方法
substring()方法
返回一个新的字符串 他是此字符串的一个子字符串 该子字符串从指定索引处的字符开始
参数为 起始索引,结束索引
返回类型String
String s = " hello world ";
String s1 = s.substring(2,8);
trim()方法
返回去除字符串开头和结尾空格的字符串
返回类型 String
String s = " hello world ";
System.out.println(s.trim());
replace()方法
返回一个新的字符串 通过用newChar替换此字符串中出现的所有oldChar得到的
参数说明:原字符,新字符
返回类型 String
String s = " hello world ";
System.out.println(s.replace(" ","A"));//将空格替换成A
toUpperCase()方法
使用默认语言环境的规则将此String中的所有字符都转换为大写
返回类型 String
String s = "ABCdef";
System.out.println(s.toUpperCase());
toLowerCase()方法
使用默认语言环境的规则将此String中的所有字符都转换为小写
返回类型 String
String s = "ABCdef";
System.out.println(s.toLowerCase());
判断方法
startsWith()方法
判断此字符串是否以指定的前缀开始 如果是返回true 否则返回false
参数说明:前缀,在此字符串中开始查找的位置
endsWith()方法
判断此字符串是否以指定的后缀结束 如果是返回true 否则返回false
参数说明:后缀
equals()方法
将此字符串与指定的对象比较 当且仅当该参数不为null 并且是与此对象表示相同字符序列的String对象时 结果才为true
参数说明:与此String进行比较的对象
equalsIgnoreCase()方法
将此String与另一个String比较 不考虑大小写 如果相同返回true 否则返回false
参数说明:与此String比较的另一个String
面试题
equals的实现原理
答
equals在比较字符串的时候比的是内容 需要将字符串转换为字符数组 然后在通过循环进行逐一比较 但是为了提高效率 设置了三重判断 第一重比较两个对象的地址是否相同 如果地址相同则表示的是同一个对象 返回为true 如果两个对象的地址不相同 则进行第二重判断 比较对象是不是String类型的 如果不是 返回false 如果为true则进行第三重判断 比较两个字符串长度是否相同 如果长度不相同 则证明这是两个字符串 如果长度相同 在进行转换为字符数组 进行按位逐一比较
StringBuffer
字符串生成器StringBuffer:类似于String类的字符串缓冲区
-
不能使用连接符"+"连接字符串 追加字符串使用append()方法
-
insert()方法:插入子字符串
-
delete()方法:删除子字符串
public static void main(String[] args) {
//字符串缓冲区默认大小为16 不过我们也可以指定大小 如果传的是字符串的话 缓冲区的大小为
//字符串长度+16
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer(20);
StringBuffer sb3 = new StringBuffer(“hello”);
//StringBuffer 虽然是操作字符串的 但是不能使用+拼接
//sb3 += “world”
sb3.append(" world");
System.out.println(sb3);
System.out.println(“hello”.toString());
System.out.println(sb3.toString());
}
String与StringBuffer
-
相同点
-
都用来处理字符串
-
字符在字符串中索引都是从0开始
-
提供length()charAt()substring()方法且用法相同
-
-
不同点
-
String类型创建的对象是不可变的StringBuffer类创建的对象是可变的
-
String类对象可以用“+“连接字符串StringBuffer类对象不能使用”+“连接字符串 追加字符串使用append()方法
-
String类成员equals方法判断字符串内容是否相同StringBuffer类成员equals方法判断地址是否相同
-
String类成员toString()方法返回当前String实例的引用StringBuffer类成员toString()方法返回以当前StringBuffer实例为内容的新的String实例的引用
-
包装类
-
所有的包装类都没有子类
-
包装类是不可变类 一个包装类的对象创建后 他所包含的基本类型数据就不能改变
常用方法
-
toString()方法以字符串形式返回包装对象所表示的基本类型数据
-
valueOf()静态方法转换String时Character除外根据参数创建包装类对象 参数不能为null且能够被转化为相应包装类
-
parseXXX()静态方法将参数转化为基本类型 参数不能为null且能够被转化为相应的基本类型
public class PackagedType {
//包装类的作用
//与八种基本数据类型互转
//当类中不允许使用八种基本数据类型时
public static void main(String[] args) {
//包装类只要创建成功 类型就不可以改变 而且也不能出现类型转换
int a = 20;
//装箱:由基本数据类给包装类类型赋值 就是装箱 而且是自动装箱
Integer i1 = a;
//拆箱:由包装类类型给基本数据类型赋值 就是拆箱 而且是自动拆箱
a = i1;
//由于包装类是对象类型 所以也可以通过构造方法创建对象
Integer i2 = new Integer(30);
//将包装类转换为字符串String
String s = i2.toString();
//再将字符串转换为基本数据类型
String s1 = "123";
//该类型的包装类去调用parseXXX方法
int b = Integer.parseInt(s1);
System.out.println(b);
}