------- android培训、java培训、期待与您交流! ----------
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
String类的概述和使用:
(1)多个字符组成的一串数据。
其实它可以和字符数组进行相互转换。
(2)构造方法:
A:publicString() 无参构造
B:publicString(byte[] bytes) 把字节数组转成字符串
C:publicString(byte[] bytes,int offset,int length) 把字节数组的一部分转成字符串
D:publicString(char[] value) 把字符数组转成字符串
E:publicString(char[] value,int offset,int count) 把字符数组的一部分转成字符串
F:publicString(String original) 把字符串常量值转成字符串
下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
G:Strings = "hello";
(3)字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
B:字面值作为字符串对象和通过构造方法创建对象的不同
String s = newString("hello");和String s = "hello"的区别?
1.前者造就了两个对象,堆内存一个,方法区一个。前者会创建2个对象,后者创建1个对象。
(4)字符串的面试题(看程序写结果)
A:==和equals()
Strings1 = new String("hello");
Strings2 = new String("hello");
System.out.println(s1== s2);// false
System.out.println(s1.equals(s2));//true
Strings3 = new String("hello");
Strings4 = "hello";
System.out.println(s3== s4);// false
System.out.println(s3.equals(s4));//true
Strings5 = "hello";
Strings6 = "hello";
System.out.println(s5== s6);// true
System.out.println(s5.equals(s6));//true
B:字符串的拼接
Strings1 = "hello";
Strings2 = "world";
Strings3 = "helloworld";
System.out.println(s3== s1 + s2);// false
System.out.println(s3.equals((s1+ s2)));// true
System.out.println(s3 =="hello" + "world");// false这个我们错了,应该是true
System.out.println(s3.equals("hello"+ "world"));// true
(5)字符串的功能:
A:判断功能
booleanequals(Object obj) 比较字符串的内容是否相同,区分大小写。
booleanequalsIgnoreCase(String str) 比较字符串内容是否相同,忽忽略大小写。
booleancontains(String str) 判断大串中是否包含小字符串
booleanstartsWith(String str) 判断字符串是否以某个指定的字符串开头
booleanendsWith(String str) 判断字符串是否以某个指定的字符串结尾
booleanisEmpty() 判读字符串是否为空
注意:字符串为空和字符串对象为空。
String s =” ”
String s= null;
B:获取功能
int length() 获取字符串的长度
charcharAt(int index) 获取指定索引位置的字符
intindexOf(int ch) 返回指定字符在此字符串中第一次出现的索引。
intindexOf(String str) 返回指定字符串在此字符串第一次出现的索引。
intindexOf(int ch,int fromIndex) 返回指定在此字符中从指定位置后第一次出现处的索引。
intindexOf(String str,int fromIndex) 返回指定在此字符串中从指定位置后第一次出现处的索引。
Stringsubstring(int start) 从指定位置开始截取字符串,默认到末尾 (包左不包右)
Stringsubstring(int start,int end) 从指定位置开始到指定位置结束截取字符串。(包左不包右)
C:转换功能
byte[]getBytes() 把字符串转换为字节数组。
char[]toCharArray() 把字符串转换为字符数组。
staticString valueOf(char[] chs) 把字符数组转成字符串。
staticString valueOf(int i) 把int类型的数据转换成字符串。
注意:String类的valuueof( )方法可以把任意类型的数据转成字符串。
StringtoLowerCase() 把字符串转成小写。
StringtoUpperCase() 把字符串转成大写。
Stringconcat(String str) 把字符串拼接。
D:其他功能
a:替换功能
Stringreplace(char old,char new) 替换
Stringreplace(String old,String new) 替换字符串。
b:去空格功能
Stringtrim() 去除字符串两空格。
c:按字典比较功能
intcompareTo(String str) 按字典顺序比较两个字符串。
intcompareToIgnoreCase(String str) 按字典顺序忽略大小写比较字符串。
(6)字符串的案例
A:模拟用户登录
String username="adim";
String password="1234";
// for(int x=1;x<6;x++){
// System.out.println(x);
// }
for(int x=0;x<3;x++){
Scanner sc= new Scanner(System.in);
System.out.println("请输入用户名:");
System.out.println("----------------");
String username1= sc.nextLine();
System.out.println("请输入密码:");
String password1=sc.nextLine();
if(username.equals(username1) &&password.equals(password1)){
System.out.println("登陆成功,");
numberguess.start();
break;
}else {
if(0==(2-x)){
System.out.println("账号被锁定,请联系班长");
}else{
System.out.println("登陆失败,你还有"+(2-x)+"机会");
}
}
B:字符串遍历
两种思路:1. sr.length()和sr.charAt()
2.知道其字符串的长度,定义相长的数组,sr. char[]toCharArray() 把字符串转换为字符数组,然后遍历其数组。
C:根据键盘录入,判断其中字符串的大写,小写,数字的分别个数。
Scanner sc =new Scanner(System.in);
String sr = sc.nextLine();
int small=0;
int big=0;
int number=0;
//遍历出每一个字符串;
for(int x=0;x<sr.length();x++){
char cha =sr.charAt(x);
System.out.print(cha);
//比较每有一个字符的大小写;
if(cha>='0' && cha<='9'){
number++;
}else if(cha>='a' && cha<='z'){
small++;
}else if(cha>='A' && cha<='z')
big++;
System.out.println(number);
System.out.println(big);
System.out.println(small);
D:把字符串的首字母转成大写,其他小写
String s = "helloWORLD";
// 先获取第一个字符
String s1 = s.substring(0, 1);
// 获取除了第一个字符以外的字符
String s2 = s.substring(1);
// 把A转成大写
String s3 = s1.toUpperCase();
// 把B转成小写
String s4 = s2.toLowerCase();
// C拼接D
String s5 = s3.concat(s4);
System.out.println(s5);
// 优化后的代码
// 链式编程
String result = s.substring(0,1).toUpperCase()
.concat(s.substring(1).toLowerCase());
System.out.println(result);
E:把int数组拼接成一个指定格式的字符串
int [] number={1, 2, 5};
//定义一个祖父串;
String sr="";
String s=new String("[");
//遍历数组;
for(int x=0;x<number.length;x++){
if(x==number.length-1){
s+=number[x]+"]";
System.out.println(number[x]+"]");
}else {
System.out.println(number[x]+","+"");
s+=number[x]+","+""+"jjjjj";
System.out.println(s);
}
}
System.out.println(s);
F:字符串反转
/
/ 键盘录入一个字符串
Scanner sc = newScanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
/*
// 定义一个新字符串
String result = "";
// 把字符串转成字符数组
char[] chs = line.toCharArray();
// 倒着遍历字符串,得到每一个字符
for (int x = chs.length - 1; x>= 0; x--) {
// 用新字符串把每一个字符拼接起来
result += chs[x];
}
// 输出新串
System.out.println("反转后的结果是:" + result);
*/
// 改进为功能实现
String s = myReverse(line);
System.out.println("实现功能后的结果是:" + s);
}
/*
* 两个明确:返回值类型:String参数列表:String
*/
public static String myReverse(Strings) {
// 定义一个新字符串
String result = "";
// 把字符串转成字符数组
char[] chs = s.toCharArray();
// 倒着遍历字符串,得到每一个字符
for (int x = chs.length - 1; x >= 0; x--) {
// 用新字符串把每一个字符拼接起来
result += chs[x];
}
return result;
}
G:统计大串中小串出现的次数
public static void main(String[] args) {
// 定义大串
String maxString = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
// 定义小串
String minString = "java";
// 写功能实现
int count =getCount(maxString,minString);
System.out.println("Java在大串中出现了:" + count +"次");
}
/*
* 两个明确:返回值类型:int参数列表:两个字符串
*/
public static int getCount(String maxString,StringminString) {
// 定义一个统计变量,初始化值是0
int count = 0;
/*
// 先在大串中查找一次小串第一次出现的位置
int index =maxString.indexOf(minString);
// 索引不是-1,说明存在,统计变量++
while (index != -1) {
count++;
// 把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
// int startIndex = index +minString.length();
// maxString =maxString.substring(startIndex);
maxString = maxString.substring(index +minString.length());
// 继续查
index = maxString.indexOf(minString);
}
*/
int index;
//先查,赋值,判断
while((index=maxString.indexOf(minString))!=-1){
count++;
maxString = maxString.substring(index +minString.length());
}
return count;
}
2:StringBuffer
(1)StringBuffer概述:
用字符串做拼接,每次拼接,都会构建一个新的String对象,既耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了
一个字符串缓冲区类。StringBuffer供我们使用。
StringBuffer: 线层安全的可变字符串。
StringBuffer 和String 的区别?
前者长度和内容可变,后者不可变。
如果使用前者做字符串的拼接,不会浪费太多的资源。
(2)StringBuffer的构造方法
A:StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为16字符。
B:StringBuffer(int capacity) 指定容量的字符串缓冲区对象。
C:StringBuffer(Stringstr) 指定字符串内容的字符串缓冲区对象。
DStringBuffer(CharSequence seq)
StringBuffer的方法:
public int capacity() 返回当前容量。(理论值)
Pubic int length(): 放回长度(字符数)。 实际值
(3)StringBuffer的常见功能:
A:添加功能
PublicStringBuffer append(Xxx xxx):可以把任意类型添加到字符串缓冲区里面。
StringBuffer sb = new StringBuffer()//创建了一个字符串缓冲区。
StringBuffer sb2 = sb.append(“hello”)
Sb == sb2 //true
PublicStringBffer insert(int offset, String str): 在指定位置把任意类型的数据插入到字符串缓冲区里面。
B:删除功能
Public StringBuffer deleteCharAt(int index) : 删除指定位置的字符,并返回返回本身。
Public StringBuffer delete(int start ,int end) :删除指定位置开始指定位置结束的内容,并返回本身。(包左不包右)
删除所有数据: sb.delete(0,sb.length())
C:替换功能
PublicStringBuffer replace(int start,int end,string str):从Start开始到end用Str替换。
D:反转功能
PublicStringBuffer reverse() 字符串反转。
E:截取功能(注意这个返回值)
返回值类型是String类型,本身没有发生改变。
Public String substring(int start):
Public String substring(int Start ,int end):
(4)StringBuffer的练习(做一遍)
A:String和StringBuffer相互转换
String– StringBuffer
1. 通过构造方法
StringBuffer sb = new StringBuffer(s);
2. 通过append()方法
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> StringBuffer-- String</span>
1.通过构造方法 String str = new String(buffer);
2.toString()方法
B:字符串的拼接
public static String arrayToString(int [] arr){
StringBuffer sb = new StringBuffer();
sb.append("[");
for(int x=0; x < arr.length;x++){
if(x==arr.length-1){
sb.append(arr[x]);
}else{
sb.append(arr[x]);
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
C:把字符串反转
public static String myReverse(String s){
String result ="";
char[] chs= s.toCharArray();
for(int x = chs.length - 1; x>= 0; x--){
//char ch = chs[x]
//result += ch;
result += chs[x];
}
return result;
}
public static String myReverse2(String s){
// StringBuffer sb = new StringBuffer();
// sb.append(s);
// System.out.println(sb);
// StringBuffer sb3=sb.reverse();
// System.out.println(sb3);
// System.out.println("-----------");
// StringBuffer sb2 = new StringBuffer(s);
// sb2.reverse();
//
// return sb.toString();
return new StringBuffer(s).reverse().toString();
}
D:判断一个字符串是否对称
public static boolean issame(String s){
return newStringBuffer(s).reverse().toString().equals(s);
}
// public static boolean isSame2(String s){
//
//
// //把字符串转成字符数组
// char[] chs= s.toCharArray();
//
// for(intstart = 0, end = chs.length -1; start <= end; start++, end-- ){
// if(chs[start]!= chs [end]){
// return false;
// }
// }
// return true;
//
// }
public static boolean isSame(String s){
boolean flag = true;
//把字符串转成字符数组
char[] chs = s.toCharArray();
for(int start = 0, end = chs.length -1; start<= end; start++, end-- ){
if(chs[start] != chs [end]){
flag = false;
break;
}
}
return true;
}
}
(5)面试题
小细节:
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
A:String,StringBuffer,StringBuilder的区别
1. String是内容不可变,而StringBuffer, StringBuilder都是内容可变的。
2. 看上面。
B:StringBuffer和数组的区别?
1. 二者都可以看出是一个容器,装其他的数据。
2. 然而StringBuffer的数据最终是一个字符串数据、
而数组可以放置多种数据,但必须是同一种数据类型。
(6)注意的问题:
String作为形式参数,StringBuffer作为形式参数。
形式参数:
* 基本类型:形式参数的改变不影响实际参数
* 引用类型:形式参数的改变直接影响实际参数
*
* 注意:
* String作为参数传递,效果和基本类型作为参数传递是一样的。
public class StringBufferDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1 + "---" + s2);// hello---world
change(s1, s2);
System.out.println(s1 + "---" + s2);// hello---world
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1 + "---" + sb2);// hello---world
change(sb1, sb2);
System.out.println(sb1 + "---" + sb2);// hello---worldworld
}
public static void change(StringBuffer sb1, StringBuffer sb2) {
sb1 = sb2;
sb2.append(sb1);
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}