今日内容
- API概述与Object类的功能介绍
- String类的功能介绍
- StringBuilder类的功能介绍
01. API的概述和使用步骤
- 1. 什么是API?
- 2. 如何使用API?
总结:
1: Application Parmgring Interface (应用程序编程接口)
大白话: 其实就是学习java已经写好的类, 这些类中的功能
2:
A:打开帮助文档
B:点击显示,找到索引,看到输入框
C:你要学习什么内容,你就在框框里面输入什么内容
举例:Random
D:看包
java.lang包下的类在使用的时候是不需要导包的
E:看类的描述
Random类是用于生成随机数的类
F:看构造方法
Random():无参构造方法
Random r = new Random();
G:看成员方法
public int nextInt(int n):产生的是一个[0,n)范围内的随机数
调用方法:
看返回值类型:人家返回什么类型,你就用什么类型接收
看方法名:名字不要写错了
看形式参数:人家要几个参数,你就给几个,人家要什么数据类型的,你就给什么数据类型的
int number = r.nextInt(100);
02. 通过Scanner获取字符串数据
- next方法与nextLine的区别
- nextInt与nextLine的注意事项
总结:
1.
共同点: 都是用于键盘接受字符串.
不同点:
结束标记不一样
next() : 遇到了空格或者是tab键, 就不再录入了
nextLine() : 遇到了回车换行就不再录入了
2.
现象: nextInt与nextLine配合使用的话, nextLine将不会再有键盘录入的机会
原因: 键盘录入了10之后, 实际上在内存中记录的是10\r\n
10被整数变量num所记录了, \r\n被nextLine遇到了, 遇到了结束标记之后, 就结束自己的任务, 所以第二次录入的机会就没有了
System.out.println("请输入一个整数:");
int num = sc.nextInt(); // 10
// \r\n
System.out.println("请输入一个字符串:");
String s = sc.nextLine(); // 回车换行
解决:
今后无论是字符串还是整数, 所有的数据都以nextLine字符串的形式进行接收
如果想要进行数学的四则运算, 可以使用包装类, 将字符串转换为数字
int num = Integer.parseInt("123");
03. Object类的toString()方法
- 什么是Object类?
- Object类中的toString方法返回的是什么?
总结:
1. Object类是所有类父类, 所有的类都直接或者间接的继承到了Object
换句话来说, Object类中的方法, 所有的类都可以进行使用.
2. Object类中的toString方法, 默认返回 -> 全类名@十六进制地址值
默认返回的地址值对我们来说没有意义, 我们希望数据展示的更加方便, 就可以去重写Object类的toString方法
3. toString方法存在的意义:
单独使用Object类默认的toString没有意义, 一般我们会重写Object类的toString方法, 在方法内部输出本对象的属性
为了[让数据展示的更加方便]
练习:
5分钟, 编写标准学生类, 加入toString方法
alt + shift + s + s : 自动生成toString方法
结论:
如果打印一个对象的引用, 结果不是全类名 + 16进制哈希值的话, 说明该对象就重写了toString方法
04. Object类的equals()方法
- equals方法的作用?
- equals方法跟==号的区别?
总结:
1. equals方法是用于对象之间做比较的.
2.
==号可以比较基本数据类型, 也能比较引用数据类型
基本数据类型: 具体的值
引用数据类型: 地址值
equals方法只能比较引用数据类型
细节: 如果直接使用Object类的equals比较, 默认比较的还是地址值
我们需要重写equals方法, 方法内部根据属性进行比较.
代码:
@Override
public boolean equals(Object obj) { // Object obj = p2;
// 错误: Object obj = new Demo2_Equals();
if(obj instanceof Person){
// 为了调用子类特有的属性和行为, 需要向下转型
Person p = (Person) obj;
return this.age == p.age && this.name.equals(p.name);
}else{
return false;
}
}
分析eclipse自动生成的equals方法, 要求能够看得懂. alt + shift + s + h
@Override
public boolean equals(Object obj) {
if (this == obj) // 如果当前对象和传入对象的地址值相同, 直接返回true
return true;
if (obj == null) // 如果传入的对象为null, 那就说明当前对象有值, 传入对象没值, 没有可比性了, 返回false
return false;
if (getClass() != obj.getClass()) // 如果当前对象的字节码和传入对象的字节码不一致, 说明类型不一样, 没有可比性, 返回false
return false;
Person other = (Person) obj; // 向下转型
if (age != other.age) // 年龄不同, 直接返回false
return false;
if (name == null) {
if (other.name != null) // 当前对象的name如果为null, 传入对象的name不是null, 直接返回false
return false;
} else if (!name.equals(other.name)) // 如果姓名不一样, 返回false;
return false;
return true;
}
练习:
5分钟, 编写标准学生类, 加入toString和equals方法
05. String类的概述和构造方法
- 1. 什么是String类? 跟普通的类对比,有什么特殊之处?
- 2. 构造方法
总结:
1: String指的就是字符串, 但是String类比较特殊, 直接写一个双引号, 就相当于是创建了一个对象.
必须掌握的概念: String是一个不可改变的字符序列
// String是一个不可改变的字符序列
String s = "abc";
s = "def"; // 这里是使用新对象的地址值, 去替换了原对象, 原对象中的数据没有发生任何改变.
2:
String(String original):把字符串数据封装成字符串对象
String(char[] value):把字符数组的数据封装成字符串对象
String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象
注意:
String s = "123";
String s = new String("123");
06. String创建对象的特点
- 看图说话
字符串常量池:
每一次使用双引号创建对象的时候, 都会先检查字符串常量池中, 是否有该对象
没有: 创建
有 : 不再创建, 而是直接复用已经存在的
构造方法创建和直接赋值的区别:
String s = new String("123"); // 这一步是创建了两个对象 1. 字符串常量池 2. 堆内存 s变量记录的是堆内存
String s = "123"; // s记录的是字符串常量池
jdk1.8版本之后, 字符串常量池从方法区移动到了堆内存
07. String的练习之模拟用户登录
- 需求: 模拟登录,给三次机会,并提示还有几次
- 分析:
1. 定义两个字符串对象,用于存储(已经存在)的用户名和密码
2. 键盘录入用户名和密码
3. 拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
拿谁比? equals
4. 如果内容相同,提示登录成功
5. 如果内容不同,提示登录失败,并提示还有几次机会
- 7分钟时间实现
08. String的练习之字符串遍历
- 需求: 获取字符串中的每一个字符
第一种遍历方式:
* int length():获取字符串的长度,其实也就是字符个数
* char charAt(int index):获取指定索引处的字符
* // StringIndexOutOfBoundsException --> 字符串索引越界异常
for(int i = 0; i < s.length(); i++){
System.out.println(s.charAt(i));
}
第二种遍历方式:
* char[] toChatArray() : 将字符串拆分成字符数组
char[] cArr = s.toCharArray();
for (int i = 0; i < cArr.length; i++) {
System.out.println(cArr[i]);
}
- 3分钟时间练习
09. String的练习之数组元素拼接成指定格式的字符串
需求: 方法接收一个int类型数组, 将数组中的数字拼接成字符串
- 例如: int[] arr = {1,2,3}; --> [1, 2, 3]
案例演示
10. String的练习之字符串反转
- 需求: 键盘录入abc字符串 输出结果cba
- 分析:
A:键盘录入一个字符串
B:写方法实现字符串的反转
a:把字符串倒着遍历,得到的每一个字符拼接成字符串。
// b:把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
C:调用方法
D:输出结果
- 5分钟时间练习
11. StringBuilder的概述以及与String的区别
- 1. 什么是StringBuilder - StringBuffer
- 2. String跟StringBuilder的区别是?
总结:
1. StringBuilder字符串的缓冲区(提高字符串的操作效率)
2. String是一个[不可改变]的字符序列
StringBuilder是一个[可以改变]的字符序列
- 3. StringBuilder怎么样提高效率的?
画图解释
字符串的拼接: 每一次用+号串联的时候, 底层都会重新创建一个StringBuilder, 然后再通过append方法完成链接, 最后通过toString方法转换成字符串
---这个步骤, 是每一次相加都会进行的步骤--- 所以说非常消耗内存
StringBuilder的拼接: 单独在堆内存中创建一块空间, 所有的数据拼接, 都在这一块空间内进行.
如果想转成字符串, 可以在拼接结束后, 手动调用toString方法进行转换.
12. StringBuilder的构造方法
A:构造方法: StringBuilder() : 创建字符串缓冲区, 缓冲区中没有数据 StringBuilder(String str) : 创建字符串缓冲区, 缓冲区中最开始带有传入的字符串
B:成员方法: public int length():返回长度(已经存储的字符个数)
13. StringBuilder的添加和反转方法
- public StringBuilder append(任意类型):添加数据,并返回自身对象
* StringBuilder是一个可以改变的字符序列
// 链式编程 : 当一个方法返回的是一个对象, 对象就可以继续向下调用方法
sb.append("123").append("456").append("789");
- public StringBuilder reverse():反转功能
14. StringBuilder和String的相互转换
- StringBuilder -- String
- public String toString():通过toString()就可以实现把StringBuilder转成String
StringBuilder sb = new StringBuilder();
sb.append("itheima");
String str = sb.toString();
- String -- StringBuilder
- StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder
StringBuilder sb = new StringBuilder("123");
15. StringBuilder的练习之数组元素拼接成指定格式的字符串
需求: int[] arr = {1, 2, 3} --> [1, 2, 3]
- StringBuilder实现
5分钟练习
16. StringBuilder的练习之字符串反转
- 需求: 键盘录入一个字符串将内容反转
- 5分钟练习
17. StringBuilder和StringBuffer的区别
- 1. StringBuilder是jdk1.5版本的, StringBuffer是jdk1.0版本的
- 2. StringBuilder是线程不安全的, StringBuffer是线程安全的.
线程安全(线程同步):
效率低
线程不安全(线程不同步):
效率高