目录
2.3.5 substring(int beginIndex,int endIndex)
3.4.5 set(int index,E element)
1.定义
API是什么:Application Programming Interface(应用程序编程接口)
- Java写好的程序,我们可以之间调用。
- Oracle也为Java写好的程序提供了相应的API文档(文档可以去官网下载)
2.String类
2.1 String概述
String我们都很熟悉了,它可以用于存储字符串,同时String提供了很多字符串的功能可以使用,如在我们输入密码时要比较输入的密码是否正确;关键字的屏蔽;关键字的搜索都使用到了String类。
简单地说:String是字符串类型,可以定义字符串变量指向字符串对象
值得注意的是:String定义的字符串对象是不可以修改的。但这么说就有疑问了,明明在之前我们是可以通过对字符串修改的,可以将一个字增加到多个字。原因:
- String变量每次的修改其实是产生并指向了新的字符串对象。
- 原来的字符串对象都是没有改变的,所以称不可变字符串。
举个栗子:假如定义了一个字符串String name = "诸葛",这时堆内存中有一个字符串常量池用来存放“诸葛”,栈内存中的name指向“诸葛”,接着进行字符串拼接操作name+=“亮”,输出结果确实为“诸葛亮”,为什么呢?这时亮字并不是单纯地拼到常量池中,而是在常量池增加了一个新的字符串“亮”,然后在再堆内存中拼接一个字符串“诸葛亮”,这时name指向“诸葛亮”。总结一下,此时堆内存中的字符串常量池中有两个字符串分别为“诸葛”和“亮”,堆内存中有一个字符串为“诸葛亮”,此时name指向“诸葛亮”,所以字符串对象确实没有改变。
2.2String对象的创建
2.2.1创建字符串对象有两种方式
方式一:直接用""定义,这也是我们之前一直用的方式。
//方式一
String name = "王德发";
System.out.println(name);
方式二:通过String类的构造器创建对象。
//方式二
//1.pubic String() 创建一个空白字符串对象,没有意义,一般不用
String s1 = new String();
System.out.println(s1);
//2.pubic String(String original) 根据传入的字符串内存创建字符串对象,和方式一一样,不如之间用方式一
String s2 = new String("我爱你");
System.out.println(s2);
//3.pubic String(char[] chs) 根据字符数组的内容,来创建字符串对象
char[] c = {'a','b','爱','你'};
String s3 = new String(c);
System.out.println(s3);//ab爱你
//4.pubic String(byte[] chs) 根据字节数组的内容创建字符串对象
byte[] b = {97,98,99};
String s4 = new String(b);
System.out.println(s4);//abc
输出结果为:
王德发
我爱你
ab爱你
abc
2.2.2区别
- 以""方式创建的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存出一份。
- 通过构造器new对象,每new一次都会产生一个新的对象,放在堆内存中。
举个栗子
System.out.println("--------------------");
String ss1 = "abc";
String ss2 = "abc";
System.out.println(ss1==ss2);//比较的是地址为true,说明是同一个字符串
String ss3 = new String("abc");
String ss4 = new String("abc");
System.out.println(ss3==ss4);//false
2.3 String类常用API
2.3.1 equals
经过前面的内容我们发现当我们想比较两个字符串是否相等时,不能直接比较,因为可能即使两个字符串完全一样但是一个在字符串常量池一个在堆内存中,这时结果就是false的,所以这时就可以使用到equals来进行比较,equals只关心内容是否一样。
举个栗子:
不使用equals 结果是登陆失败。
package com.itzw.string;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
//模拟数据库中存储的账号和密码
String okUsername = "zhangsan";
String okPassword = "123456";
//模拟输入的账户和密码
Scanner sc = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
//比较
if (okUsername == username && okPassword == password){
System.out.println("登陆成功!");
}else{
System.out.println("登陆失败,用户名或密码错误!");
}
}
}
使用equals 登陆成功。
if (okUsername.equals(username) && okPassword.equals(password)){
System.out.println("登陆成功!");
}else{
System.out.println("登陆失败,用户名或密码错误!");
}
2.3.2 length
计算字符串长度
String s1 = "我他么爱你王德发";
System.out.println(s1.length());//8
2.3.3 charAt
获取某个索引位置的字符串
char c = s1.charAt(1);
System.out.println(c);//他
System.out.println("---------------------");
System.out.println("遍历字符串中每个字符");
for (int i = 0; i < s1.length(); i++) {
System.out.println(s1.charAt(i));
}
2.3.4 toCharArray
将字符串转换成字符数组,输出的结果和上一个一样
char[] chars = s1.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
2.3.5 substring(int beginIndex,int endIndex)
截取字符串内容(包前不包后)
String substring = s1.substring(0, 5);
System.out.println(substring);//我他么爱你
2.3.6 replace()
替换某些字符
String s2 = "我他妈爱你王德发,你他妈知道了吗";
//很显然有敏感词汇,要换成**
String replace = s2.replace("他妈", "**");
System.out.println(replace);//我**爱你王德发,你**知道了吗
2.3.7 contains
判断是否包含某些字符
boolean contains = s2.contains("他");
boolean contains1 = s2.contains("她");
System.out.println(contains);//true
System.out.println(contains1);//false
2.3.8 startsWith
判断是否以某些字符开始
System.out.println(s2.startsWith("我他妈"));//true
System.out.println(s2.startsWith("我他嘛"));//false
2.3.9 split
按照某个内容把一整个字符串分成字符串数组返回
String name = "张麻子,马邦德,黄思浪,张牧之";
String[] names = name.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
2.4 String类案例
2.4.1 开发验证码功能
需求:
- 随机产生一个五位验证码,每位可能是数字、大写字母、小写字母。
分析:
- 定义一个String类型的变量存储a-z A-Z 0-9之间的字符
- 循环5次,随机一个范围内的索引,获取对应字符连接起来即可。
2.4.2 模拟用户登录功能
需求:
- 模拟用户登录功能,最多给三次机会
分析:
- 系统后台定义好正确的登录名称,密码
- 使用循环控制三次,让用户输入正确的用户名和密码,判断是否登录成功,成功则不再进行登录;失败给出提示,让用户继续。
package com.itzw.string;
import java.util.Scanner;
/*
模拟用户登录
*/
public class Test05 {
public static void main(String[] args) {
//用户名
String okUsername = "zw";
//密码
String okPassword = "123456";
int sum = 3;
Scanner sc = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
System.out.print("请输入您的账号:");
String username = sc.next();
System.out.print("请输入您的密码:");
String password = sc.next();
if (okUsername.equals(username)){
if (okPassword.equals(password)){
System.out.println("登陆成功!");
break;
}else{
if (sum - i > 0){
System.out.println("您输入的密码有误!您还有" + (sum - i) + "次机会");
}else{
System.out.println("输入错误超过三次,下次再来吧您勒!");
}
}
}else{
if (sum - i > 0)
System.out.println("您输入的账号有误!您还有" + (sum - i) + "次机会");
else
System.out.println("输入错误超过三次,下次再来吧您勒!");
}
/*if (okUsername.equals(username) && okPassword.equals(password)){
System.out.println("登陆成功!");
break;
}else{
if (i < 2)
System.out.println("用户名或密码有误,请重新输入!");
else
System.out.println("输入错误超过三次,改天再来吧您勒");
}*/
}
}
}
2.4.3 手机号码屏蔽
分析:
- 截取字符串前三位,截取字符串后四位。
- 将截取后的两个字符串,中间加上****进行拼接。
- 例如输入手机号1638925389得到163****5389
package com.itzw.string;
import java.util.Scanner;
/*
手机号码屏蔽
*/
public class Test06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入手机号:");
String num = sc.next();
String forward = num.substring(0, 3);
String end = num.substring(7, 11);
String newNum = forward + "****" + end;
System.out.println(newNum);
}
}
3.集合、ArrayList
3.1集合概述
什么是集合呢?集合与数组类似,都是用来装数据的。但为什么还要用集合呢。因为数组在创建时类型确定,长度固定,若我有新的需求如增删,则数组不合适。
集合的特点:
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
- 集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
- 集合的提供了许多丰富、好用的功能,而数组的功能很单一。
3.2 ArrayList基础
创建ArrayList数组和添加数据
package com.itzw.arraylist;
import java.util.ArrayList;
public class Test01 {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList list = new ArrayList();
//增加数据,可以增加任何数据
list.add(1);
list.add("王德发");
list.add(true);
list.add('周');
list.add(3.14);
System.out.println(list);//[1, 王德发, true, 周, 3.14]
//指定位置增加元素
list.add(1,"周杰伦");
System.out.println(list);//[1, 周杰伦, 王德发, true, 周, 3.14]
}
}
3.3 泛型
泛型概述
- ArrayList<E>: 其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。
举例:
- ArrayList<String> :此集合只能操作字符串类型的元素。
- ArrayList<Integer>: 此集合只能操作整数类型的元素。
值得注意的是:集合中只能存储引用类型,不支持基本数据类型。
package com.itzw.arraylist;
import java.util.ArrayList;
public class Test02 {
public static void main(String[] args) {
//创建一个只能装入String类型的ArrayList集合
//ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<>();//后面的String可以省略
list.add("王德发");
list.add("马邦德");
//list.add(1);装入数字就会出错。
//添加整数
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(1);
}
}
3.4 ArrayList常用API
3.4.1 get(int index)
获取到某个索引位置的元素的值
ArrayList<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("mysql");
list.add("mybatis");
list.add("javabean");
String s = list.get(2);
System.out.println(s);//mysql
3.4.2 size()
得到集合大小
int size = list.size();
System.out.println(size);//5
3.4.3 集合的遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
3.4.4 remove
remove((int index))
删除某个索引位置的值,并返回删除的值
String remove = list.remove(1);
System.out.println(remove);//html
System.out.println(list);//[java, mysql, mybatis, javabean]
remove(Object o)
删除指定的值,成功返回true,失败返回false,若有多个元素相同,则只删除第一个
System.out.println(list.remove("mysql"));//true
System.out.println(list);//[java, mybatis, javabean]
System.out.println(list.remove("javaa"));//false
3.4.5 set(int index,E element)
修改某个位置的值,并返回修改前的值
String c = list.set(1, "C");
System.out.println(c);//mybatis
System.out.println(list);//[java, C, javabean]
3.5 ArrayList集合案例
3.5.1 遍历并删除元素值
需求:
- 某个班级的考试在系统上进行,成绩大致为: 98,77, 66, 89,79,50,100
- 现在需要先把成绩低于80分以下的数据去掉。
分析:
- 定义ArrayList集合存储多名学员的成绩。
- 遍历集合每个元素,如果元素值低于80分,去掉它。.
- 值得注意的是,用传统的方法会有bug,因为每次删除一个,集合大小就发生变化。
package com.itzw.arraylist;
import java.util.ArrayList;
public class Test04 {
public static void main(String[] args) {
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 = 0; i < list.size(); i++) {
if (list.get(i) < 80){
list.remove(i);
i--;//每次删除要减一,因为每次删除元素,集合大小就减一。
}
}
System.out.println(list);*/
//方法二
for (int i = list.size() - 1; i >= 0 ; i--) {
if (list.get(i) < 80){
list.remove(i);
}
}
System.out.println(list);
}
}
3.5.2 影片信息在程序中表示
需求:
- 某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析:
- 定义一个电影类,定义一个集合存储电影对象。
- 创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
- 遍历集合中的3个对象,输出相关信息。
- 值得注意的是,不能直接输出集合,因为存入集合的都是地址。
package com.itzw.arraylist;
import java.util.ArrayList;
public class Test05 {
public static void main(String[] args) {
Movie m1 = new Movie("肖申克的救赎",9.7,"罗宾斯");
Movie m2 = new Movie("霸王别姬",9.6,"张国荣,张丰毅");
Movie m3 = new Movie("阿根正传",9.5,"汤姆汉克斯");
ArrayList<Movie> movies = new ArrayList<>();
movies.add(m1);
movies.add(m2);
movies.add(m3);
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.getActor());
System.out.println("============================");
}
}
}
//电影类
class Movie{
private String name;
private double score;
private String actor;
public Movie() {
}
public Movie(String name, double score, String actor) {
this.name = name;
this.score = score;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
3.5.3 学生信息系统的数据搜索
需求:
- 后台程序 需要存储如.上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析:
- 定义Student类,定义ArrayList集合存储如上学生对象信息,并遍历展示出来。
- 提供一一个方法,可以接收ArrayList集合, 和要搜索的学号,返回搜索到的学生对象信息,并展示。
- 使用死循环,让用户可以不停的搜索。
package com.itzw.arraylist;
import java.util.ArrayList;
import java.util.Scanner;
public class Test06 {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("180302","叶孤城",23,"护理一班"));
students.add(new Student("180303","东方不被",23,"推拿二班"));
students.add(new Student("180304","西门吹雪",26,"中药学四班"));
students.add(new Student("180305","梅超风",26,"神经科二班"));
while(true){
System.out.print("请输入学号:");
Scanner sc = new Scanner(System.in);
String no = sc.next();
Student s = getStudentById(students, no);
if (s == null){
System.out.println("查无此人!");
}else{
System.out.println("学号:" + s.getNo());
System.out.println("姓名:" + s.getName());
System.out.println("年龄:" + s.getAge());
System.out.println("班级:" + s.getClas());
System.out.println("=================");
}
}
}
/**
* 根据学生学号返回学生信息
* @param students 存储全部学生信息的集合
* @param no 学生学号
* @return 学生对象|null
*/
public static Student getStudentById(ArrayList<Student> students,String no){
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
if (no.equals(student.getNo())){
return student;
}
}
return null;
}
}
//学生类
class Student{
private String no;//学号
private String name;//姓名
private int age;//年龄
private String clas;//班级
public Student() {
}
public Student(String no, String name, int age, String clas) {
this.no = no;
this.name = name;
this.age = age;
this.clas = clas;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
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 getClas() {
return clas;
}
public void setClas(String clas) {
this.clas = clas;
}
}