带妹学Java第七天(字符串的遍历)

重点

1.Object的toString方法

》当在控制台输入对象的时候,默认会调用对象的toString方法
Student stu = new Student(“小李”,28);
System.out.println(stu);
System.out.println(stu.toString());
》toString方法默认输出的格式:包名.类名@16进制
com.gyf.model.Student@1db32342

》一般会在子类中重写toString方法,在toString方法中把属性和值打印出来

2.Object的equals方法

》这个方法默认是比较两个对象的地址是否一样
》一般子类也会重写equals,来改变默认的比较规则
添加自己的比较规则,比如:比较类中的属性值是否一样

class Student{
String name;
int age;
public boolean equals(Object obj){
Student other = (Student)obj;
return this.age == other.age && this.name.equals(other.name)
}
}

3.字符串String的比较

》String这个类已经重写了Object的equals方法
》方法里面的实现是比较2个字符串的内容是否一样,如果一样就返回true

4.Scanner的类一个小问题

》如果你要先获取一个数字,再获取一个字符串
不能同时写 scanner.nextInt,和 scanner.nextLine;
》解决办法,把数字也当成字符串处理,写两个scanner.nextLine

5.String的类

》String的这个类是final,所以他没有子类
》String str = “abc”, abc相当于是一个实例对象 "abc"是一个常量区,他是被共享
》字符串常量是不能改变值

6.String构造方法

public String()
public String(byte[] bytes):把字节数组转成字符串
public String(byte[] bytes,int index,int length):把字节数组的一部份转成字符串
public String(char[] value,int index,int count):把字符数组的一部份转成字符串
public String(String original) :初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。

7.String一些判断功能

public boolean equals(Object anObject) 判断字符串是否一样
public boolean equalsIgnoreCase(String anotherString) 判断字符串是否一样,忽略大小写
public boolean contains(CharSequence s) 判断字符串是否包含哪字符串
public boolean startsWith(String prefix) 判断字符串是否以什么开头
public boolean endsWith(String suffix) 判断字符串是否以什么结尾
public boolean isEmpty() 判断字符串是否为空字符串

8.字符串比较一个小技巧-避免空指针异常

把字符串常量放在比较的前面
String username = null;
“admin”.equals(username)

9.String类的获取功能

  • int length():获取字符串的长度
  • char charAt(int index):获取指定索引位置的字符
  • int indexOf(int ch):获取指定字符在此字符串第一次出现处的索引
  • int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引
  • int indexOf(int ch,int fromIndex):返回指定字符在此字符串中指定位置后第一次出现处的索引
  • int indexOf(String str,int fromIndex):返回指定字符串在此字符串中指定位置后第一次出现处的索引
  • lastIndexOf() 最后出现的位置
  • String substring(int start):从指定位置开始截取字符串,默认到未尾
  • String substring(int start,int end):从指定位置开始到指定位置结束截取字符图

10.String类转换功能

byte[] getBytes():把字符串转换为字节数组
char[] toCharArray():把字符串转换为字符数组
static String valueOf(char[] chs):把字符数组转成字符串
static String valueOf(int i):把int类型的数据转成字符串
注意:String类的valueOf方法可以把任意类型的数据转成字符串
String toLowerCase():把字符串转成小写
String toUpperCase():把字符串转成大写
String concat(String str):把字符串拼接,且只能拼接字符串。+方式拼接字符串时,可以是任意类型

11.String类的其它功能

public String replace(char oldChar, char newChar)//替换字符
public String replace(CharSequence target, CharSequence replacement) //替换字符串
String trim();//去除前后空格
public int compareTo(String anotherString) //比较
public int compareToIgnoreCase(String str) //比较

例子:
String s1= “abc”;
String s2 = “aac”
s1.compareTo(s2):结果+1

12.StringBuffer的构造方法

StringBuffer 字符串缓冲区类
StringBuffer里面的字符序列【char[]】是可以改变的
String的字符序列是不可以改变

13.StringBuffere的添加方法

append方法
insert方法

14.StringBuffer的删除方法

deleteCharAt(int index) 删除指定索引的字符
delete(int start,int end): 删除开始到结束位置的字符

15.StringBuffer的反转功能

reverse()方法,将字符串反转

16.StringBuffer的截取功能

public String substring(int start): 从指定位置截取到末尾

public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置

17.StringBuffer与String的相互转换

String –> StringBuffer
通过构造方法
通过append()方法
StringBuffer -> String
通过构造方法
通过toString()方法
通过subString(star,end);

18.

练习题

1.模拟用户登录,只给三次机会

