2022-7-20-第八组-曹雨面向对象-字符串
String 字符串:
String字符串是一个类
类当中可以有属性,方法,构造器。
String一旦声明,不可以改变。(对于基本数据类型,比如int来说,如果你新赋一个值,他会把原来的值,给“干掉”;对于String来说,在内存级别中,你定义了一个String类型的值,它会一直在内存中)
字符串也有长度,也有下标
s1就是String中的一个对象
publlic static void main(String[] args){
String s1 = "abcdefg";
}
还有第二种写法
创建这个对象调用了一个构造器:
String s2 = new String("abcdefg");
这两种方式虽然都是定义一个字符串,但是并不是一回事:
如果使用了第二种写法,因为有“new”所以它会在堆内存中新开辟一块区域。在栈内存中存s2,通过地址s2在栈内存中找到"abcdefg"的值。
如果使用了第一种写法,s1在栈内存中,但是abcdefg不在存在堆内存中。
我们可以进行验证
System.out.println(s1==s2)
双等号比较的是虚地址,虚地址是对象在内存中的存储位置,而两者不在一个地址内,所以会输出false;
得到的值是:false
小规律:
=赋值,无论怎么比较,都是true
new赋值,用双等号比较,就是false
String字符串的比较:
除了
String a = 1;
String b = 1;
System.out.println(a==b)
这样以外,其他所有方法,都会因为地址不相同,所以都会输出false。
equals方法
1.需要传参,传String类型的参数
2.返回值是boolean类型
3.访问权限public
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串1:");
String s3 = sc.next();
System.out.println("请输入字符串2:");
String s4 = sc.next();
System.out.println(s3.equals(s4));
equals比较的是两个字符串的“值”。不是地址。
length方法:
1.不需要传参
2.有返回值,整型int
3.访问权限public
字符串获取长度的方法和数组获取长度有什么区别?
答:数组的length是属性,字符串的length()是方法
public static void main(String[] args) {
String s1 = "abcdefg";
System.out.println(s1.length());
两者没有任何关系。
int [] arr = new int[10];
System.out.println(arr.length);
}
}
字符串的下标:
ublic static void main(String[] args) {
String s1 = "abcdefg";
// 取出指定下标位置的字符
System.out.println(**s1.charAt(0**));
Scanner sc = new Scanner(System.in);
char c = sc.next().charAt(0);
System.out.println(c + 1);
}
}
得出结果是:a s1的0下标元素。
输入一个char类型(实质是取你输入元素的第一位)
char c = sc.next().charAt(0);
判断字符串是否存在indexOf
public static void main(String[] args) {
String s1 = "abcde";
s1.indexOf('a');
System.out.println(s1.lastIndexOf("a",12));
}
小案例:统计一个字符串在另一个字符串中出现的次数!!!
public int sum(String target,String str) {
int count = 0;
int i = 0;
while(i < str.length()) {
int i1 = str.indexOf(target,i);
if(i1 != -1){
count++;
i = i1 + 1;
} else {
i++;
}
}
return count;
}
public static void main(String[] args) {
Ch05_Demo c = new Ch05_Demo();
System.out.println(c.sum("b", "abcdefgabcdaaa"));
字符串的截取
public static void main(String[] args) {
// 字符串的截取
String str = "abcdefghijklmn";
/*
如果传一个参数,从指定位置开始截取,直到字符串的末尾
考虑一下?
包不包括1位置的字符,包括起始位置的字符
生成一个新的字符串,不会改变原有数据
*/
String s = str.substring(1);
// bc or b
// 包含起始位置,不包含终止位置
s = str.substring(1,2);
System.out.println(s);
}
字符串的替换
public class Ch01 {
public static void main(String[] args) {
// 字符串的替换
String str = "hello";
System.out.println(str.replace('e', 'c'));
shuchu
System.out.println(str.replaceAll("l", "i"));
}
字符串和数组的转换
public static void main(String[] args) {
// 字符串的替换
String str = "hello";
System.out.println(str.replace('e', 'c'));
System.out.println(str.replaceAll("l", "i"));
}
输出结果:hciio
int转换String:
int i = 10;
String s = i+"": //任何数据类型和字符串类型做加法,结果都是字符串,阿里规约中不允许
// 把int类型转成字符串(推荐)
//方法一:
String s = String.valueOf(i);
转成字节型数组:
byte[] bytes = str.getBytes();
for (byte b : bytes) {
System.out.println(b);
}
包装器
八种基本数据类型:
byte,short,int,long,float,double,chat,boolean
基本数据类型没有什么功能,不像类。
想要他们有功能就要把他们对应,八个类(把他们首字母大写)
Byte,Short,Integer,Long,Float,Double,Character,Boolean
总结
今天学习了一些关于字符串,与基本数据类型的知识,还算简单。目前主要的任务依旧是在老师昨天布置的任务上下功夫,提出问题:既然定义了private,为什么还要有set方法与get方法去改变这个属性的值?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)