part08——包和Java常用API
part08——包和Java常用API
今日目标
我们前面已经学习了面向对象编程,使用面向编程这个套路,我们需要自己写类,然后创建对象来解决问题。但是在以后的实际开发中,更多的时候,我们是利用面向编程这种套路,使用别人已经写好的类来编程的。
- 包 🍐
- String类 ❤️ 🍐
- ArrayList类 ❤️ 🍐
知识储备
- 在自己的计算机中的硬盘中,通过创建 电影、音乐、学习资料等文件夹,分门别类的管理资料
- 使用现成的播放器看片,而先编写播放器代码,然后看片。
1. 包 🍐
包
1.包的概念
包是Java中用于组织和管理类的一种机制,它将相关的类组织在一起,形成一个有层次结构的命名空间。
例子:

2.为什么使用包?
- 生活中的类比:使用文件夹来组织和分类文件,类似于家庭中使用抽屉和文件夹来整理物品。

- 代码的组织性:包能够帮助我们更好地组织和管理代码,防止命名冲突,提高代码的可维护性和可读性。

- 命名空间的管理:通过包,可以避免不同模块或库之间的命名冲突,确保程序的整体性和稳定性。

3. 包的定义语法和注意事项

- 命名规范:遵循Java命名规范,使用小写字母和下划线。
- 目录结构:包名应与目录结构相对应,方便管理和查找。点击查看图解
- 访问修饰符:包内的类应当使用适当的访问修饰符,控制访问权限。
- 导入语句:通过import语句引入其他包中的类,避免写出完整的类路径。
4. 包的使用注意事项
- 如果当前程序中,要调用自己所在包下的其他程序,可以直接调用。(同一个包下的类,互相可以直接调用)
- 如果当前程序中,要调用其他包下的程序,则必须在当前程序中导包, 才可以访问!
- 导包格式:
import 包名.类名
- 导包格式:
- 如果当前程序中,要调用Java.lang包下的程序,不需要我们导包的,可以直接使用。
- 如果当前程序中,要调用多个不同包下的程序,而这些程序(类)名正好一样,此时默认只能导入一个程序,另一个程序必须带包名访问。
总结
课堂作业
- 在com.itheima的包下,分别创建array、method、object等包名,用来管理数组练习案例、方法练习案例、对象练习案例 如下图

2. String类 ✏️ 🍐 ❤️
1. String类快速入门 🍐
String类快速入门
1. String类是什么?
在计算机编程中,字符串是由字符组成的序列。字符可以是字母、数字、符号等,字符串是由这些字符按照一定顺序组成的。在Java中,我们使用String类来表示字符串。
2. 字符串在程序中扮演着非常重要的角色,因为它们广泛应用于各种场景。
- 场景一:统计文字中的特定词汇
比如,我们需要统计一段文字中出现了多少次“爱”这个字。这时候,我们就需要对字符串进行处理来进行统计操作。
- 场景二:检索数组中的特定元素
假设我们有一个存储名字的数组,我们想要知道姓“张”的名字有几个。这时,我们同样需要字符串的处理技巧。
- 场景三:比较用户名和密码是否正确
在用户登录的场景中,我们通常需要比较输入的用户名和密码是否和存储的一致。这也是字符串处理的典型应用。
- 场景四:检测敏感字符
另一个常见的应用是检测用户输入的文字是否包含敏感字符,以保证信息的安全。
3.JDK文档有关于String类的说明
在线JDK文档: https://www.runoob.com/manual/jdk11api/index.html
4. 定义字符串
//定义字符串
String name = "黑马程序长沙校区,欢迎你";
//有参构成
String name1 = new String("yangeit")
5. 常用的方法
length()
:获取字符串的长度。判断是否是手机号码是不是11位
equals(anotherString)
:比较两个字符串是否相等。登录功能中密码比较中常用
equalsIgnoreCase(String anotherString)
将此 String与另一个 String比较,忽略了大小写。验证码比较中常用
contains(CharSequence s)
判断字符串是否包含另外一个字符串,如果包含 返回true 。判断是否包含 敏感字
replace(char oldChar, char newChar)
返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。用于替换敏感字 为 **
案例代码:
/**
* 目标:掌握String的创建和常用方法的使用
*/
public class StringDemo {
public static void main(String[] args) {
// 创建字符串String
String name ="黑马程序员长沙校区,Java100期欢迎你";
//有参构造方式构建
String name1 = new String("黑马");
// 获得字符串长度
int length = name.length();
System.out.println(length); //21
System.out.println(name1.length()); //2
// 比较2个字符串是否相等
String name2="黑马程序员长沙校区,java100期欢迎你";
System.out.println(name.equals(name2)); //false
// 忽略大小写,比较字符串
System.out.println(name.equalsIgnoreCase(name2)); //true
// 判断是否包含关键字
System.out.println(name.contains("黑马")); //true
System.out.println(name.contains("黑马1")); //false
// 替换字符串
String replace = name.replace("100", "101");
System.out.println(replace);//结果:黑马程序员长沙校区,Java101期欢迎你
}
}
总结
2. String类的常用方法 ✏️
String类的常用方法