/需求:模拟登录,给三次机会,并提示还有几次
用户名和密码都是admin
/

public static void main(String[] args) {
		// TODO Auto-generated method stub	
		Scanner scanner = new Scanner(System.in);
		
		//给三次机会输入用户名和密码
		for(int i = 0;i < 3 ; i++){
			//0.提示还有几次机会
			System.out.println("您还有" + (3 - i) + "次机会可以登录");
			
			//1.接收用户输入的用户名和密码
			System.out.println("请输入用户名:");
			String username = scanner.nextLine();
			
			System.out.println("请输入密码:");
			String password = scanner.nextLine();
			
			//2.判断用户名和密码是否正确
			if(username.equals("admin") && password.equals("admin")){
				System.out.println("恭喜登录成功...");
				break;//跳出循环
			}else{
				System.out.println("登录失败,用户名或者密码不正确");
			}
		}
	}

2. 统计不同类型字符个数

public static void main(String[] args) {
		//案例:统计不同类型字符个数
		String password = "abZZc23&%Asd^4";
		
		//密码:大写,小写,数字,特殊字符
		
		//1.声明变量
		int big = 0;//大写
		int small = 0;//小写
		int num = 0;//数字
		int other = 0;//特殊字符
				
				
		//2.遍历字符串的字符
		for(int i=0; i < password.length();i++){
			//取字符
			char ch = password.charAt(i);
			System.out.println(ch);
			
			//判断字符是否为大写
			if(ch >= 'A' && ch <='Z'){
				big ++;
			}else if(ch >= 'a' && ch <= 'z'){//判断是否为小写
				small ++;
			}else if(ch >= '0' && ch <= '9'){//判断是否为数字
				//'0' 对应码表的数字是48
				//'9' 对应码表的数字是57
				num ++;
			}else{//特殊字符
				other ++;
			}
		}
		
		
		System.out.println("大写字母出现的次数:" + big);
		System.out.println("小写字母出现的次数:" + small);
		System.out.println("数字出现的次数:" + num);
		System.out.println("特殊字符出现的次数:" + other);
	}

3.把一个字符串的首字母转成大写,其余为小写

public class Demo01 {

	public static void main(String[] args) {
		//把一个字符串的首字母转成大写,其余为小写
		String s = "hELLO,How Are You!";
		
		//4.进行拼接[链式编程]
		s = s.substring(0, 1).toUpperCase().concat(s.substring(1).toLowerCase());
		System.out.println(s);
	}

	public static void test1() {
		String s = "hELLO,How Are You!";
		
		//1.截取第一个字母
		String s1 = s.substring(0, 1);
		
		//2.截取第一个字母后面的数字串
		String s2 = s.substring(1);
		System.out.println("s1:" + s1);
		System.out.println("s2:" + s2);
		
		//3.转大小写
		s1 = s1.toUpperCase();
		s2 = s2.toLowerCase();
		System.out.println("s1:" + s1);
		System.out.println("s2:" + s2);
		
		//4.进行拼接
		s = s1.concat(s2);
		System.out.println(s);
	}
}

4.把int[] arr = {1,2,3} 转成字符串 [1,2,3] 用String来做

public class Demo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//案例:把数组转成字符串
/*		把数组中的数据按照指定的格式拼接成字符串
		eg:int[] arr = {1,2,3} 转成 “[1,2,3]”*/
		
		//1.声明个数组
		int[] arr = {1,2,3,4,5,6};
		
		//2.声明一个字符串
		String str = "[";
		
		//3.遍历元素
		for(int i=0;i<arr.length;i++){
			//str = str + arr[i] + ",";
			if(i == arr.length - 1){//遍历到最后一次
				str += arr[i] + "]";
			}else{
				str += arr[i] + ",";
			}
		}
		
		System.out.println(str);


	}

}

5.字符串的反转

String str = "abc";
for(int i = str.length() - 1;i >= 0 ;i--){
	System.out.print(str.charAt(i));
}

6.统计大串中小串出现的次数

String str = “helgyfnnnngyfooogyf88”;
String name = “gyf”;

思路:使用死循环

public class Demo01 {

	public static void main(String[] args) {
		//课堂案例:统计大串中小串出现的次数
		String str = "helovennnngylovegyfgyf8love";
		
		String name = "love";
		
		/*int index = str.indexOf(name);//name在str中第一次出现的位置,-1代表没有找到
		System.out.println(index);*/
		
		int count = 0;
		while(true){
			System.out.println(str);
			
			int index = str.indexOf(name);
			
			if(index == -1){//没找到,退出循环
				break;
			}
			
			//找到,截取字符串,在+1
			str = str.substring(index + name.length());
			count ++;
		}
		
		System.out.println(name + " 出现的次数" + count);
	}
}

