模块十四重点:all
第一章.String
1.String介绍
1.概述:String类代表字符串
2.特点:
a.凡是带双引号的,都是String的对象
String s="abc"
"abc"就是对象;String就是对象的数据类型;s就是对象名
b.字符串是常量,它们的值在创建之后不能更改
String s="hello"
s+="world"->会产生新对象
(图1配合理解)
c.String对象是不可变的,所以可以共享
String s1="abc"
String s2="abc"
(图2配合理解)

java
package xyf0210_String_a;
public class Demo01String {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
System.out.println(s1==s2);//true
}
}

2.String的实现原理

3.String的创建
1.String()->利用String的无参构造创建String对象
2.String(String original)->根据字符串创建String对象
3.String(char[] value)->根据char数组创建String对象
4.String(byte[] bytes)->通过使用平台的默认字符集解码指定的byte数组,
构造一个新的String a.平台:操作系统 b.操作系统默认字符集:GBK
5.简化形式:String 变量名=" "

java
package xyf0210_String_a;
public class Demo02String {
public static void main(String[] args) {
//1.String()->利用String的无参构造创建String对象
String s1=new String();
System.out.println(s1);
//2.String(String original)->根据字符串创建String对象
String s2=new String("abc");
System.out.println(s2);
//3.String(char[] value)->根据char数组创建String对象
char[] chars={'a','b','c'};
String s3=new String(chars);
System.out.println(s3);
//4.String(byte[] bytes)->通过使用平台的默认字符集解码指定的byte数组,构造一个新的String
byte[] bytes1={97,98,99};
String s4=new String(bytes1);
System.out.println(s4);
//5.简化形式:String 变量名=" "
String s7="abc";
System.out.println(s7);
}
}


4.String笔试题:
1.代码1:
java
package xyf0210_String_b;
public class Demo03String {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
String s3=new String("abc");
System.out.println(s1==s2);//true
System.out.println(s1=s3);//false
System.out.println(s2==s3);//false
}
}
内存分配:

2:
问题1:String s=new String("abc")共有几个对象?2个
一个new本身 一个是"abc"
问题2:String s=new String("abc")共创建了几个对象?1个或者2个
就看abc有没有提前创建出来了

5.字符串中的常见问题
1.字符串拼接,如果等号右边是字符串字面值拼接,不会产生新对象(s4)
2.字符串拼接,如果等号右边有变量参数拼接,会产生新字符串对象(s5,s6)
java
package xyf0210_String_b;
public class Demo04String {
public static void main(String[] args) {
String s1="hello";
String s2="world";
String s3="helloworld";
String s4="hello"+"world";
String s5=s1+"world";
String s6=s1+s2;
System.out.println(s3==s4);//true
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
}
}

