API(回顾)
简单介绍: Java写好的技术(功能代码),可以直接调用。
Java提供了许多API给我们使用,这里截取两个重要的类的API进行学习:String、ArrayList。
Srting
简单介绍: String类定义的变量可以存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用。
学习目标
概述:
- java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,让后操作该字符串。
- Java程序中的所有字符串文字都为此类的对象。
特点: String常被称为不可变字符串类型,它的对象创建后不可改变。
public class StringDemo {
public static void main(String[] args) {
String name = "计算机";
name += "与信息工程";
name += "学院";
System.out.println(name);
}
}
我们看上面的例子,这段代码的运行结果是:计算机与信息工程学院
,name指向的是字符串对象,那为啥说字符串不可变呢?这需要从内存原理来看:
以""方式给出的字符串对象,在字符串常量池中存储。“计算机”,“与信息工程”,"学院"都是存储在字符串常量池中,"计算机"和"与信息工程"运算连接成了一个新对象,存储在堆内存中,然后通过改变name中的地址值使其指向新的对象。此时,"计算机"和"与信息工程"并没有改变。
创建对象的2种方法
- 直接使用""定义(推荐)
String name = "abc";
- 通过String类的构造器创建对象
传入字节数组的时候,会依据ASCII码将数字转换为字符存储。
区别(面试常考)
- 以·”“方式给出的字符串对象,在字符串常量池中存储,并且相同内容只会在其中存储一份。
- 通过构造器new对象,每new一次都会产生一个新对象,存储在堆内存中。
Java存在编译优化机制,在编译的时候
"a"+"b"+"c"
会直接转化为"abc"
常用API
字符串内容比较(equals)
public class StringDemo {
public static void main(String[] args) {
//正确账号密码
String okPassword = "135790";
//输入密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入密码:");
String password = sc.next();
//判断是否正确
if(okPassword ==password){
System.out.println("登录成功!");
}else{
System.out.println("密码错误!");
}
}
}
这里比较的是两者的地址,但是前者存储在字符串常量池中,后者存储在堆内存中,两者地址不同,无法用"=="比较。
"=="可用于基本类型比较
但是String中提供了一种API用于比较内容:equals
忽略大小写可以用于作为验证码验证系统
故将代码中第10行if中的条件改为:okPassword.equals(name)
即可成功比较。
其余常用API
ArrayList
简单介绍: ArrayList代表集合类,集合是一种容器,与数组相似,不同的是集合的大小是不固定的。
学习目标
数组与集合的区别
- 数组在定义完成并启动后,类型确定、长度固定,在个数不确定、需要增减个数的时候不适合使用数组。
- 集合的大小不固定、类型不固定、可以动态变化,集合提供了许多的好用的功能。
ArrayList集合的对象获取&添加元素
对象获取: ArrayList();
两种添加元素的方法:
泛型
定义:可以在编译阶段约束集合对象只能操作某种数据类型的集合
格式:ArrayList<E>
如果在约束了某种特定的数据类型后仍向里添加其他类型的数据,会报错:java: 不兼容的类型
注意:
- 集合中只能存储引用类型,不支持基本数据类型
- JDK1.7开始,泛型后面的类型申明可以不写
常用API
注意:
- E指的是任意一种引用数据类型
- 在删除元素的时候,只会删除出现的第一个。
每日一练:学生信息系统的数据搜索
需求: 后台程序需要存储如上学生信息并展示,然后要提供依据学号搜索学生信息的功能。
:::
分析:
- 定义一个学生类,定义ArrayList类去存储如上学生信息,同时实现遍历展示
- 提供方法,可以接收ArrayList类和学号,返回学生信息并展示
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListDemo {
public static void main(String[] args) {
//定义一个学生类并录入信息
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(20180302,"叶孤城",23,"护理一班"));
students.add(new Student(20180303,"东方不败",23,"推拿二班"));
students.add(new Student(20180304,"西门吹雪",26,"中药学三班"));
students.add(new Student(20180305,"梅超风",25,"神经科四班"));
//遍历展示学生信息
System.out.println("=====================================");
System.out.println("学号\t\t\t姓名\t\t年龄\t\t班级\t\t");
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t\t"+s.getClasses());
}
System.out.println("=====================================");
//提供查找方法
while(true){
System.out.print("请输入您想搜索学生的学号:");
Scanner sc = new Scanner(System.in);
long getId = sc.nextLong();
Student get = getStudnt(students,getId);
if(get == null){
System.out.println("您输入的学号有误或不存在,请您重新输入!");
System.out.print("您是否想继续搜索?(Y or N):");
String answer = sc.next();
if(answer.charAt(0) == 'N'){
break;
}
}else{
System.out.println("您搜索的学生信息如下:");
System.out.println("=====================================");
System.out.println("学号\t\t\t姓名\t\t年龄\t\t班级\t\t");
System.out.println(get.getId()+"\t"+get.getName()+"\t"+get.getAge()+"\t\t"+get.getClasses());
System.out.println("=====================================");
System.out.print("您是否想继续搜索?(Y or N):");
String answer = sc.next();
if(answer.charAt(0) == 'N'){
break;
}
}
}
}
private static Student getStudnt(ArrayList<Student> students, long getId) {
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
if(getId == s.getId()) {
return s;
}
}
return null;
}
}