@toc
1. Object类
1.1 概述
Object类是所有类的父类, 所有的类都直接或者间接继承自Object类.
Object类: 是所有类的基类,或者说公共父类,每个类都直接或者间接的继承自Object,所以该类中有的方法,其他类中都有
1.2 构造方法
public Object() //Object类中只有一个空参构造.
所有类的构造方法中都会默认调用super() 会逐级调用直到调用到Object类为止.
1.3 成员方法:
public String toString(); 将对象转换为字符串时调用,可以打印指定内容,类似于Python中的__str__()
public boolean equals(Object obj); 对比两个对象的大小
注意:在开发中一般使用 == 比较是否为同一地址
会使用equals 比较两个对象是否为同一内容
例如: 在开发中 new Person("小红", 12); 与 new Person("小兰", 15); 不是同一对象
但是.在开发中 new Person("小红", 12); 与 new Person("小红", 12); 是同一对象
2. String类
2.1 概述
String代表字符串类, 即: 由多个字符组成的一串数据. 字符串的本质就是一个字符数组.
2.2 构造方法
//1.构造方法
// String name = new String(); // 此处为空字符串
char[] arrChar = {'a', 'b', 'c'};
String str1 = new String(arrChar);
System.out.println(str1);
String name = "jack"; // 字符串定义的语法糖
System.out.println(name);
- toString
- equals
- equalsIgnoreCase
- charAt
- toCharArray
public static void main(String[] args) {
String str1 = "abc";
char[] arrChar = {'a', 'b', 'c'};
String str2 = new String(arrChar);
System.out.println(str1);
System.out.println(str2);
// equals: 比较两个字符串是否相等
System.out.println(str1 == str2); // false 两个内容相同的字符串对象,地址不一定相同
System.out.println(str1.equals(str2)); // true equals 比较的是两个字符串中的内容是否相同,所以Strign中一定重写了equals
// equalsIgnoreCase: 比较两个字符串是否相等,忽略大小写
String str3 = "aBc";
System.out.println(str1.equals(str3)); // false
System.out.println(str1.equalsIgnoreCase(str3)); // true 对比内容的时候忽略大小写
// charAt: 可以获取指定位置的字符
// 获取元素时,索引值从0开始,左至右依次递增.
char char1 = str3.charAt(1);
System.out.println(char1); // B
// 能不能使用索引[]直接从字符串中取值???
// System.out.println(str3[1]);
// toCharArray: 将字符串拆解为字符数组
char[] chars = str2.toCharArray();
System.out.println("chars = " + Arrays.toString(chars));
//探索: 在Python中常用的一些替换 拆分 等等功能在java存在么??
String str4 = "hello world and java";
// 字符串替换
str4 = str4.replace("java", "bigdata");
System.out.println(str4);
// 根据分隔符拆分字符串
String[] s1 = str4.split(" ");
System.out.println(Arrays.toString(s1)); // [hello, world, and, bigdata]
// toUpperCase将字符串准换为大写, toLowerCase 将字符串全部转换为小写
String s2 = str4.toUpperCase();
System.out.println(s2);
//面试题: 获取字符串的长度怎么做?
System.out.println(str4.length());
// 获取数组的长度,怎么做??
System.out.println(chars.length);
// 结论: 获取字符串长度,使用的是length方法, 获取数组长度使用的是length属性
}
2.3 String案例
2.3.1 模拟用户登录
public static void main(String[] args) {
// 1. 定义两个变量,分别保存账号和密码信息
String userName = "chad_chang";
String passWord = "123456";
// 6. 循环三次,每次获取循环的次数
// 由于我们是循环指定的次数,所以此时我们选择for循环
for (int i = 1; i <= 3; i++) {
// 2. 让用户键入账号密码信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的账号:");
String inputUserName = sc.nextLine();
System.out.println("请输入您的密码:");
String inputPassWord = sc.nextLine();
// 3. 比对账号密码是否正确
// 判断的是地址相同,这里的需求时判断数值是否相同,所以应该选择equals进行相等判断
// if (userName == inputUserName && passWord == inputPassWord) {
if (userName.equals(inputUserName) && passWord.equals(inputPassWord)) {
// 4. 如果正确 提示 欢迎您
System.out.println("您登录成功了!!!");
// 如果输入账号密码正确,则跳出循环结束程序
break;
} else {
// 5. 如果不正确 提示剩余次数(3-循环次数)
System.out.println("输入错误,您还有" + (3 - i) + "次机会");
if (3 - i == 0) {
// 7. 如果剩余循环次数为0 , 则提示您的账号已经被锁定
System.out.println("您已经三次输入错误,账号已经被锁定");
}
}
}
}
2.3.2 统计字符次数
public static void main(String[] args) {
// 键盘录入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入随机的一个字符串:");
String nextLine = sc.nextLine();
// 可以更具ascii码的大小判断字符的类型
// char a = 98;
// System.out.println(a);
//创建几个变量分别记录数字,大写字母,小写字母的数量
int upperCharCount = 0;
int lowerCharCount = 0;
int numberCount = 0;
// 遍历字符串(获取字符串中的每一个字符)
for (int i = 0; i < nextLine.length(); i++) {
char c1 = nextLine.charAt(i);
// 根据数值的范围统计该类型字符出现的次数
if (c1 >= 'a' && c1 <= 'z') {
lowerCharCount++;
} else if (c1 >= 'A' && c1 <= 'Z') {
upperCharCount++;
} else if (c1 >= '0' && c1 <= '9') {
numberCount++;
}
}
System.out.println("大写字母有:" + upperCharCount);
System.out.println("小写字母有:" + lowerCharCount);
System.out.println("数字字符有:" + numberCount);
}
2.3.3 字符串反转
public static void main(String[] args) {
// 1.获取用户键入的字符串信息
Scanner sc = new Scanner(System.in);
System.out.println("请输入随机的一个字符串:");
String nextLine = sc.nextLine();
// 快速抽取方法的快捷键:ctrl + alt + m
reverse(nextLine);
// 思考:在python中直接使用reverse可以进行字符串反转,在java中有没有类似的方法呢??
}
private static void reverse(String nextLine) {
//2.创建一个新的字符串用于保存反转后的结果
String newString = "";
// 遍历字符串(获取字符串中的每一个字符)
for (int i = 0; i < nextLine.length(); i++) {
// 获取每一次遍历得到的字符信息
char c1 = nextLine.charAt(i);
newString = c1 + newString;
}
System.out.println(newString);
}
3. StringBuilder类
分析如下代码, 执行效率是高还是低呢?
String s = "hello";
s += "world";
System.out.println(s);
解释:
如果字符串进行拼接操作, 每次拼接, 都会构建一个新的String对象, 即耗时, 又浪费内存空间. 而这种操作还不可避免,.那有没有一种比较好的方式来解决这个问题呢?
答案是肯定的, 我们可以通过Java提供的StringBuilder类来解决这个问题.
3.1 概述
StringBuilder类在java.lang包下, 无需导包, 可以直接使用.
StringBuilder是一个可变的字符序列, 也叫字符串缓冲区类.
我们可以把它看做一个容器, 这里的可变指的是StringBuilder对象中的内容是可变的
String和StringBuilder之间的区别
String: 内容是不可变的.
StringBuilder: 内容是可变的.
3.2 构造方法
public StringBuilder()
解释: 创建一个空白可变字符串对象, 它不含有任何内容.
public StringBuilder(String str)
解释: 根据字符串的内容, 来创建可变字符串对象.
- append
- reverse
- toString
public class Demo01 {
public static void main(String[] args) {
//StringBuilder对象的定义:
StringBuilder sb1 = new StringBuilder();// 此时为空字符串
System.out.println(sb1);
StringBuilder sb2 = new StringBuilder("hello world!!!");
StringBuilder sb3 = new StringBuilder("hello world!!!");
// 执行打印方法时,自动调用了toString();
// 此时证明StringBuilder类中重写了toString 方法,输出的是StringBuilder中保存的字符串信息
System.out.println(sb2); // hello world!!!
String string = sb2.toString();
// append 给sb1添加字符信息
// append 方法返回值就是当前的StringBuilder对象本身
sb1.append(123);
sb1.append("你好");
// append 可以反复添加数据
System.out.println(sb1);
// 可以使用链式编程的方式进行调用
sb1.append(123).append(456).append(678);
System.out.println(sb1);
// reverse 反转字符串
// 在原有数据上进行了反转,产生新的数据
// sb2.reverse();
// System.out.println(sb2);
// 拓展:
// StringBuilder 中的equals没有重写, 还是去对比的两个对象的地址值是否相等
System.out.println(sb2.equals(sb3)); // false
}