目录
常用API(String、ArrayList)
API(Application Programming Interface,应用程序编程接口)
Java写好的技术(功能代码),可以直接调用
Oracle也为java提供的这些功能代码提供了相应的API文档(技术说明书)
String简单介绍
String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用
ArrayList简单介绍
ArrayList代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的
通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用,更丰富的API(功能)给程序员使用
String
String类概述
java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串
Java程序中的所有字符串文字都为此类的对象
字符串对象存在哪里?
以" "方式给出的字符串对象,在字符串常量池中存储,字符串常量池在堆内存中
Stirng是不可变字符串的原因
String变量每次的修改其实都是产生并指向了新的字符串对象
原来的字符串对象都是没有改变的,所以称不可变字符串
创建字符串对象的2种方式
方式一:直接使用" "定义
方式二:通过String类的构造器创建对象
构造器 | 说明 |
---|---|
pubilc String() | 创建一个空白字符串对象,不含有任何内容 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] chs) | 根据字节数组的内容,来创建字符串对象 |
有什么区别?
以" "方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份
通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true
//堆内存中地址一样
char[] chars = {'a', 'b', 'c'};
String s3 = new String(chars);
String s4 = new String(chars);
System.out.println(s3 == s4);//false
//堆内存中的地址不一样
String类常见面试题
下列代码运行的结果是?
package com.catboss.string;
public class StringDemo2 {
public static void main(String[] args) {
String s2 = new String("abc");//在堆内存中创建了两个对象,双引号的"abc"放在字符串常量池,new对象放在堆内存
String s1 = "abc";//没有创建对象,直接从字符串常量池中调"abc"的地址
System.out.println(s1 == s2);//false s1地址指向常量池,s2地址指向堆内存
}
}
package com.catboss.string;
public class StringDemo2 {
public static void main(String[] args) {
String s1 = "abc";//常量池
String s2 = "ab";//常量池
String s3 = s2 + "c";//只要有不是""的存在堆内存中
System.out.println(s1 == s3);//false
}
}
package com.catboss.string;
public class StringDemo2 {
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"
}
}
String类常用API-字符串内容比较
==不能用于字符串内容比较,它比较的是两个字符串存放的地址
字符串内容的比较:
推荐使用String类提供的“equals”比较:只关心内容一样即可
方法名 | 说明 |
---|---|
public boolean equals (object anObject) | 将此字符串与指定对象进行比较。只关心字符内容是否一致! |
public boolean equalsIgnoreCase(String anotherString) | 将此字符串与指定对象进行比较,忽略大小写比较字符串。只关心字符内容是否一致! |
package com.catboss.string;
import java.util.Scanner;
public class StringEqualsDemo4 {
public static void main(String[] args) {
String okName = "catboss";
String okPassword = "123456";
Scanner sc = new Scanner(System.in);
System.out.println("登录名称:");
String name = sc.next();
System.out.println("登录密码");
String password = sc.next();
if (okName.equals(name) && okPassword.equals(password)) {
System.out.println("登录成功");
} else {
System.out.println("用户名或密码错误!");
}
}
}
带验证码的登录
package com.catboss.string;
import java.util.Random;
import java.util.Scanner;
public class StringEqualsDemo4 {
public static void main(String[] args) {
String okName = "catboss";
String okPassword = "123456";
Scanner sc = new Scanner(System.in);
System.out.println("登录名称:");
String name = sc.next();
System.out.println("登录密码:");
String password = sc.next();
String sysCode = createCode(6);
System.out.println("请输入验证码:" + sysCode);
String code1 = sc.next();
//忽略大小写比较内容的API:一般用于比较验证码这样的业务逻辑
if (sysCode.equalsIgnoreCase(code1)) {
if (okName.equals(name) && okPassword.equals(password)) {
System.out.println("登录成功");
} else {
System.out.println("用户名或密码错误!");
}
} else {
System.out.println("验证码错误");
}
}
public static String createCode(int num) {
String code = "";
Random r = new Random();
for (int i = 0; i < num; i++) {
int type = r.nextInt(3);
switch (type) {
case 0:
char ch = (char) (r.nextInt(26) + 65);
code += ch;
break;
case 1:
char ch1 = (char) (r.nextInt(26) + 97);
code += ch1;
break;
case 2:
code += r.nextInt(10);
break;
}
}
return code;
}
}
String类常用API-遍历、替换、截取、分割操作
方法名 | 说明 |
---|---|
public int lenth() | 返回此字符串的长度 |
public char charAt(int index) | 获取某个索引位置处的字符 |
public char[] toCharArry() | 将当前字符串转换成字符数组返回 |
public String substring(int beginIndex,int endIndex) | 根据开始和结束的索引进行截取,得到新的字符串(包前不包后) |
public String substring(int beginIndex) | 从传入的索引处截取,截取到末尾,得到新的字符串 |
public String relace(CharSequence target,CharSequence replacement) | 使用新值,将字符串中的旧值替换,得到新的字符串 |
public String[] split(String regex) | 根据传入的规则切割字符串,得到字符串数组返回 |
package com.catboss.string;
public class StringAPIOtherDemo5 {
public static void main(String[] args) {
String name = "我爱你love";
System.out.println(name.length());//7
System.out.println("--------------------------------------------");
System.out.println(name.charAt(1));//爱
System.out.println("-------------遍历字符串中的每个字符-------------");
for (int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
System.out.println(c);
}//我爱你love
System.out.println("--------------------------------------------");
char[] chars = name.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}//我爱你love
System.out.println("--------------------------------------------");
String name2 = "Java是最厉害的编程语言!";
String rs = name2.substring(0, 9);
System.out.println(rs);//Java是最厉害的
System.out.println("--------------------------------------------");
String rs2 = name2.substring(4);
System.out.println(rs2);//是最厉害的编程语言!
System.out.println("--------------------------------------------");
String name3 = "你是不是有病,有病就去医院治疗,有病别来烦我";
String rs3 = name3.replace("有病", "***");
System.out.println(rs3);//你是不是***,***就去医院治疗,***别来烦我
System.out.println("--------------------------------------------");
System.out.println(name3.contains("有病"));//true
System.out.println(name3.contains("没病"));//false
System.out.println("--------------------------------------------");
System.out.println(name3.startsWith("你是不是"));//true
System.out.println(name3.startsWith("你好"));//false
System.out.println("--------------------------------------------");
String name4 = "甘肃,重庆,陕西,山东,山西,河南";
String[] names = name4.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println("选择了:" + names[i]);
}
}
}
String案例操作
String类开发验证码功能
需求:随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母
package com.catboss.string;
import java.util.Random;
public class StringExec1 {
public static void main(String[] args) {
//定义可能出现的字符信息
String datas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTVUWSYZ0123456789";
//循环五次,每次产生一个随机的索引,提取对应的字符连接起来即可
Random r = new Random();
String code = "";
for (int i = 0; i < 5; i++) {
// 随机一个索引
int num = r.nextInt(62) + 1;
char c = datas.charAt(num);
code += c;
}
System.out.println(code);
}
}
模拟用户登录功能
需求:模拟用户登录功能,最多只给三次机会
package com.catboss.string;
import java.util.Scanner;
public class StringExec2 {
public static void main(String[] args) {
String okAdmin = "caojian";
String okPassword = "001129";
Scanner sc = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
System.out.println("请输入用户名:");
String admin = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
if (okAdmin.equals(admin) && okPassword.equals(password)) {
System.out.println("登录成功!");
break;
} else {
System.out.println("用户名或密码错误,还有" + (3 - i) + "次机会");
}
}
}
}
手机号码屏蔽
需求:以字符串的形式从键盘接收一个手机号,将中间四位号码屏蔽
package com.catboss.string;
import java.util.Scanner;
public class StringExec3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号:");
String num = sc.next();
String first = num.substring(0, 3);
String end = num.substring(7);
String phone = first + "****" + end;
System.out.println(phone);
}
}
ArrayList
集合概述
集合是与数组类似,也是一种容器,用于装数据
数组的特点
数组定义完成并启动后,类型确定、长度固定。
问题:在个数不能确定,且要进行增删数据操作的时候,数组是不太合适的
集合的特点
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
集合非常适合做元素个数不确定,且要进行增删操作的业务场景
集合的提供了许多丰富、好用的功能,而数组的功能很单一
ArrayList集合
是集合中的一种,它支持索引(初步学习)
ArrayList集合的对象获取
构造器 | 说明 |
---|---|
public ArrayList() | 创建一个空的集合对象 |
ArrayList集合添加元素的方法
方法名 | 说明 |
---|---|
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
package com.catboss.arraylist;
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("java");
list.add("数据");
list.add(12);
list.add(false);
list.add("数");
System.out.println(list);
list.add(1, "曹健");
System.out.println(list);
}
}
ArrayList对于泛型的支持
泛型概述:
ArrayList<E>
:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型
举例:
ArrayList<String>
:此集合只能操作字符串类型的元素
ArrayList<Integer>
:此集合只能操作整数类型的元素
注意:集合中只能存储引用类型,不支持基本类型数据
ArrayList<Integer> list = new ArrayList();//JDK 1.7开始,泛型后面的类型申明可以不写
ArrayList常用API、遍历
方法名称 | 说明 |
---|---|
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
public E remove (int index) | 删除指定索引处的元素,返回被删除的元素 |
public boolean remove(Object o) | 删除指定元素,返回删除是否成功 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
package com.catboss.arraylist;
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("MySQL");
list.add("HTML");
list.add("python");
list.add("caojian");
// 1.public E get(int index):获取某个索引位置处的元素值
String e = list.get(3);
System.out.println(e);
// 2.public int size():获取集合的大小(元素个数)
System.out.println(list.size());
// 3.完成集合的遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 4.public E remove(int index):删除某个索引位置处的元素值,返回被删除的元素值
System.out.println(list);
String e2 = list.remove(1);
System.out.println(e2);
System.out.println(list);
// 5.public boolean remove(object o):直接删除元素值,删除成功返回true,删除失败返回false
System.out.println(list.remove("caojian"));
System.out.println(list);
ArrayList<String> list1 = new ArrayList<>();
list1.add("java");
list1.add("hhhhh");
list1.add("java");
list1.add("mysql");
System.out.println(list1);
System.out.println(list1.remove("java"));//如果有多个相同的元素,只删除第一个出现的元素,后面的不删除
System.out.println(list1);
// 6.public E set(int index,E element):修改某个索引位置处的元素值,返回原来索引处的元素值
String e3 = list1.set(0, "hello");
System.out.println(e3);
System.out.println(list1);
}
}
补充:
System.exit()
1.正常终止当前运行的Java虚拟机:System.exit(0)
2.异常终止当前运行的Java虚拟机:System.exit(非零的int型参数)
sc.next()和sc.nextLine()
sc.next()输入一行连续的字符串,一旦遇到空格、回车或者换行符就会自动停止获取;
sc.nextLine()连续输入一行带有空格的字符串,只有遇到回车键停止获取。
ArrayList集合案例
遍历并删除元素
需求:某班的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100
现在需要先把成绩低于80分一下的数据去掉
package com.catboss.arraylist;
import java.util.ArrayList;
public class ArrayTest1 {
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);
}
}
System.out.println(list);*/
//完美的方案之一
/* 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);
}
}
存储自定义类型的对象
需求:某影院需要在后台存储上述三部电影,然后依次展示出来
//Test
package com.catboss.arraylist;
import java.util.ArrayList;
public class ArrayTest2 {
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 m = movies.get(i);
System.out.println("电影名:" + m.getName());
System.out.println("评分:" + m.getScore());
System.out.println("演员:" + m.getActor());
System.out.println("----------------");
}
}
}
//电影类
package com.catboss.arraylist;
public 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;
}
}
结论:集合中存储的元素并不是对象本身,而是对象的地址
元素搜索
学生信息系统的数据搜索
需求
后台程序需要储存学生信息并展示,然后提供按照学号搜索学生信息的功能
//主代码
package com.catboss.arraylist;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayTest3 {
public static void main(String[] args) {
//1.定义学生类
//2.创建集合存储学生对象,创建学生对象封装学生信息
//把学生对象添加到集合中去
Student stu1 = new Student("2019218101", "曹飞飞", 22, "网络工程191班");
Student stu2 = new Student("2019218102", "文飞飞", 21, "铁路运输191班");
Student stu3 = new Student("2019218103", "李飞飞", 20, "铁路维修191");
Student stu4 = new Student("2019218104", "马飞飞", 23, "小学教育191");
ArrayList<Student> stuList = new ArrayList<>();
stuList.add(stu1);
stuList.add(stu2);
stuList.add(stu3);
stuList.add(stu4);
//3.遍历这些学生信息展示
System.out.println("学号\t\t\t\t姓名\t\t\t年龄\t\t班级");
for (int i = 0; i < stuList.size(); i++) {
Student s = stuList.get(i);
System.out.print(s.getId() + "\t\t" + s.getName() + "\t\t" + s.getAge() + "\t\t" + s.getLesson() + "\n");
}
//4.定义方法完成按照学号的搜索功能
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入学号查询学生:");
String id = sc.next();
//5.调用方法查询
Student s = getStudentById(stuList, id);
//6.判断中是否存在学生对象地址
if (s == null) {
System.out.println("对不起,没有找到此学生");
} else {
System.out.println("您查询的信息如下:");
System.out.println("学号\t\t\t\t姓名\t\t\t年龄\t\t班级");
System.out.print(s.getId() + "\t\t" + s.getName() + "\t\t" + s.getAge() + "\t\t" + s.getLesson() + "\n");
}
}
}
/**
* 根据学生的学号查询学生对象返回
*
* @param stuList 存储全部学生对象的集合
* @param id 搜索的学生的学号
* @return 学生对象/null
*/
public static Student getStudentById(ArrayList<Student> stuList, String id) {
//1.遍历全部学生对象
for (int i = 0; i < stuList.size(); i++) {
Student s = stuList.get(i);
//2.询问当前遍历的这个学生对象的学号,是否是我们要找的学号
if (s.getId().equals(id)) {
//这个是s代表的学生对象,就是我们要找的:返回它
return s;
}
}
//查无此人
return null;
}
}
//Student类
package com.catboss.arraylist;
public class Student {
private String id;
private String name;
private int age;
private String lesson;
public Student() {
}
public Student(String id, String name, int age, String lesson) {
this.id = id;
this.name = name;
this.age = age;
this.lesson = lesson;
}
public String getId() {
return id;
}
public void setId(String 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 getLesson() {
return lesson;
}
public void setLesson(String lesson) {
this.lesson = lesson;
}
}