面向对象3常用API(String、ArrayList)
一、String类
概述
String其实常被称为不可变字符串类型,它的对象在创建后不能被更改
创建字符串对象
两种方式
// 方式一:直接使用双引号得到字符串对象
String name="我爱你中国";
System.out.println(name);
// 方式二: 1、public String():创建一个空白字符串对象,不含有任何内容(几乎不用)
String s1=new String();
System.out.println(s1);
// 2、public String(String):根据传入的字符串内容,来创建字符串对象(几乎不用)
String s2=new String("我是中国人");
System.out.println(s2);
// 3、public String(char[] c):根据字符数组的内容,来创建字符串对象
char[] chars={'我','是','中','国','人'};
String s3=new String(chars);
System.out.println(s3);
// 4、public String(byte[] b):根据字节数组的内容,来创建字符串对象
byte[] bytes={97,98,99,65,66,67};
String s4=new String(bytes);
System.out.println(s4);
区别:
- 以” “方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份
- 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中
String 常见面试题
字符串内容的比较
内容比较
- 字符串内容比较不适合用“==”比较
- 字符串内容比较用“equals”比较:只关心内容一样即可
String okUser="root";
String okPass="123456";
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String User=sc.next();
System.out.println("请输入密码:");
String pass=sc.next();
if(okUser.equals(User)&&okPass.equals(pass)){
System.out.println("登录方式2成功");
}else{
System.out.println("登录失败!");
}
忽略大小写比较内容的Api
开发中当对基本类型比较时使用"=="
String常用API
length()、charAt()、toCharArray()
public static void main(String[] args) {
// 1.public int length():获取字符串长度
String name="我爱你中国love";
System.out.println(name.length());
// 2.public char charAt(int index):获取某个索引位置处的字符
char c=name.charAt(1);
System.out.println(c);
for (int i = 0; i < name.length(); i++) {
char ch=name.charAt(i);
System.out.println(ch);
}
// 3.public char[] toCharArray():把字符串转换成字符数组
char[] ch=name.toCharArray();
for (int i = 0; i < ch.length; i++) {
char cha=ch[i];
System.out.println(cha);
}
}
subString(),replace(),split(),contains(),startsWiths()
// 4.public String substring(int beginIndex,int endIndex):截取内容(含头不含尾)
String name2="Java是最厉害的编程语言";
String ss=name2.substring(0,9);
System.out.println(ss);
String ss1=name2.substring(4,9);
System.out.println(ss1);
// 5.public String substring(int beginIndex):从当前索引一直截取到末尾
String ss2=name2.substring(4);
System.out.println(ss2);
// 6.public String replace(CharSequence target,CharSequence replacement)
String name3="金三胖是最厉害的90后,金三胖棒棒的,我好爱金三胖";
String rp=name3.replace("金三胖","***");
System.out.println(rp);
// 7.public boolean contains(CharSequence s)
System.out.println(name3.contains("金三胖"));
System.out.println(name3.contains("金二胖"));
// 8.public boolean startsWith(String prefix)
System.out.println(name3.startsWith("金三胖"));
System.out.println(name3.startsWith("金三胖是最厉害的"));
System.out.println(name3.startsWith("金二胖"));
// 9.public String[] split(String s):按照某个内容把字符串分割成字符串数组返回
String name4="王宝强,贾乃亮,黄晓明";
String[] result=name4.split(",");
for (int i = 0; i < result.length; i++) {
System.out.println("分割为:"+result[i]);
}
String类开发验证码功能
需求:
随机产生一个5位的验证码,每位可能是数字,大写字母,小写字母
- 定义一个String类型的变量存储a-zA-Z0-9之间的全部字符
- 循环5次,随机一个范围内的索引,获取对应字符连接起来即可
// 1.定义可能出现的字符信息
String st="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r=new Random();
// 2.循环5次,每次生成一个随机的索引,提取对应的字符连接起来即可
String ch="";
for (int i = 0; i < 5; i++) {
//随机一个索引
int num=r.nextInt(st.length());
ch+=st.charAt(num);
}
//3.输出字符中的变量即可
System.out.println(ch);
模拟用户登录功能
需求
模拟用户登录功能,最多只给三次机会
- 系统后台定义好正确的登录名称,密码
- 使用循环控制三次,让用户输入正确的登录名和密码,判断是否登录成功,登录成功则不再进行登录;登录失败给出提示,并让用户继续登录
// 1.定义正确的登录名称和密码
String okLoginName="admin";
String okLoginPass="123456";
// 2.定义一个循环,循环3次,让用户登录
Scanner sc=new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请您输入用户登录名称:");
String loginName=sc.next();
System.out.println("请您输入用户登录密码:");
String loginPass=sc.next();
// 3.判断登录是否成功
if(loginName.equals(okLoginName)){
// 4.判断密码是否正确
if(loginPass.equals(okLoginPass)){
System.out.println("登录成功!欢迎进入系统随意浏览~~~");
break;
}else{
// 密码错误了
System.out.println("您的登录密码输入不正确!还剩"+(3-i-1)+"次机会登录");
}
}else{
System.out.println("您的登录名称不正确!还剩"+(3-i-1)+"次机会登录");
}
}
手机号码屏蔽
需求
以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽,最终效果为:
158****7839
- 键盘录入一个字符串,用Scanner实现
- 截取字符串前三位,截取字符串后四位
System.out.println("请输入手机号码:");
Scanner sc=new Scanner(System.in);
String phoneNum=sc.next();
String[] phoneArray=new String[3];
phoneArray[0]=phoneNum.substring(0,3);
phoneArray[1]=phoneNum.substring(3,7);
phoneArray[2]=phoneNum.substring(7);
String hideAfter=phoneArray[0]+"****"+phoneArray[2];
System.out.println("隐藏手机号之后为:"+hideAfter);
二、ArrayList类
介绍
- ArrayList 代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的。
- 通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用,更丰富的API给程序员使用。
- 数组的特点:类型确定,长度固定。在个数不能确定,且要进行增删数据操作的时候,数组是不太合适的。
- 集合的特点:集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
ArrayList集合
ArrayList是集合中的一种,它支持索引
// 1.创建ArrayList集合的对象
ArrayList list=new ArrayList();
// 2.添加数据
list.add("Java");
list.add("Java");
list.add("赵敏");
list.add(83);
list.add(42.2);
list.add(false);
list.add(true);
list.add('a');
System.out.println(list);
// 3.给指定索引位置插入元素
list.add(3,"张无忌");
System.out.println(list);
ArrayList对于泛型的支持
泛型概述
ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型
举例:
ArrayList<String> : 此集合只能操作字符串类型的元素
ArrayList<Integer> :此集合只能操作整数类型的元素
注意:集合中只能存储引用类型,不支持基本数据类型。
ArrayList<String> list=new ArrayList<>();
list.add("Java");
list.add("MySql");
list.add("c");
System.out.println(list);
ArrayList常用API
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("PHP");
list.add("Java");
list.add("Python");
list.add("MyBatis");
list.add("C#");
System.out.println("创建的集合为:"+list);
// 1.public int size():获取集合的大小(元素个数)
System.out.println("集合的大小为:" + list.size());
// 2.public E get(int index):获取某个索引位置处的元素值
System.out.println("集合中第四个元素为:"+list.get(3));
// 3.完成集合的遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 4.public E remove(int index):删除某个索引位置处的元素值,并返回被删除的元素值
String four=list.remove(4);
System.out.println(four);
System.out.println(list);
// 5.public boolean remove(Object o):直接删除元素值,删除成功返回true,删除失败返回false
System.out.println(list.remove("Java"));
System.out.println(list);
System.out.println(list.remove("C#"));
System.out.println(list);
// 6.public E set(int index,E element):修改某个索引位置处的元素值
list.set(0,"c++");
System.out.println(list);
ArrayList 案例
遍历并删除元素值
需求
某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100;现需要先把成绩低于80分以下的数据去掉
- 定义ArrayList集合存储多名学员的成绩
- 遍历集合每个元素,如果元素值低于80分,去掉它
ArrayList<Integer> scores = new ArrayList<>();
scores.add(98);
scores.add(77);
scores.add(66);
scores.add(89);
scores.add(79);
scores.add(50);
scores.add(100);
System.out.println(scores);
//方法一:
// 1.遍历集合中的每个元素
for (int i = 0; i < scores.size(); i++) {
// 2.判断这个分数是否低于80分,如果低于则从集合中删除它
if(scores.get(i)<80){
scores.remove(i);
i-=1;
}
}
System.out.println(scores);
//方法二:
// 1.遍历集合中的每个元素
for (int i = scores.size()-1; i >=0; i--) {
int sc=scores.get(i);
// 2.判断这个分数是否低于80分,如果低于则从集合中删除它
if(sc<80){
scores.remove(i);
}
}
System.out.println(scores);
影片信息在程序中的表示
需求
某影院系统需要在后台存储上述三部电影,然后依次展示出来。
- 三部电影是3个对象,定义一个电影类,定义一个集合存储电影对象
- 创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
// 1.定义一个电影类:Movie
// 2.定义一个ArrayList集合存储这些影片对象
ArrayList<Movie> movies = new ArrayList<>();
// 3.创建影片对象封装电影数据,把对象加入到集合中去
movies.add(new Movie("《肖申克的救赎》",9.7,"罗宾斯"));
movies.add(new Movie("《霸王别姬》",9.6,"张国荣、张丰毅"));
movies.add(new Movie("《阿甘正传》",9.5,"汤姆,汉克斯"));
// 4.遍历集合中的影片对象并展示出来
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("---------------------------------");
}
------------------------------------------------------------------
//movie类
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;
}
}
结论:集合中存储的元素并不是对象本身,而是对象的地址。
学生信息系统的数据搜索
需求
后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能
- 定义Student类,定义ArrayList集合存储加上学生对象信息,并遍历展示出来
- 提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息,并展示
- 使用死循环,让用户不停的搜索
public class Student {
private int id;
private String name;
private int age;
private String sclass;
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 getSclass() {
return sclass;
}
public void setSclass(String sclass) {
this.sclass = sclass;
}
public Student(int id, String name, int age, String sclass) {
this.id = id;
this.name = name;
this.age = age;
this.sclass = sclass;
}
public Student() {
}
}
----------------------------------------------------------------------------
public static void getStudent() {
// 1.定义一个学生类,后期用于创建对象封装学生数据
// 2.定义一个集合对象用于封装学生对象
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,"梅超风",26,"神经科2班"));
System.out.println("学号\t\t姓名\t\t年龄\t\t班级");
// 3.遍历集合中的每个学生对象并展示其数据
for (int i = 0; i < students.size(); i++) {
Student s=students.get(i);
System.out.println(s.getId()+"\t\t"+s.getName()+"\t\t"+s.getAge()+"\t\t"+s.getSclass());
}
// 4.让用户不断的输入学号,可以搜索出该学生对象信息并展示出来(独立成方法)
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请您输入要查询的学生的学号:");
int id = sc.nextInt();
Student s=getStudentByid(students,id);
// 判断学号是否存在
if(s!=null){
// 找到该学生了,信息如下
System.out.println(s.getId()+"\t\t"+s.getName()+"\t\t"+s.getAge()+"\t\t"+s.getSclass());
}else{
System.out.println("查无此人");
}
}
}
/**
* 根据学号,去集合中找出学生对象并返回
* @param students
* @param id
* @return
*/
public static Student getStudentByid(ArrayList<Student> students,int id){
for (int i = 0; i < students.size(); i++) {
Student s=students.get(i);
if(s.getId()==id){
return s;
}
}
return null; //查无此学号
}