0
点赞
收藏
分享

微信扫一扫

【JAVA基础】重新系统学习Java(七)常用API(String、ArrayList)

AbrahamW 2022-04-27 阅读 93
java

目录

常用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;
    }
}

举报

相关推荐

0 条评论