第二章.String的方法
1.判断方法
1.boolean equals(String s)->比较字符串内容
2.boolean equalsIgnoreCase(String s)->比较字符串内容,忽略大小写
java
package xyf0211_Stringmethod_a;
public class Demo01String {
public static void main(String[] args) {
String s1="abc";
String s2=new String("abc");
String s3="ABC";
System.out.println(s1==s2);//比较地址值了
// boolean equals(String s)->比较字符串内容
System.out.println(s1.equals(s2));
// boolean equalsIgnoreCase(String s)->比较字符串内容,忽略大小写
System.out.println(s1.equalsIgnoreCase(s3));
}
}
2.练习1
已知用户名和密码,请用程序实现模拟用户登录,总共给三次机会,登录成功与否,给出相应的提示
步骤:
1.先定义两个字符串,表示注册过的用户名和密码
2.创建Scanner对象,键盘录入用户名和密码
3.比较,如果输入的用户名和密码跟已经注册过的用户名和密码一样,就登录成功,否则就登录失败
java
package xyf0211_Stringmethod_a;
import java.util.Scanner;
public class Demo02String {
public static void main(String[] args) {
//1.先定义两个字符串,表示注册过的用户名和密码
String username="root";
String password="123";
//2.创建Scanner对象,键盘录入用户名和密码
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请您输入用户名:");
String name=sc.next();
System.out.println("请您输入密码:");
String pwd=sc.next();
//3.比较,如果输入的用户名和密码跟已经注册过的用户名和密码一样,就登录成功,否则就登录失败
if(name.equals(username)&&pwd.equals(password)){
System.out.println("登录成功");
}if(i==2){
System.out.println("账号冻结");
}else{
System.out.println("登录失败");
}
}
}
}
防空方法:
java
package xyf0211_Stringmethod_a;
import java.util.Objects;
public class Demo03String {
public static void main(String[] args) {
//String s="abc"
String s=null;
method(s);
String s1="abc";
String s2="abc";
method01(s1,s2);
}
/*
工具类:Object
方法:判断两个对象是否相等->自带防空指针作用
public static boolean equals(object a,Object b){
return(a==b)||(a!=null&&a.equals(b));
}
*/
private static void method01(String s1,String s2){
if(Objects.equals(s1,s2)){
System.out.println("是abc");
}else{
System.out.println("不是abc");
}
}
/*
如果传递过来的对象是null,再去点其他方法,就会空指针
解决:不要让一个字符串变量去点,用确定的字符串去点,可以防空
*/
private static void method(String s){
/* if(s.equals("abc")){
System.out.println("是abc");
}else{
System.out.println("不是abc");
}
*/
if("abc".equals(s)){
System.out.println("是abc");
}else{
System.out.println("不是abc");
}
}
}
3.获取方法:
1.int length()->获取字符串长度
System.out.println(s1.length());
2.String concat(String s)->字符串拼接,返回新串儿
System.out.println(s1.concat("haha"));
3.char charAt(int index)->根据索引获取对应的字符
System.out.println(s1.charAt(0));
4.int indexOf(String s)->获取指定字符串在大字符串中第一次出现的索引位置
System.out.println(s1.indexOf("a"));
5.String subString(int beginIndex)->截取字符串,从指定索引开始截取到最后,返回新串儿
System.out.println(s1.substring(3));
6.String subString(int beginIndex,int endIndex)->截取字符串,从beginIndex开始到endIndex结束,含头不含尾,返回新串儿
System.out.println(s1.substring(1,6))
java
package xyf0211_Stringmethod_a;
public class Demo04String {
public static void main(String[] args) {
String s1="abcdefg";
// int length()->获取字符串长度
System.out.println(s1.length());
// String concat(String s)->字符串拼接,返回新串儿
System.out.println(s1.concat("haha"));
// char charAt(int index)->根据索引获取对应的字符
System.out.println(s1.charAt(0));
// int indexOf(String s)->获取指定字符串在大字符串中第一次出现的索引位置
System.out.println(s1.indexOf("a"));
// String subString(int beginIndex)->截取字符串,从指定索引开始截取到最后,返回新串儿
System.out.println(s1.substring(3));
// String subString(int beginIndex,int endIndex)->截取字符串,从beginIndex开始到endIndex结束,
// 含头不含尾,返回新串儿
System.out.println(s1.substring(1,6));
}
}
4.转换功能
1.char[] toCharArray()->将字符串转成char数组
2.byte[] getBytes()->将字符串转成byte数组
3.String replace(CharSequence c1,CharSequence c2)->替换字符 CharSequence->String的接口
4.byte[] getBytes(String charsetName)->按照指定的编码将字符串转成byte数组
java
package xyf0213_Stringmethod_b;
import java.io.UnsupportedEncodingException;
public class Demo05String {
public static void main(String[] args) throws UnsupportedEncodingException {
String s="abcdefg";
//1.char[] toCharArray()->将字符串转成char数组
char[] chars=s.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
System.out.println("======================");
//2.byte[] getBytes()->将字符串转成byte数组
byte[] bytes=s.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
System.out.println("======================");
//3.String replace(CharSequence c1,CharSequence c2)->替换字符 CharSequence->String的接口
System.out.println(s.replace("a","z"));
System.out.println("======================");
//4.byte[] getBytes(String charsetName)->按照指定的编码将字符串转成byte数组
byte[] bytes1 = "你好".getBytes("utf-8");//utf-8一个中文站仨字节,GBK一个中文占俩字节
for (int i = 0; i < bytes1.length; i++) {
System.out.println(bytes1[i]);
}
}
}
5.练习2:
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其它字符)
步骤:
1.创建Scanner对象,键盘录入
2.定义三个变量,用来统计
3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
4.统计大写字母:
A-Z -> 65-90
比如:B->66->在65-90之间,证明就是大写字母
5.统计小写字母:
比如:b->98->在97-122之间,证明就是小写字母
6.统计数字:
0-9 ->48-57
比如:字符1-49 ->在48-57之间,证明就是数字
7.将统计结果打印出来
java
package xyf0213_Stringmethod_b;
import java.util.Scanner;
public class Demo06String {
public static void main(String[] args) {
//1.创建Scanner对象,键盘录入
Scanner sc= new Scanner(System.in);
//2.定义三个变量,用来统计
int big=0;
int small=0;
int number=0;
//3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
String data=sc.next();
char[] chars=data.toCharArray();
for (int i = 0; i < chars.length; i++) {
char num=chars[i];
//4.统计大写字母:
//A-Z -> 65-90
//比如:B->66->在65-90之间,证明就是大写字母
if(num>='A'&&num<='Z'){
big++;
}
//5.统计小写字母:
//0-9 ->48-57
//如:b->98->在97-122之间,证明就是小写字母
if(num>='a'&&num<='z'){
small++;
}
//6.统计数字:
//0-9 ->48-57
//比如:字符1-49 ->在48-57之间,证明就是数字
if(num>='0'&&num<='9'){
number++;
}
}
//7.将统计结果打印出来
System.out.println("大写有"+big+"个");
System.out.println("小写有"+small+"个");
System.out.println("数字有"+number+"个");
}
}
6.分割功能:
1.String[ ] split(String regex)->按照指定的规则分割字符串
注意:regex写的是正则表达式->在正则表达式中代表任意一个字符
java
package xyf0213_Stringmethod_b;
public class Demo07String {
public static void main(String[] args) {
String s="abc,txt";
String[] split = s.split(",");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
System.out.println("================");
String s2="hahaha.hehe";
String[] split1 = s2.split("\\.");
for (int i = 0; i < split1.length; i++) {
System.out.println(split1[i]);
}
}
}
第三章.其他方法
1.boolean contain(String s)->判断老串中是否包含指定的串
2.boolean endsWith(String s)->判断老串是否以指定的串结尾
3.boolean startsWith(String s)->判断老串是否以指定的串开头
4.String toLowerCase( )->将字母转成小写
5.String toUpperCase( )->将字母转成大写
6.String trim( )->去掉字符串两端空格
java
package xyf0213_Stringmethod_b;
public class Demo08String {
public static void main(String[] args) {
String s="abcdefg";
// 1.boolean contain(String s)->判断老串中是否包含指定的串
System.out.println(s.contains("a"));
// 2.boolean endsWith(String s)->判断老串是否以指定的串结尾
System.out.println(s.endsWith("g"));
// 3.boolean startsWith(String s)->判断老串是否以指定的串开头
System.out.println(s.startsWith("a"));
// 4.String toLowerCase( )->将字母转成小写
System.out.println("ABCDefg".toLowerCase());
// 5.String toUpperCase( )->将字母转成大写
System.out.println("bayaDaGE".toUpperCase());
// 6.String trim( )->去掉字符串两端空格
System.out.println(" aaa aaa aaa ".trim());
System.out.println("============================");
//如果想去掉所有空格呢
System.out.println(" aaa aaa aaa ".replace(" ",""));
}
}
第四章.StringBuilder类
1.StringBuilder的介绍
1.概述:一个可变的字符序列,此类提供了一个与StringBuffer兼容的一套API,但是StringBuilder不表示同步(这意味着线程不安全,效率高)
(说白了就是属性和功能都一样)
2.作用:主要是字符串拼接
3.问题:
a.刚讲完的String就有拼接的作用,直接用+即可,那为啥还要用StringBuilder呢?
b.原因:
String每拼接一次,就会产生新的字符对象,就会在堆内存中开辟新的空间,如果拼接次数多了,就会占用内存,效率比较低
StringBuilder,底层自带一个缓冲区(没有被final修饰的byte数组)拼接字符串之后都会在此缓冲区保存,在拼接的过程中,不会随意产生新对象,节省内存
4.StringBuilder特点:
a.底层地带缓冲区,此缓冲区是没有被final修饰的byte数组,默认长度为16
b.如果超出了数组长度,数组会自动扩容
创建一个新长度的型数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
c.默认每次扩容老数组的2倍+2
如果一次性添加的数据超出了默认的扩容长度(2倍+2),比如说存了36个字符,超出了第一次扩容的34,就按照实际的数据为准,在这里就是以36为扩容长度
2.StringBuilder的使用
1.构造:
StringBuilder( )
StringBuilder(String str)
java
package xyf0213_Stringmethod_b;
public class Demo01StringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb);
StringBuilder sb1 = new StringBuilder("abc");
System.out.println(sb1);
}
}
常用:
StringBuilder append(任意类型数据)->字符串拼接,返回的是StringBuilder自己
StringBuilder reverse( )->字符串翻转,返回的是StringBuilder自己
String toString( )->将StringBuilder转成String->用StringBuilder拼接字符串是为了效率,为了不占内存,那么拼接完之后我们后续可能会对拼接好的字符串进行处理,就需要调用String中的方法,所以需要将StringBuilder转成String
java
package xyf0213_Stringmethod_b;
public class Demo02StringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = sb.append("张无忌");
System.out.println(sb1);
System.out.println(sb);
System.out.println(sb==sb1);
System.out.println("================");
//链式调用,在某一个调用的基础上调用
sb.append("赵敏").append("周芷若").append("小昭");
System.out.println(sb);
System.out.println("================");
sb.reverse();
System.out.println(sb);
System.out.println("================");
String s = sb.toString();
System.out.println(s);
}
}
练习:
键盘录入一个字符串,判断此字符串是否为"回文内容"
比如:abcba,上海自来水来自海上(正反念都以一样)
java
package xyf0213_Stringmethod_b;
import java.util.Scanner;
public class Demo03StringBuilder {
public static void main(String[] args) {
//1.创建Scanner对象
Scanner sc = new Scanner(System.in);
String data=sc.next();
//2.创建StringBuilder对象
StringBuilder sb = new StringBuilder(data);
//3.翻转
sb.reverse();
//4.将StringBuilder转成String
String s=sb.toString();
if(data.equals(s)){
System.out.println("是回文内容");
}else{
System.out.println("不是回文内容");
}
}
}

java
package xyf0213_Stringmethod_b;
import javax.crypto.spec.PSource;
public class Demo04StringBuilder {
public static void main(String[] args) {
//1.创建一个数组
String[] arr={"妈妈","爸爸","姐姐","妹妹"};
//2.创建StringBuilder对象
StringBuilder sb = new StringBuilder();
//3.先拼接左括号
sb.append("[");
//4.循环遍历数组,拼接元素
for (int i = 0; i < arr.length; i++) {
//拼接当前元素
sb.append(arr[i]);
if(i!=arr.length-1){
sb.append(",");
}
}
//5.拼接右括号
sb.append("]");
//6.把StringBuilder转成字符串并输出
System.out.println(sb);//System.out.println(sb.toString());
}
}

模块十四总结:


