一、API的概述和使用步骤
1. 什么是API?Application Programming Interface ( 应用程序编程接口)
大白话: API指的就是java给我们写好的类.
2. 如何使用API?
A: 打开帮助文档
B: 点击显示,找到索引,看到输入框
C: 你要学习什么内容,你就在框框里面输入什么内容
举例:Random
D: 看包
java.lang 包下的类在使用的时候是不需要导包的
E: 看类的描述
Random 类是用于生成随机数的类
F: 看构造方法
Random(): 无参构造方法
Randomr = new Random();
G: 看成员方法
publicint nextInt(int n): 产生的是一个[0,n)范围内的随机数
调用方法:
看返回值类型:人家返回什么类型,你就用什么类型接收
看方法名:名字不要写错了
看形式参数:人家要几个参数,你就给几个,人家要什么数据类型的,你就给什么数据类型的
intnumber = r.nextInt(100);
二、通过Scanner获取字符串数据
next方法与nextLine的区别next和nextLine方法都是用于接收键盘录入的字符串
next(): 遇到空格或者tab键就不再录入了
nextLine():遇到了回车换行就不再录入了.
nextInt与nextLine的注意事项
当nextInt和nextLine方法配合使用的时候, nextLine将没有机会再接收键盘录入的数据了
intnum = sc.nextInt(); 10\r\n
10 被num记录下来了
Strings1 = sc.nextLine(); \r\n 被nextLine遇到了.
解决:
以后无论是整数还是字符串, 都用nextLine进行接收
然后将传入的整数字符串通过Integer.parseInt();进行转换
Integer.parseInt(Stringnum) : 将传入的数字字符串转换为整数, 如果是非数字字符串, 报错!
Integer.parseInt("abc");
运行: NumberFormatException
三、Object类的toString()方法
什么是Object类?1. 所有的类都直接或者间接的继承到了Object
Object类种的toString方法返回的是什么?
如果没有重写的话, 那么打印的结果将是:
对象的全类名 + @ + 对象的十六进制哈希值.
问题: toString方法的作用
一般会重写toString方法, 在方法中返回对象的属性值.
--> 实际开发过程中往往用于调试程序.
练习:
5 分钟, 编写标准学生类, 加入toString方法
alt + shift + s + v : 查看可以重写的方法
alt+ shift + s + s : 自动生成toString方法
public class Student {
private String name;
private int age;
@Override
public String toString() {
return name+"---"+age;
}
/*//第一种,alt+shift+s +s 由系统重写
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
}
结论: 如果打印一个对象的引用, 结果不是全类名 + 16进制哈希值的话, 说明该对象就重写了toString方法
四、Object类的equals()方法
equals方法的作用?1. 用于对象之间的比较.
equals方法跟==号的区别?
== 号可以比较基本数据类型, 也能比较引用数据类型
比较基本数据类型的时候, 比较的是值.
比较引用数据类型的时候, 比较的是地址值
equals 方法只能比较引用数据类型
为什么? 只有对象才能调用方法
在没有重写object中的equals方法的时候, 默认也是用==号比较地址值
这时候如果想要按照自己的意思进行比价, 就需要重写equals方法
@Override
publicboolean equals(Object obj) { // Object obj = newPerson();
if(objinstanceof Person){
//1. 将传入的对象向下转型
Personp = (Person) obj;
//2. 使用姓名和年龄逐个比较
//p1.age == p2.age && p1.name.equals(p2.name)
returnthis.age == p.age && this.name.equals(p.name);
}else{
//3. 如果走了else, 说明传入对象不是Person类型
//不具备可比性, 直接返回false
return false;
}
}
分析eclipse自动生成的equals方法, 要求能够看得懂. alt + shift + s+ h
@Override
publicboolean equals(Object obj) {
if(this ==obj) //如果两个对象指向的是同一个内存空间的. 直接返回true
returntrue;
if(obj ==null) //如果传入对象为null的话, 不具备可比性.
returnfalse;
if(getClass() !=obj.getClass()) // 如果字节码对象不相同, 说明不是用同一个类创建的对象
//不具备可比性. 返回false
returnfalse;
Studentother = (Student)obj; // 如果走到这一步, 说明字节码对象是同一个, 放心强转.
if(age != other.age)
returnfalse; //如果年龄不同, 直接返回false.
if(name == null){
if(other.name != null)
returnfalse; //当前对象的姓名为null, 传入对象的姓名不为null, 直接返回false.
}else if (!name.equals(other.name))
//如果姓名内容不一样, 返回false即可
returnfalse;
returntrue;
}
五、String类的概述和构造方法
什么是String类? 其本质是什么?String 类是一个字符串类
其本质就是一个 字符数组.
String 这个类比较特殊, "abc"这实际上是创建了一个对象
2. 构造方法
String(Stringoriginal): 把字符串数据封装成字符串对象
String(char[]value): 把字符数组的数据封装成字符串对象
String(char[]value, int index, int count): 把字符数组中的一部分数据封装成字符串对象
注意:
Strings ="123"; // 这一步是创建了一个对象
Strings = new String("123"); // 这一步是创建了两个对象
六、String创建对象的特点
字符串常量池(在方法区):Strings1 = "123";
Strings2 = "123";
重点:
当使用(双引号)创建字符串对象的时候, 首先会检查常量池中是否有相同的字符串.
如果没有, 就创建
如果有, 不会重复创建, 而是直接指向到原来的那个字符串.
String: 字符串是一个 不可改变 的字符序列 !
构造方法创建和直接赋值
Strings = new String("123"); // s 指向的地址是? 堆内存
Strings2 ="123"; //s2 指向的是? 常量池
System.out.println(s== s2); //? false
七、String的练习之模拟用户登录
需求: 模拟登录,给三次机会,并提示还有几次分析:
1. 定义两个字符串对象,用于存储(已经存在)的用户名和密码
2. 键盘录入用户名和密码
3. 拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
拿谁比? equals
4. 如果内容相同,提示登录成功
5. 如果内容不同,提示登录失败,并提示还有几次机会
import java.util.Scanner;
public class Test_User {
public static void main(String[] args) {
//模拟数据库中已存在的用户名和密码
String Mun = "admin";
String Mpd = "123456";
Scanner sc = new Scanner(System.in);
//三次机会
for (int i = 1; i <= 3; i++) {
//键盘录入账号密码
System.out.println("请输入账号:");
String un = sc.nextLine();
System.out.println("请输入密码:");
String pd = sc.nextLine();
//判断账号密码是否正确
if (Mun.equals(un) && Mpd.equals(pd)) {
System.out.println("欢迎" + un + "登陆");
break;
} else {
//错误时,判断是否为第三次错误
if (i == 3) {
System.out.println("明天再来");
} else {
System.out.println("登录失败,您还有" + (3 - i) + "次登陆机会");
}
}
}
sc.close();
}
}
八、String的练习之字符串遍历
需求: 获取字符串中的每一个字符第一种遍历方式:
int length(): 获取字符串的长度,其实也就是字符个数
char charAt(int index): 获取指定索引处的字符
// StringIndexOutOfBoundsException --> 字符串索引越界异常
for(inti = 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]);
}
public class Test_String {
public static void main(String[] args) {
Test01();
System.out.println("----------------");
String s = "qwertyuiopasdfghjklzxcvbnm";
//char[] toChatArray() : 将字符串拆分成字符数组
char[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i++) {
System.out.println(cs[i]);
}
}
private static void Test01() {
String s = "zxcvbnmasdfghjklqwertyuiop";
for (int i = 0; i < s.length(); i++) {
//char charAt(int index):获取指定索引处的字符
System.out.println(s.charAt(i));
}
}
}
九、String的练习之数组元素拼接成指定格式的字符串
需求: 方法接收一个int类型数组, 将数组中的数字拼接成字符串* 例如: int[] arr ={1,2,3}; --> [1, 2, 3]
public class Test_Arr {
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
String s = "[";
//遍历整个数组
for (int i = 0; i < arr.length; i++) {
//判断是否为最后一位数组值
if (i == arr.length - 1) {
s += arr[i] + "]";
break;
}
//数组拼接
s += arr[i] + ", ";
}
System.out.println(s);
}
}
十、String的练习之字符串反转
需求: 键盘录入abc字符串 输出结果cba分析:
A: 键盘录入一个字符串
B: 写方法实现字符串的反转
a: 把字符串倒着遍历,得到的每一个字符拼接成字符串。
// b:把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
C:调用方法
D:输出结果
import java.util.Scanner;
public class Test_ResArr {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入 一行字符串:");
String s = sc.nextLine();
System.out.println(ResArr(s));
sc.close();
}
private static String ResArr(String str) {
//将字符串转换为字符数组
char[] cArr = str.toCharArray();
//遍历前半部分字符数组,与后半部分交换值
for (int i = 0; i < cArr.length/2; i++) {
char temp = cArr[i];
cArr[i] = cArr[cArr.length - 1 - i];
cArr[cArr.length - 1 - i] = temp;
}
//将字符数组赋予新的字符串,返回
return new String(cArr);
}
}
十一、StringBuilder的概述以及与String的区别
什么是StringBuilderStringBuilder是字符串的缓冲区, 可以对字符串的操作提高效率(在堆内存)
2. String跟StringBuilder的区别是?
3. StringBuilder怎么样提高效率的?
字符串的拼接: 每一次用+号串联的时候, 底层都会重新创建一个StringBuilder, 然后再通过append方法完成链接, 最后通过toString方法转换成字符串
--- 这个步骤, 是每一次相加都会进行的步骤--- 所以说非常消耗内存
StringBuilder 的拼接: 单独在堆内存中创建一块空间,所有的数据拼接, 都在这一块空间内进行.
如果想转成字符串, 可以在拼接结束后,手动调用toString方法进行转换.
十二、StringBuilder的构造方法
A:构造方法:StringBuilder() : 创建字符串缓冲区, 缓冲区中没有数据
StringBuilder(String str) : 创建字符串缓冲区, 缓冲区中最开始带有传入的字符串
B:成员方法:
public int length(): 返回长度(已经存储的字符个数)
十三、StringBuilder的添加和反转方法
public StringBuilder append(任意类型):添加数据,并 返回自身对象public StringBuilder reverse():反转功能
十四、StringBuilder和String的相互转换
StringBuilder -- Stringpublic String toString():通过toString()就可以实现把StringBuilder转成String
StringBuildersb = new StringBuilder();
sb.append("itheima");
Stringstr = sb.toString();
String -- StringBuilder
StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder
StringBuildersb = new StringBuilder("123");
十五、StringBuilder的练习之数组元素拼接成指定格式的字符串
需求: int[] arr = {1, 2, 3} --> [1, 2, 3]StringBuilder实现
public class Test {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6 };
// 创建字符串缓冲池
StringBuilder sb = new StringBuilder("[");
// 遍历字符数组,用sb.append()方法进行拼接
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]).append("]");
break;
}
sb.append(arr[i]).append(", ");
}
// 转换为字符串,打印输出
System.out.println(sb.toString());
}
}
十六、StringBuilder的练习之字符串反转
需求: 键盘录入一个字符串将内容反转
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一行字符串:");
// 创建字符串缓冲区对象,将键盘录入的字符串通过构造方法转换为StringBuilder对象
StringBuilder sb = new StringBuilder(sc.nextLine());
// 使用sb.reverse()方法对StringBuilder内的字符串进行反转,打印输出
System.out.println(sb.reverse());
sc.close();
}
}
十七、StringBuilder和StringBuffer的区别
1.StringBuilder是jdk1.5版本的,StringBuffer是jdk1.0版本的2. StringBuilder是线程不安全的, StringBuffer是线程安全的.
安全 : 效率低
不安全: 效率高.