7.数组转成字符串,使用StringBuffer实现 int[] arr = {1,2,3} -> [1,2,3]

public class Demo01 {

	public static void main(String[] args) {
		//课堂案例:把数组转成字符串, 用StringBuffer实现
	/*	需求:把数组中的数据按照指定个格式拼接成一个字符串 
		举例: int[] arr = {1,2,3}; 
		输出结果: "[1, 2, 3]" */
		
		//1.声明一个数组
		int[] arr = {1,2,3,4,5,6};
		
		//2.声明字符串缓冲区对象
		StringBuffer sb = new StringBuffer();
		sb.append("[");
		
		//3.遍历元素
		for(int i=0;i<arr.length;i++){
			sb.append(arr[i]);
			if(i == arr.length - 1){//最后一个
				sb.append("]");
			}else{
				sb.append(",");
			}
			
		}
		
		System.out.println(sb);
	}
}

8.字符串反转,使用StringBuffere的reverse方法实现

public class Demo01 {

	public static void main(String[] args) {
	/*	需求:把字符串反转 ,用StringBuffer的功能实现
		举例:键盘录入"abc" 输出结果:"cba" */
		
		//1.监听用户键盘输入
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一段内容:");
		String s = scanner.nextLine();
		
		//2.反转
		StringBuffer sb = new StringBuffer(s);
		sb.reverse();
		System.out.println(sb);
	}
}

面试题

1.==和equals的区别

》== 可以比较基本数据类型,也可以比较引用数据类型(对象地址)
》equals只能比较引用数据类型,默认情况下比较的是两个对象的地址是否一样

2.String类的面试题

//1.判断定义为String类型的s1和s2是否相等
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2);//比较的是内存地址
System.out.println(s1.equals(s2));//比较的是内容是否相等
结果:true
true
//字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
**内存解释:**String s1 = “abc”;String s2 = “abc”;因为值相等,这两个会指向同一个地址,避免资源浪费。
字符串内存解释

3.下面这句话在内存中创建了几个对象

String s1 = new String(“ABC”);//出现一个副本
//出现2个对象,一个在常量区,副本在堆区
内存解释:
内存图解释

4.判断定义为String类型的s1和s2是否相等

String s1 = new String(“abc”);
String s2 = “abc”;

	//一个堆区地址,一个常量区地址,肯定不一样
	System.out.println(s1 == s2);
	System.out.println(s1.equals(s2));

5.判断定义为String类型的s1和s2是否相等

//常量优化机制,编译的时候就已经是abc
/***
* 最终.java编译成.class,再执行
* .class
* String s1 = “abc”;
* String s2 = “abc”
*/

	String s1 = "a" + "b" + "c";
	String s2 = "abc";
	System.out.println(s1 == s2);
	System.out.println(s1.equals(s2));

6.判断定义为String类型的s1和s2是否相等

    String s1 = "ab";
	String s2 = "abc";
	String s3 = s1 + "c";
	System.out.println(s3 == s2);
	System.out.println(s3.equals(s2));

7.字符中的遍历和面试题

/面试题:数组有没有length方法,String中有没有length属性
/***
* 数组是没有length方法,只有length属性
* String是有length方法,而不是属性
*/
int[] arr = {1,2,3,4,5};
System.out.println(arr.length);

8.字符串的面试题:

  1. StringBuffer和StringBuilder的区别

StringBuffer是jdk1.0版本的,是线程安全的,效率低,加同步锁
StringBuilder是jdk1.5版本的,是线程不安全的,效率高,没有加锁

  1. String 和StringBuffer,StringBuilder的区别

String是一个不可变的字符序列
StringBuffer,StringBuilder是可变的字符序列

总结

通过今天的学习,掌握了Object类的toString()、equals()重写,了解了String的诸多方法,类似于截取字符串,拼接字符串。因为String不能在指定位置插字符,所以有了StringBuffer(字符串缓冲区),StringBuffer的insert方法可以在任意位置添加字符,也拓展了几个功能,常见的由reverse(反转)、replace(替换)。由于StringBuffer是线程安全的,加了同步锁,导致效率低,在JDK1.5推出了StringBuilder,除了能实现StringBuffer的所有功能外,它本身是线程不安全的,没有加同步锁,效率高。

发布了24 篇原创文章 · 获赞 4 · 访问量 619

猜你喜欢

转载自blog.csdn.net/qq_43488797/article/details/103749291