代码操作
public class StringDemo2 {
public static void main(String[] args) {
//目标:快速熟悉String提供的处理字符串的常用方法。
String s = "黑马Java";
// 1、提取字符串中某个索引位置处的字符
char c = s.charAt(1);
System.out.println(c);
// 字符串的遍历
for (int i = 0; i < s.length(); i++) {
// i = 0 1 2 3 4 5
char ch = s.charAt(i);
System.out.println(ch);
}
System.out.println("-------------------");
// 2、把字符串转换成字符数组,再进行遍历
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
// 3、从当前索引位置一直截取到字符串的末尾
String rs2 = s3.substring(5);
System.out.println(rs2);
// 4、判断字符串是否以某个字符串开头。
String rs4 = "张三丰";
System.out.println(rs4.startsWith("张"));
System.out.println(rs4.startsWith("张三"));
System.out.println(rs4.startsWith("张三2"));
// 5、把字符串按照某个指定内容分割成多个字符串,放到一个字符串数组中返回给我们
String rs5 = "张无忌,周芷若,殷素素,赵敏";
String[] names = rs5.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
3. String的注意事项 ⚠️ 🚀
String的注意事项
字符串原理性的内容,就当做注意事项来学习一下。一共有下面的2点:

创建字符串方式有多种
// 1、直接双引号得到字符串对象,封装字符串数据
String name = "黑马666";
System.out.println(name);
// 2、new String创建字符串对象,并调用构造器初始化字符串
String rs1 = new String();
System.out.println(rs1); // ""
String rs2 = new String("itheima");
System.out.println(rs2);
char[] chars = {'a', '黑', '马'};
String rs3 = new String(chars);
System.out.println(rs3);
byte[] bytes = {97, 98, 99};
String rs4 = new String(bytes);
System.out.println(rs4);
- 注意事项1:String类的对象是不可变的对象
我们先看一段代码,分析这段代码的结果

以上代码中:
- 先定义了一个String变量 name第一次赋值为
“黑马”;
- 然后对
name
变量记录的字符串进行两次拼接,第一次拼接“程序员”
,第二次拼接“播妞”
;- 我们发现得到的结果是:
黑马程序员播妞
问题就来了,不是说:String类的对象是不可变的字符串对象吗? name的值变了呀!!!
String是不可变对象的含义:
需要注意的是:只要是以"..."
方式写出的字符串对象,会在堆内存中的字符串常量池中存储。
- 1️⃣ 执行第一句话时,会在堆内存的常量池中,创建一个字符串对象
“黑马”
, - 2️⃣ 然后把
“黑马”
的地址赋值给String name
- 3️⃣ 当执行第二句话时,又会在堆内存的常量池中创建一个字符串
“程序员”
,和“黑马”
拼接,拼接之后还会产生一个新的字符串对象“黑马程序员”
,然后将新产生的“黑马程序员”
对象的地址赋值给String name
变量。

此时发现,之前创建的字符串对象“黑马”
内容确实是没有改变的,仍然在常量池中。所以说String的对象是不可变的。 👍
- 注意事项2:字符串字面量和new出来字符串的区别
- 只要是以
“...”
方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份。如下图一所示- 但通过
new
方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。如下图二所示


总结
字符串的注意事项:
- String是不可变字符串对象
- 只要是以
"..."
方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份; - 但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。
课堂作业
- 日志中有哪些信息?🎤
4. String案例 ✏️
用户登录案例
接下来给大家做一个案例,使用字符串的功能完成登录案例。案例需求如下:

点击查看代码
/**
目标:完成用户的登录案例。
*/
public class StringTest4 {
public static void main(String[] args) {
// 1、开发一个登录界面
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请您输入登录名称:");
String loginName = sc.next();
System.out.println("请您输入登录密码:");
String passWord = sc.next();
// 5、开始调用登录方法,判断是否登录成功
boolean rs = login(loginName, passWord);
if(rs){
System.out.println("恭喜您,欢迎进入系统~~");
break; // 跳出for循环,代表登录完成
}else {
System.out.println("登录名或者密码错误,请您确认~~");
}
}
}
/**
2、开发一个登录方法,接收用户的登录名和密码,返回认证的结果
*/
public static boolean login(String loginName, String passWord){
// 3、准备一份系统正确的登录名和密码
String okLoginName = "itheima";
String okPassWord = "123456";
// 4、开始正式判断用户是否登录成功
/*if(okLoginName.equals(loginName) && okPassWord.equals(passWord)){
// 登录成功的
return true;
}else {
return false;
}*/
return okLoginName.equals(loginName) && okPassWord.equals(passWord);
}
}
随机产生验证码
接下来学习一个再工作中也比较常见的案例,使用String来开发验证码。需求如下:

根据需求分析,步骤如下:
- 首先,设计一个方法,该方法接收一个整型参数,最终要返回对应位数的随机验证码。
- 方法内定义2个字符串变量:
- 1个用来记住生成的验证码,1个用来记住要用到的全部字符。
- 定义for循环控制生成多少位随机字符
- 每次得到一个字符范围内的随机索引
- 根据索引提取该字符,把该字符交给code变量连接起
- 循环结束后,在循环外返回code即可。
- 在主方法中调用生成验证码的方法
根据步骤完成代码
点击查看代码
import java.util.Random;
/**
目标:完成随机产生验证码,验证码的每位可能是数字、大写字母、小写字母
*/
public class StringTest5 {
public static void main(String[] args) {
System.out.println(createCode(4));
System.out.println(createCode(6));
}
/**
1、设计一个方法,返回指定位数的验证码
*/
public static String createCode(int n){
// 2、定义2个变量
//一个是记住最终产生的随机验证码
//一个是记住可能用到的全部字符
String code = "";
String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
// 3、开始定义一个循环产生每位随机字符
for (int i = 0; i < n; i++) {
// 4、随机一个字符范围内的索引。
int index = r.nextInt(data.length());
// 5、根据索引去全部字符中提取该字符
code += data.charAt(index); // code = code + 字符
}
// 6、返回code即可
return code;
}
}
关于String的案例,我们先练习到这里。以后遇到对字符串进行操作的需求,优先找String类有没有提供对应的方法。
练习
🚩
String desc="焱哥曰:学IT技术者,当虚心若愚,不敢自满。凡事先问己,再问他人。学习需恒心,勇于尝试,遇挫不退缩,努力攻克难题。方能渐入佳境,突破自我,成为一名真正的IT专业人士。吾期盼汝等立志成才,在IT领域创出新天地。"
需求:
- 统计出上述文字的长度
- 判断出上述文字中是否包含
虚心若愚
- 统计上述文字中含有几个
学
字 - 将上述文字中的
IT
替换成Java
- 请问上述文字中
虚
这个字的索引是多少? - 使用
。
将上述文字进行分割(成为数组),打印出索引最大的文字
3. ArrayList类 ✏️ 🍐 ❤️
1. ArrayList快速入门 🍐
ArrayListArrayList
ArrayList一种 用来装数据的 容器,类似于数组。与数组不同的是 ArrayList的大小可变.
1. 创建一个ArrayList非常简单,只需使用下面的语句:
ArrayList names = new ArrayList();
2. 如何添加数据,并输出数据
ArrayList myList = new ArrayList();
// 输出数据
System.out.println(myList);
// 添加数据
myList.add("小伟");
myList.add("胡敏");
// 输出数据
System.out.println(myList);
3.常用的方法
JDK在线文档 : https://www.runoob.com/manual/jdk11api/index.html
- add(element): 向列表末尾添加元素。
- get(index): 获取指定位置的元素。
- size(): 返回列表中的元素个数。
- remove(index): 移除指定位置的元素。
- contains(element): 判断列表是否包含某个元素。
- set(int index,E element) :修改指定索引处的元素,返回被修改的元素
完整代码:
/**
目标:要求同学们掌握如何创建ArrayList的对象,并熟悉ArrayList提供的常用方法。
*/
public class ArrayListDemo1 {
public static void main(String[] args) {
// 1、创建一个ArrayList的对象
ArrayList list = new ArrayList();
list.add("黑马");
list.add("黑马");
list.add("Java");
System.out.println(list);
// 2、往ArrayList中的某个索引位置处添加一个数据
list.add(1, "MySQL");
System.out.println(list);
// 3、根据索引获取ArrayList中某个索引位置处的值
String rs = list.get(1);
System.out.println(rs);
// 4、获取ArrayList的大小(返回ArrayList中存储的元素个数)
System.out.println(list.size());
// 5、根据索引删除ArrayList中的某个元素值,会返回被删除的元素值给我们
System.out.println(list.remove(1));
System.out.println(list);
// 6、直接删除某个元素值,删除成功会返回true,反之
System.out.println(list.remove("Java"));
System.out.println(list);
list.add(1, "html");
System.out.println(list);
// 默认删除的是第一次出现的这个黑马的数据的
System.out.println(list.remove("黑马"));
System.out.println(list);
// 7、修改某个索引位置处的数据,修改后会返回原来的值给我们
System.out.println(list.set(1, "黑马程序员"));
System.out.println(list);
}
}
3. ArrayList应用案例 ✏️
ArrayList应用案例1
接下来我们做个案例,用来往ArrayList中存储自定义的对象,先阅读下面的案例需求:

分析需求发现:
- 在外卖系统中,每一份菜都包含,菜品的名称、菜品的原价、菜品的优惠价、菜品的其他信息。那我们就可以定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
- 接着再写一个菜品管理类(FoodManager类),提供展示操作界面、上架菜品、浏览菜品的功能。
- 首先我们先定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
public class Food {
private String name; //菜品名称
private double originalPrice; //菜品原价
private double specialPrice; //菜品优惠价
private String info; //菜品其他信息
public Food() {
}
public Food(String name, double originalPrice, double specialPrice, String info) {
this.name = name;
this.originalPrice = originalPrice;
this.specialPrice = specialPrice;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getOriginalPrice() {
return originalPrice;
}
public void setOriginalPrice(double originalPrice) {
this.originalPrice = originalPrice;
}
public double getSpecialPrice() {
return specialPrice;
}
public void setSpecialPrice(double specialPrice) {
this.specialPrice = specialPrice;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
- 接下来写一个菜品管理类,提供上架菜品的功能、浏览菜品的功能、展示操作界面的功能。
public class FoodManager{
//为了存储多个菜品,预先创建一个ArrayListArrayList;
//上架菜品时,其实就是往ArrayList中添加菜品对象
//浏览菜品时,其实就是遍历ArrayList中的菜品对象,并打印菜品对象的属性信息。
private ArrayList<Food> foods = new ArrayList<>();
//为了在下面的多个方法中,能够使用键盘录入,提前把Scanner对象创建好;
private Scanner sc = new Scanner(System.in);
/**
1、商家上架菜品
*/
public void add(){
System.out.println("===菜品上架==");
// 2、提前创建一个菜品对象,用于封装用户上架的菜品信息
Food food = new Food();
System.out.println("请您输入上架菜品的名称:");
String name = sc.next();
food.setName(name);
System.out.println("请您输入上架菜品的原价:");
double originalPrice = sc.nextDouble();
food.setOriginalPrice(originalPrice);
System.out.println("请您输入上架菜品的优惠价:");
double specialPrice = sc.nextDouble();
food.setSpecialPrice(specialPrice);
System.out.println("请您输入上架菜品的其他信息:");
String info = sc.next();
food.setInfo(info);
// 3、把菜品对象添加到ArrayList容器中去
foods.add(food);
System.out.println("恭喜您,上架成功~~~");
}
/**
2、菜品;浏览功能
*/
public void printAllFoods(){
System.out.println("==当前菜品信息如下:==");
for (int i = 0; i < foods.size(); i++) {
Food food = foods.get(i);
System.out.println("菜品名称:" + food.getName());
System.out.println("菜品原价:" + food.getOriginalPrice());
System.out.println("菜品优惠价:" + food.getSpecialPrice());
System.out.println("其他描述信息:" + food.getInfo());
System.out.println("------------------------");
}
}
/**
3、专门负责展示系统界面的
*/
public void start(){
while (true) {
System.out.println("====欢迎进入商家后台管理系统=====");
System.out.println("1、上架菜品(add)");
System.out.println("2、浏览菜品(query)");
System.out.println("3、退出系统(exit)");
System.out.println("请您选择操作命令:");
String command = sc.next();
switch (command) {
case "add":
add();
break;
case "query":
printAllFoods();
break;
case "exit":
return; // 结束当前方法!
default:
System.out.println("您输入的操作命令有误~~");
}
}
}
}
- 最后在写一个测试类Test,在测试类中进行测试。其实测试类,只起到一个启动程序的作用。
public class Test {
public static void main(String[] args) {
FoodManager manager = new FoodManager();
manager.start();
}
}
运行结果如下:需要用户输入add、query或者exit,选择进入不同的功能。

好了,如果你能够把这个案例写出来,说明你对面向对象的思维封装数据,以及使用ArrayList容器存储数据,并对数据进行处理这方面的知识已经运用的很熟悉了。
接下来,我们学习一个ArrayList的应用案例,需求如下:

知识准备
- 创建ArrayListArrayList,并添加数据(
list.add("xxx")
) - 遍历ArrayList,并通过索引获得元素(
list.get(i)
) - 字符串String 包含的API(
contains("xxx")
) - 结合删除元素(
list.remove(元素)
)
我们分析一下这个案例的步骤该如何实现:
1.用户可以选购多个商品,可以创建一个ArrayListArrayList,存储这些商品
2.按照需求,如果用户选择了"枸杞"批量删除,应该删除包含"枸杞"的所有元素
1)这时应该遍历ArrayList中每一个String类型的元素
2)使用String类的方法contains判断字符串中是否包含"枸杞"
3)包含就把元素删除
3.输出ArrayList中的元素,看是否包含"枸杞"的元素全部删除
按照分析的步骤,完成代码
public class ArrayListTest2 {
public static void main(String[] args) {
// 1、创建一个ArrayListArrayList对象
ArrayList<String> list = new ArrayList<>();
list.add("枸杞");
list.add("Java入门");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("人字拖");
list.add("特级枸杞");
list.add("枸杞子");
System.out.println(list);
//运行结果如下: [Java入门, 宁夏枸杞, 黑枸杞, 人字拖, 特级枸杞, 枸杞子]
// 2、开始完成需求:从ArrayList中找出包含枸杞的数据并删除它
for (int i = 0; i < list.size(); i++) {
// i = 0 1 2 3 4 5
// 取出当前遍历到的数据
String ele = list.get(i);
// 判断这个数据中包含枸杞
if(ele.contains("枸杞")){
// 直接从ArrayList中删除该数据
list.remove(ele);
}
}
System.out.println(list);
//删除后结果如下:[Java入门, 黑枸杞, 人字拖, 枸杞子]
}
}
运行完上面代码,我们会发现,删除后的ArrayList中,竟然还有黑枸杞
,枸杞子
在ArrayList中。这是为什么呢?

枸杞子被保留下来,原理是一样的。可以自行分析。
那如何解决这个问题呢?这里打算给大家提供两种解决方案:
- ArrayList删除元素方式一:每次删除完元素后,让控制循环的变量
i--
就可以了;如下图所示

具体代码如下:
// 方式一:每次删除一个数据后,就让i往左边退一步
for (int i = 0; i < list.size(); i++) {
// i = 0 1 2 3 4 5
// 取出当前遍历到的数据
String ele = list.get(i);
// 判断这个数据中包含枸杞
if(ele.contains("枸杞")){
// 直接从ArrayList中删除该数据
list.remove(ele);
i--;
}
}
System.out.println(list);
- ArrayList删除元素方式二:我们只需要倒着遍历ArrayList,在遍历过程中删除元素就可以了




具体代码如下:
// 方式二:从ArrayList的后面倒着遍历并删除
// [Java入门, 人字拖]
// i
for (int i = list.size() - 1; i >= 0; i--) {
// 取出当前遍历到的数据
String ele = list.get(i);
// 判断这个数据中包含枸杞
if(ele.contains("枸杞")){
// 直接从ArrayList中删除该数据
list.remove(ele);
}
}
System.out.println(list);
练习
🚩
- 需求:编写一个程序,使用ArrayList创建一个书库library 。每一本书都包括id、书名、作者、出版年等信息。实现添加(addBook)、查询(selectBookByName)、修改(updateBookByID)、删除(deleteById)等功能。
- 添加书籍(id:7 name :重生在黑马学Java 作者:基尼太美 出版时间:2023)
- 通过名字模糊查询书籍(如:输入重生,查询名字含有重生的书籍)
- 通过作者名字查询书籍列表(如:输入萧鼎 查询萧鼎的书籍)
- 通过id修改书籍的名字(如:修改id为5的书籍 将名字改为:魔天记
- 通过名字中还有
仙
并且出版时间在[2002-2010)
年之间
初始数据:
ArrayList<Book> library = new ArrayList<>();
library.add(new Book(1, "重生之将门毒后", "绿野千鹤", 2019));
library.add(new Book(2, "妃常撩人:王爷请上榻", "花千草", 2018));
library.add(new Book(3, "绝色毒医:邪王狂妃", "飞烟斗雾", 2020));
library.add(new Book(4, "诛仙", "萧鼎", 2003));
library.add(new Book(5, "凡人修仙传", "忘语", 2008));
library.add(new Book(6, "戮仙", "萧鼎", 2014));
来做点作业巩固一下吧!!!✏️ 💪