API (Application Programming Interface,应用程序编程接口)
⚫ Java写好的技术(功能代码),咱们可以直接调用。
⚫ Oracle 也为Java提供的这些功能代码提供了相应的 API文档(技术使用说明书) 。
下载API文档:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
➢ String
◆ String类概述
◆ String类创建对象的2种方式
◆ String类常见面试题
◆ String类常用API-字符串内容比较
◆ String类常用API-遍历、替换、截取、分割操作
◆ String类案例实战
➢ ArrayList
◆ 集合概述
◆ ArrayList集合快速入门
◆ ArrayList对泛型的支持
◆ ArrayList常用API、遍历
◆ ArrayList集合案例:遍历并删除元素
◆ ArrayList集合案例:存储自定义类型的对象
◆ ArrayList集合案例:元素搜索
String 概述
⚫ java.lang.String 类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
⚫ Java 程序中的所有字符串文字(例如“abc”)都为此类的对象。
String类的特点详解
⚫ String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。
public static void main(String[] args) {
String name = "传智";
name += "教育";
name +="中心";
System.out.println(name);
}
输出结果:传智教育中心
从上述代码可以看出字符串变量name指向的字符串对象,那为何还说字符串不可变呢?
⚫ String变量每次的修改其实都是产生并指向了新的字符串对象。
⚫ 原来的字符串对象都是没有改变的,所以称不可变字符串。
有什么区别吗?(面试常考)
⚫ 以“”方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
⚫ 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true
char[] chs = {'a', 'b', 'c'};
String s3 = new String(chs);
String s4 = new String(chs);
System.out.println(s3 == s4); // false
1、字符串对象的特点有哪些?
⚫ 双引号创建的字符串对象,在字符串常量池中存储同一个。
⚫ 通过new 构造器创建的字符串对象,在堆内存中分开存储。
String常见面试题
⚫ 问题:下列代码的运行结果是?
public class Test2 {
public static void main(String[] args) {
String s2 = new String("abc"); //这句代码实际上创建了两个对象
String s1 = "abc";
System.out.println(s1 == s2); //false
}
}
String常见面试题
public class Test3 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);//false ==引用数据类型比较地址 String是一个类
}
}
public class Test4 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2);//true
}
}
Java存在编译优化机制,程序在编译时: “a” + “b” + “c” 会直接转成 "abc"
public class StringDemoAPI3 {
public static void main(String[] args) {
String sysLoginName = “itheima”;
Scanner sc = new Scanner(System.in);
System.out.println(“请您输入您的登录名称");
String loginName = sc.next();
System.out.println(sysLoginName == loginName);
}
}
结论:字符串的内容比较不适合用“==”比较。
字符串的内容比较:
public boolean equals (Object anObject)
将此字符串与指定对象进行比较。只关心字符内容是否一致!
public boolean equalsIgnoreCase (String anotherString)
将此字符串与指定对象进行比较,忽略大小写比较字符串。只关心字符内容是否一致!
开发中什么时候使用==比较数据
⚫ 基本数据类型比较时使用。
案例
String类开发验证码功能
需求:
⚫ 随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母。
分析:
① 定义一个String类型的变量存储验a-zA-Z0-9之间的全部字符。
② 循环5次,随机一个范围内的索引,获取对应字符连接起来即可。
需求:
⚫ 模拟用户登录功能,最多只给三次机会。
分析:
① 系统后台定义好正确的登录名称,密码。
② 使用循环控制三次,让用户输入正确的登录名和密码,判断是否登录成功,登
录成功则不再进行登录;登录失败给出提示,并让用户继续登录。
手机号码屏蔽
需求
⚫ 键盘录入一个手机号,将中间四位号码屏蔽,最终效果为:158****5689
分析
① 键盘录入一个字符串。
② 调用字符串对象的截取API,截取字符串前三位、后四位。
③ 将前三位 连接“****”然后继续连接后四位,输出最终结果即可。
集合是与数组类似,也是一种容器,用于装数据的。
数组的特点
⚫ 数组定义完成并启动后,类型确定、长度固定。
⚫ 问题:在个数不能确定,且要进行增删数据操作的时候,数组是不太合适的。
集合的特点
⚫ 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
⚫ 集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
⚫ 集合还提供了许多丰富、好用的功能,而数组的功能很单一。
1、数组和集合的元素存储的个数问题?
⚫ 数组定义后类型确定,长度固定
⚫ 集合类型可以不固定,大小是可变的。
2、数组和集合适合的场景
⚫ 数组适合做数据个数和类型确定的场景
⚫ 集合适合做数据个数不确定,且要做增删元素的场景
泛型概述
⚫ ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。
举例:
⚫ ArrayList<String> :此集合只能操作字符串类型的元素。
⚫ ArrayList<Integer>:此集合只能操作整数类型的元素。
注意:集合中只能存储引用类型,不支持基本数据类型。
1、怎么去统一ArrayList集合操作的元素类型?
⚫ 使用泛型:<数据类型>
⚫ ArrayList<String> list1 = new ArrayList();
遍历并删除元素值
需求:
⚫ 某个班级的考试在系统上进行,成绩大致为:98, 77, 66, 89, 79, 50, 100
⚫ 现在需要先把成绩低于80分以下的数据去掉。
分析:
① 定义ArrayList集合存储多名学员的成绩。
② 遍历集合每个元素,如果元素值低于80分,去掉它。
1、 从集合中遍历元素,并筛选出元素删除它,应该怎么解决?
⚫ 从集合后面遍历然后删除,可以避免漏掉元素。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
/* 遍历并删除元素值
需求:
⚫ 某个班级的考试在系统上进行,成绩大致为:98, 77, 66, 89, 79, 50, 100
⚫ 现在需要先把成绩低于80分以下的数据去掉。
分析:
① 定义ArrayList集合存储多名学员的成绩。
② 遍历集合每个元素,如果元素值低于80分,去掉它。
1、 从集合中遍历元素,并筛选出元素删除它,应该怎么解决?
⚫ 从集合后面遍历然后删除,可以避免漏掉元素。*/
ArrayList<Integer> list =new ArrayList();
list.add(98);
list.add(77);
list.add(66);
list.add(89);
list.add(79);
list.add(50);
list.add(100);
for(int i=list.size()-1;i>=0;i--) {
if (list.get(i)<80) {
list.remove(i);
}
}for(int j=0;j<list.size();j++) {
System.out.print(list.get(j)+" ");
}
}
}
影片信息在程序中的表示
需求
⚫ 某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析
① :定义一个电影类,定义一个集合存储电影对象。
② :创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
③ :遍历集合中的3个对象,输出相关信息。
import java.util.ArrayList;
public class SystemDemo {
public static void main(String[] args) {
ArrayList <Movie> movies = new ArrayList<>();
movies.add(new Movie("《肖生克的救赎》", 9.7 , "罗宾斯"));
movies.add(new Movie("《霸王别姬》", 9.6 , "张国荣、张丰毅"));
movies.add(new Movie("《阿甘正传》", 9.5 , "汤姆.汉克斯"));
System.out.println(movies);
for (int i = 0; i < movies.size(); i++ ) {
Movie movie = movies.get(i);
System.out.println("片名:" + movie.getName());
System.out.println("评分:" + movie.getScore());
System.out.println("主演:" + movie.getAcotr());
}
//[Movie@1b6d3586, Movie@4554617c, Movie@74a14482]
片名:《肖生克的救赎》
评分:9.7
主演:罗宾斯
片名:《霸王别姬》
评分:9.6
主演:张国荣、张丰毅
片名:《阿甘正传》
评分:9.5
主演:汤姆.汉克斯
}
}
public class Movie {
private String name;
private double score;
private String acotr;
public Movie(String name, double score, String acotr) {
this.name = name;
this.score = score;
this.acotr = acotr;
}
// ... getter + setter
public String getName() {
return name;
}
public double getScore() {
return score;
}
public void setName(String name) {
this.name = name;
}
public void setScore(double score) {
this.score = score;
}
public void setAcotr(String acotr) {
this.acotr = acotr;
}
public String getAcotr() {
return acotr;
}
}
结论:集合中存储的元素并不是对象本身,而是对象的地址。
import java.util.ArrayList;
import java.util.Scanner;
public class SystemDemo {
public static void main(String[] args) {
/* 学生信息系统的数据搜索
需求
⚫ 后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析
① 定义Student类,定义ArrayList集合存储如上学生对象信息,并遍历展示出来。
② 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
③ 使用死循环,让用户可以不停的搜索。*/
ArrayList<Student> list = new ArrayList<>();
list.add(new Student(2018302, "叶孤城", 23, "护理一班"));
list.add(new Student(2018303, "东方不败", 23, "推拿二班"));
for (int i = 0; i < list.size(); i++) {
System.out.print("学号:" + list.get(i).getId() + " " + "名字:" + list.get(i).getName()
+ " " + "年龄:" + list.get(i).getAge() + " " + "班级:" + list.get(i).getClassname());
System.out.println();
}
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入要查找的id");
int id = sc.nextInt();
if (Find(list, id) == null) {
System.out.println("查无此人");
}else
for (int i = 0; i < list.size(); i++) {
System.out.print("学号:" + list.get(i).getId() + " " + "名字:" + list.get(i).getName()
+ " " + "年龄:" + list.get(i).getAge() + " " + "班级:" + list.get(i).getClassname());
}
}
}
public static ArrayList<Student> Find(ArrayList<Student> s, int id) {
for (int i = 0; i < s.size(); i++) {
if (id == s.get(i).getId()) {
return s;
}
}
return null;
} // 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
}
import java.util.ArrayList;
public class Student {
/* 学生信息系统的数据搜索
需求
⚫ 后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析
① 定义Student类,定义ArrayList集合存储如上学生对象信息,并遍历展示出来。
② 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示。
③ 使用死循环,让用户可以不停的搜索。*/
private int id;
private String name;
private int age;
private String classname;
public Student(int id, String name, int age, String classname) {
this.id = id;
this.name = name;
this.age = age;
this.classname = classname;
}
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
}