String类
2019年3月6日, 星期三
21:53
一、Scanner
1. Scanner的概述
2. Scanner的构造方法原理
a. Scanner(Inputstream source)
b. System类下有一个静态的字段
i. public static final Inputstream in;标准的输入流,对应着键盘录入
c. 一般方法
i. hasNextxxx()判断是否还有下一个输入项,其中Xxx可以是Int, Double等。如果需要判断是否包含下一个字符串,则可以省略xxx
ii. nextxxx()获取下一个输入项。Xxx的含义和上个方法中的xx相同,默认情况下, Scanner使用空格,回车等作为分隔符
3. Scanner获取数据出现的小问题及解决方案
a. 两个常用的方法:
i. 获取一个int类型的值:public int nextInt();
ii. 获取一个String类型的值:public String nextLint();
b. 当nextInt()和nextLine()一起使用
public static void main(String[] args) { Scanner sn=new Scanner(System.in); System.out.println("请输入一个整数:"); int i=sn.nextInt(); System.out.println("请输入一个字符串"); String str=sn.nextLine(); } |
实际上执行程序后,输出的如下
∵ nextInt()是键盘录入整数的方法,当我们录入10的时候,其实在键盘上录入的是10和“\r\n”,nextInt()方法只获取了10就结束了;nextLine()是键盘录入字符串的方法,可以接受任意类型,但是它遇到\r\n就证明一行结束了。
解决方案:
①创建两个Scanner对象
public static void main(String[] args) { Scanner sn=new Scanner(System.in); System.out.println("请输入一个整数:"); int i=sn.nextInt();
Scanner sn2=new Scanner(System.in); System.out.println("请输入一个字符串"); String str=sn2.nextLine(); } |
②键盘录入都使用nextLine()接收,然后在判断后转为整数类型。(推荐)
二、String类
1. String类的概述
a. 字符串字面值“abc”也可以看成是一个字符串对象。
b. 字符串是常量,一旦被赋值就不能被改变了。虽然可以重新赋值,但是已经不是相同的地址值了。
2. String类的构造方法
a. 常见的构造方法:
i. public String();//无参构造。
ii. public String(byte[] bytes);//把字节数组转成字符串
iii. public String(byte[] bytes,int index,int length);//把字节数组的一部分转成字符串
iv. public String(char[] value);//把字符数组转成字符串
v. public String(char[] value,int index,int count);//把字符数组的一部分转成字符串
vi. public String(String original);//把字符串常量值转成字符串
3. 常见问题:
a. String s1=new String("abc");//这句代码创建了几个对象
两个,一个在常量池中,一个在堆内存中。
b. String s1="a" + “b”+"c";String s2="abc";那么s1==s2 和是s1.equals(s2)分别是什么?
都为true,java中有常量优化机制,在("a" + “b”+"c")赋值给s1之前就已经变成了"abc"
c. String s1="ab";String s2="abc"; String s3=s1+"c";那么s2==s3和s2.equals(s3)输出值为?
s2==s3输出false,原因是在(s1+"c")时在堆中会创建一个StringBuild(或者StringBuffer)对象,再调用toString转为"abc",改地址和s2的地址值不一样。所以为false
d. 总结:
①字符串的equals方法,如果字符串的有相同的字符序列则为true,否则为false;字符串的“==”则比较的是字符串对象所指向的地址值是否相同;
②java语言提供对字符串串联符(+)以及将其他对象转换为字符串的特殊支持。字符串串联是通过StringBuild(或者StringBuffer)类及其append方法实现的,字符转换是通过toString()方法实现的。
4. String类的判断功能
a. boolean equals( Object obj):比较字符串的内容是否相同,区分大小写
b. boolean equalsIgnore Case( string str):比较字符串的内容是否相同,忽略大小写
c. boolean contains( string str):判断大字符串中是否包含小字符串
d. boolean startswith( string str):判断字符串是否以某个指定的字符串开头
e. boolean endsvath( String str:判断字符串是否以某个指定的字符串结尾
f. boolean isEmpty():判断字符串是否为空。
三、StringBuffer类的概述
1. StringBuffer类的概述
a. 一个类似于String的字符串缓冲区,不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
b. 线程安全的可变字符序列。
2. StringBuffer和String的区别:
a. String是一个不可变的字符序列。
b. StringBuffer是一个可变的字符序列。
3. StringBuffer类的构造方法
a. 构造方法:
i. public StringBuffer();//无参构造,初始容量为16个字符。
ii. public StringBuffer(int capacity);//制定容量的字符串缓冲区对象
iii. public StringBuffer(String str);//制定字符串内容的字符串缓冲区对象
b. StringBuffer的方法:
i. public int capacity();//返回当前容量。 理论值
ii. public int length();//返回长度(字符数),实际值。
4. StringBuffer常用方法:
a. StringBuffer的添加功能
i. public StringBuffer append(String str);//可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。
ii. public StringBuffer insert(int offset,String str);//在制定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身。
eg:
demo | 运行结果 |
public class Demo_StringBuffer{ public static void main(String[] args) { StringBuffer sb=new StringBuffer(); StringBuffer sb2=sb.append(true); StringBuffer sb3=sb.append("helloworld"); StringBuffer sb4=sb.append(123); } } |
|
∵StringBuffer是字符串缓冲区,当new的时候是在堆内创建了一个对象,底层是一个长度为16的字符数组,当调用添加方法时,不会再重新创建新对象,而是在不断向原缓冲区添加字符
b. StringBuffer的删除功能
i. public StringBuffer deleteCharAt(int index);//删除指定位置的字符,并返回本身
ii. public StringBuffer delete (int start,int end);//删除从指定位置开始(包含)到指定位置(不包含)结束的内容,并返回本身。
c. StringBuffer的替换功能:
i. public StringBuffer replace(int start,int end,String str);//从start开始到end用str替换
d. StringBuffer的反转功能
i. public StringBuffer reverse();//字符串反转
e. Stringbuffer的截取功能
i. public String substring(int start);//从指定位置截取到末尾
ii. public String substring(int start,int end);//截取从start位置开始到end位置结束,包括开始位置,不包括结束位置。
注意:返回值不再是StringBuffer,而是String,原StringBuffer本身不变化。
5. String与StringBuffer的转换
a. String→Stringbuffer转换
i. 通过构造方法: public StringBuffer(String str);
ii. 通过append()方法 eg:sb.append("helloworld");
b. StringBuffer→String转换
i. 通过构造方法: public String(StringBuffer sb);
ii. 通过toString()方法
iii. 通过substring(0,length);