JavaSE基础笔记——字符串常用类/ArrayList(集合)

1、字符串常用类

在JDK里设计了三个类都可以来表示字符串:String;StringBuffer;StringBuilder。

String概述:

  • 代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
  • Java程序里的所有字符串文字(例如:"abc")都为此类的对象。
  • Java里一个非常特殊的引用数据类型;它是唯一一个有常量表示形式的对象。这一点跟基本数据类型一样。
  • String类提供了大量的方法来方便我们调用,实现对字符串的各种操作;
  • 为了提高性能,Java专门为String设计了“字符串常量池”。

String name = "张三";

String类的特点:

String其实常被称为不可变字符串类型,它的对象在创建后不能被修改。

String类不可变的原因:

String变量每次修改其实都是产生并指向了新的字符串对象。原来的字符串对象都是没有改变的,所以称不可变字符串。

StringBuffer

StringBuffer类与String类没有任何继承关系,所以不能直接给StringBuffer的对象复制字符串常量,必须用new的语法。

StringBuffer的对象提供了大量的跟字符串拼接的相关方法,最常用的是append、insert、replace、delete;

所有这些方法都是改变当前的StringBuilder对象。

StringBuffer stringBuffer = new StringBuffer("hello");
        stringBuffer.append("hello");//在尾部添加,拼接内容
        System.out.println(stringBuffer);
        stringBuffer.insert(2,"Java");//往某个位置插入内容
        System.out.println(stringBuffer);
        stringBuffer.replace(3,5,"LOVO");//把三到五的字符替换;前闭后开
        System.out.println(stringBuffer);
        stringBuffer.delete(3,5);

StringBuffer对比StringBuilder

这两个类都是可变的字符串序列,两个类提供的方法是完全一样的。唯一的区别是:

StringBuffer线程安全;来自于Java1.0版本

StringBuilder线程不安全。来自于Java1.5版本

记一个结论:

凡是线程安全的,执行效率会降低;凡是线程不安全的,执行效率会高。

创建字符串对象的2种方式(区别:面试常考

方式一:以"" 方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。(推荐方式)

//1、方式一:直接使用双引号得到字符串对象
        String name = "我爱你中国";
        System.out.println(name);

方式二:通过String类的构造器new对象,每new一次都会产生一个新对象,放在堆内存中。

String s1 = new String();

  1. public String (); 创建一个空白字符串对象,不含有任何内容(几乎不用)

  2. public String (String original); 根据传入的字符串内容,来创建字符串对象(几乎不用)

  3. public String(char[] chs); 根据字符数组的内容,来创建字符串对象

  4. public String (byte[] chs); 根据字节数组的内容,来创建字符串对象



        //2、方式二:通过String类的构造器创建对象。
        //1、public String (); 创建一个空白字符串对象,不含有任何内容(几乎不用)
        String s1 = new String(); //s1 = " "
        System.out.println(s1);

        //2、public String (String original); 根据传入的字符串内容,来创建字符串对象(几乎不用)
        String s2 = new String("我是中国人");
        System.out.println(s2);

        //3、public String(char[] chs); 根据字符数组的内容,来创建字符串对象
        char[] chars = {'a' , 'b' , '中' , '国'};
        String s3 = new String(chars);
        System.out.println(s3);

        //4、public String (byte[] chs); 根据字节数组的内容,来创建字符串对象
        byte [] bytes = {97, 98, 99, 65, 66, 67};
        String s4 = new String(bytes);
        System.out.println(s4);

两种方式的区别代码演示:

 //区别2
        String ss1 = "abc";
        String ss2 = "abc";
        System.out.println(ss1 == ss2);//true


        char[] chars1 = {'a' , 'b' , 'c' };
        String ss3 = new String(chars1);
        String ss4 = new String(chars1);
        System.out.println(ss3 == ss4);//false

 String类常见的面试题

//面试题1!
        String s4 = new String("qwe");//实际上生成了两个对象(双引号生成的字符串常量池的对象;和new生成的堆内存里的对象)
        String s3 = "qwe";//这里生成了0个对象,因为s4已经在字符串常量池里生成了"qwe"对象
        System.out.println(s4 == s3);//false,s3的地址指向字符串常量池,而s4的地址指向堆内存里。
//面试题2
        String s1 = "abc";//在字符串常量池里生成"abc"
        String s2 = "a" + "b" + "c";//因为Java存在编译优化机制,程序在编译时:"a","b","c"会直接转成"abc"。  浪费性能
        // 因此它也在字符串常量池里生成"abc",而常量池已经有了"abc",因此s1和s2指向同一地址,为true
        System.out.println(s1 == s2);//true
//面试题3
        String s5 = "abc";//在字符串常量池里生成"abc"
        String s6 = "ab";//在字符串常量池里生成"ab"
        String s7 = s6 + "c";//s7不是双引号直接给i出来的,因此它指向堆内存中的"abc",s6是一个变量
        System.out.println(s5 == s7);//false

String类常用API(功能)——字符串大小比较;字符串内容比较

字符串大小比较

int value = "hello".compareTo("world");//比较两个字符串的大小
        /*
        compareTo方法是按照字典顺序比较两个字符串的大小,返回的是它们的差值,是int值
        相对于做的就是字符串1 - 字符串2 之后的结果。如果是正数,说明字符串1大;反之字符串2大。
        字典顺序的比较规则:
        1、用两个字符串的第一对同位置,不同字符的Ascii码之差作为结果;
        Hello和hello,结果是-32
        2、如果没有同位置不同字符出现,那么就用两者的长度之差作为结果。
        hello helloworld,结果是-5
         */
        value = "hello".compareToIgnoreCase("HELLO");//忽略大小写,比较两个字符串的大小

        str.toUpperCase();//变大写
        str.toLowerCase();//变小写

字符串的内容比较不适合用"=="比较。
字符串内容比较推荐使用String类提供的"equals"比较:只关心内容一样即可。
开发中什么时候使用==比较数据:基本数据类型比较时使用。

例子:用户登录

public static void main(String[] args) {
        //1、正确登录名和密码
        String okname = "admin";
        String okPassword = "123456";

        //2、请您输入登录名称和密码
        Scanner sc = new Scanner(System.in);
        System.out.println("登录名称: ");
        String name = sc.next();
        System.out.println("登录密码: ");
        String Password = sc.next();

        //3、判断用户输入的登录名称和密码与正确的内容是否相等
        if (okname.equals(name)  && okPassword.equals(Password) ){
            System.out.println("登陆成功!");
        }else{
            System.out.println("用户名或者密码错误了!");
        }
    }

忽略大小写比较内容的API(用于比较验证码这样的业务逻辑)

//4、忽略大小写比较内容的Api,一般用于比较验证码这样的业务逻辑
        String sysCode = "23AdFH";
        String code1 = "23aDfH";
        System.out.println(sysCode.equals(code1)); // false  此方法只适合内容完全相等的情况
        System.out.println(sysCode.equalsIgnoreCase(code1)); // ture   这个方法适合验证码这种,忽略字符串大小写,只比较内容即可。

String类常用API(功能、方法)——遍历、替换、截取、分割操作

  1. public int length(); 获取字符串的长度

  2. public char charAt(int index): 获取某个索引位置处的字符

  3. 遍历字符串中的每个字符

  4. public char[] toCharArray() : 把字符串转换成字符数组,越界会报StringIndexOutOfBoundsException异常

  5. public String substring(int beginIndex, int endIndex) : 截取内容(包前不包后的)

  6. public String substring(int beginIndex) : 从当前索引一直截取到末尾。

  7. public String replace(CharSequence target,CharSequence replacement) :替换。使用新值,将字符串中的旧值替换,得到新的字符串

  8. public boolean contains(CharSequence s) :判断文章中包不包含一些关键字

  9. public boolean startsWiths(String prefix) :判断以什么开始(ebdsWith:判断字符串以什么结束)

  10. public String [] split(String s) : 按照某个内容把字符串分割成字符串数组返回

  11. indexOf和lastIndexOf:通过字符去获取该字符在String中首次出现的位置;最后一次出现的位置。indexOf和lastIndexOf有一些重载方法,还可以获取某个子字符串的位置,或是指定从哪个位置开始查询

代码演示:

 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);

        System.out.println("------------遍历字符串中的每个字符-----------------------");
        for (int i = 0; i <name.length() ; i++) {
            char ch = name.charAt(i);
            System.out.println(ch);
        }
        //3、public char[] toCharArray() : 把字符串转换成字符数组
        char[] chars = name.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char ch = chars[i];
            System.out.println(ch);
        }
        //4、public String substring(int beginIndex, int endIndex) : 截取内容(包前不包后的)
        String name2 = "java是最厉害的编程语言!"; // 截取到“的”
        String rs = name2.substring(0,9);
        System.out.println(rs);
        String rs1 = name2.substring(4,9); //截取“是最厉害的”
        System.out.println(rs1);

        //5、public String substring(int beginIndex) : 从当前索引一直截取到末尾
        String rs2 = name2.substring(4);
        System.out.println(rs2);

        //6、public String replace(CharSequence target,CharSequence replacement) :替换。使用新值,将字符串中的旧值替换,得到新的字符串
        String name3 = "金三胖是最厉害的80后,金三胖棒棒的!我好爱金三胖!";
        String rs3 = name3.replace("金三胖" , "***");
        System.out.println(rs3);

        //7、public boolean contains(CharSequence s) :判断文章中包不包含一些关键字
        System.out.println(name3.contains("金三胖")); // true
        System.out.println(name3.contains("金二胖")); // false

        //8、public boolean startsWiths(String prefix) :判断以什么开始
        System.out.println(name3.startsWith("金三胖")); //true
        System.out.println(name3.startsWith("金三胖是最厉害的")); //true
        System.out.println(name3.startsWith("金三胖是最厉害的2")); //false

        //9、public String [] split(String s) : 按照某个内容把字符串分割成字符串数组返回
        String name4 = "王宝强,贾乃亮,陈羽凡";
        String [] names = name4.split(",");
        for (int i = 0; i < names.length; i++) {
            System.out.println("选择了:" + names[i]);
        }

        //10、indexOf和lastIndexOf
        String str = "helloWorld";
        int index = str.indexOf('a');//通过字符去获取该字符在String中首次出现的位置
        //        System.out.println(index);
        index = str.lastIndexOf("l");//最后一次出现的位置
        //        System.out.println(index);

    }

 String类的三个特殊方法:

1、trim去掉字符串前后的空格(使用较多)

2、split字符串拆分

3、matches正则表达式校验

正则表达式在这个连接有详细写到。

JavaSE基础笔记——常用API、Lambda、常见算法_小曹爱编程!的博客-CSDN博客JavaSE基础笔记——常用API、Lambda、常见算法主要包括:日期与时间、JDK8开始新增的日期API、包装类、正则表达式、Arrays、常见算法:选择、冒泡排序和二分查找、Lambda表达式https://blog.csdn.net/weixin_62993347/article/details/126088041?spm=1001.2014.3001.5501

//3、三个特殊方法
        //3-1、trim——去掉字符串前后的空格(使用较多)
        String input = "   hello    world  ";
        input = input.trim();
//        System.out.println(input);
//        System.out.println(input.length());

        //3-2、split——字符串拆分
        /*
        如果在字符串尾部出现分隔符且后面没有内容,那么不会放置一个空串到数组里;
        如果字符串头部出现分隔符或中间出现连续分割符,都会把拆分得到的空串放入到数组里。
         */
        String msg = "zhangsan-123456-000000";
        String [] strs = msg.split("-");
//        System.out.println(strs.length);

        //3-3、matches——正则表达式校验`
        /*
        正则表达式是一种专门用来规范字符串内容和格式的表达式
        英文:regex 凡是以后看到参数名字是它,就说明改参数可以传入一个正则表达式
        正则表达式首先在本质上自己就是一个字符串,也就是说任意一个字符串都是正则。
        比如:“hello”就是一个正则表达式,只不过没有使用模糊符合,所以只能做原样匹配,就相当于equals了。
        因此,我们主要要学习如何使用它的模糊匹配符合。其中最关键的就是三种括号。
        []---表示一个字符能够使用哪些符合
             [abc]只能是a, b, 或c
             [0-9] [a-zA-Z]
             有一个特殊符号^异或,它在正则表达式里表示“除了。。。之外”
             [^0-9]除了0-9之外都可以
        {}---表示的是之前的正则表达式允许出现的次数。
             标准语法:[h]{m,n}---至少出现m次,至多出现n次
                    {m,}---至少出现m次,最多不限制
                    {m}---只能出现m次
                    注意:没有{,m}这种写法
                    还有几种简写: * ---0到任意多次
                                + --- 一次或多次,至少一次
                                ? --- 0-1次(一次或根本不)
        ()---分组
                (表达式1|表达式2|表达式3......)---表示的含义是表达式1可以,或表达式2也可以,3也可以。。。。。
         */
        Scanner sc = new Scanner(System.in);
        /*System.out.println("请输入一个电话号码");
        String tel = sc.next();

        if (tel.matches("8320([0-9]{4})|110|119|120")){
            System.out.println("是电子科大");
        }else{
            System.out.println("不是电子科大");
        }*/

/*        while (true) {
            System.out.println("输入金额:");
            String money = sc.next();
            TestString atm = new TestString();
            System.out.println(atm.judgeMoney(money));
        }*/

        String inputMoney = JOptionPane.showInputDialog(null,"请输入你要提取的金额:");
        String regex = "([1-9][0-9]?|1[0-9]{2}|200)00";
        if (inputMoney.matches(regex)){
            System.out.println("有效金额");
            int money = Integer.parseInt(inputMoney);
        }else {
            System.out.println("无效金额");
        }

        /*
        String当中的split和replaceAll方法也是支持正则表达式的
         */

        str = "zhang3?123456-11000-male";
        strs = str.split("[?-]");

        str.replaceAll("[?-]","!");
        strs = str.split("//?");
        /*
        注意:当我们需要某个特殊的正则表达式符合作为字符来使用的时候,需要进行转意。
        而正则表达式里不是用/来做转意的,我们需要用[]来表示,这是一个字符,然后把
        该特殊符号写在[]里。
         */



    }

/*     private boolean judgeMoney(String money){
        int judgeMoney = Integer.parseInt(money);
        if (judgeMoney>0 && money.matches("(([1][0-9]{2})|(200)|([1-9][0-9])|([1-9]))00")){
            return true;
        }
        return false;
    }*/

String案例:

1、练习题:使用String完成随机生成五位数的验证码,每位可能是数字、大写字母、小写字母。

    public static void main(String[] args) {
        //1、定义可能出现的字符信息
        String dates = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        //2、循环五次,每次生产一个随机的索引,提取对应的字符连接起来即可
        String code = "";//定义一个空字符串
        Random r = new Random();
        for (int i = 0; i < 5; i++) {
            //随机一个索引
            int index = r.nextInt(dates.length());
            //根据随机的索引,将这个索引位置的字符加进去
            char c = dates.charAt(index);
            code += c;
        }

        //3、输出字符串变量即可
        System.out.println(code);
    }

2、练习题:模拟用户登录(最多给三次机会)

    public static void main(String[] args) {
        //1、定义正确的登录名称和密码
        String okLoginName = "admin";
        String okPassword = "123456";
        
        //2、定义一个循环,循环3次,让用户登录
        Scanner sc = new Scanner(System.in);
        for (int i = 1; i <= 3; i++) {
            System.out.println("请您输入登录名称: ");
            String loginName = sc.next();
            System.out.println("请您输入登录密码: ");
            String password = sc.next();

            //3、判断登录是否成功!
            if (okLoginName.equals(loginName)){
                //4、判断密码是否正确
                if (okPassword.equals(password)){
                    System.out.println("登录成功!欢迎进入系统浏览---");
                    break;
                }else{
                    //登录名正确,秘密错误
                    System.out.println("您的密码不正确!您还剩余" + (3-i) + "次机会登录");
                }
            }else{
                System.out.println("登录名称错误了!您还剩余" + (3-i) + "次机会登录");
            }
        }
    }

3、练习题:手机号码屏蔽:需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽

比如:139****7675

    public static void main(String[] args) {
        // 1、键盘录入一个手机号码
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入您的手机号码: ");
        String tel = sc.next();

        //2、截取号码的前三位后四位
        String before = tel.substring(0,3);// 0 1 2
        String after = tel.substring(7); //从索引7开始截取到手机号码末尾

        String s = before+ "****" + after ;
        System.out.println(s);
    }

2、ArrayList(集合) 

集合与数组类似,也是一种容器,用于装数据的。

数组的特点:

  • 数组定义完成并启动后,类型确定,长度固定。
  • 问题:在个数不确定,且要进行增删数据操作的时候,数组是不太合适的。

集合的特点:

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
  • 集合非常适合做元素个数不确定,且要进行增删操作的业务场景。

ArrayList集合:

它是集合的一种,它支持索引。

ArrayList集合的对象获取:

构造器:public ArrayList()   (说明:创建一个空的集合对象)

//1、创建ArrayList集合的对象
        ArrayList list = new ArrayList();

ArrayList集合添加元素的方法:

1、public boolean add(E e)将指定的元素追加到次集合的末尾

//2、添加数据
        list.add("Java");
        list.add("Java");
        list.add("MySQL");
        list.add("黑马");
        list.add(23);
        list.add(23.5);
        list.add(false);
        list.add('中');
        System.out.println(list);//[Java, Java, MySQL, 黑马, 23, 23.5, false, 中]

2、public void add(int index, E element)在此集合中的指定位置插入指定的元素

//3、给指定索引位置插入元素
        list.add(1,"张三");
        System.out.println(list);//[Java, 赵敏, Java, MySQL, 黑马, 23, 23.5, false, 中]

泛型概述: 

  • ArrayList<E>其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。
  • 比如:ArrayList<String>:此集合只能操作字符串类型的元素;
  • ArrayList<Integer>:此集合只能操作整数类型的元素。
  • 注意:集合中只能存储引用类型,不支持基本数据类型。
public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        ArrayList<String> list1 = new ArrayList<>(); //JDK1.7开始,泛型后面的类型申明可以不写
        list.add("Java");
        list.add("MySQL");
//        list.add(23);
//        list.add(23.5);

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(23);
        list2.add(100);
//        list2.add("Java");
    }

ArrayList常用API(方法):遍历

  1. public E get(int index) : 获取某个索引位置处的元素值

  2. public int size() :获取集合的大小(元素个数)

  3. 完成集合的遍历

  4. public E remove(int index) : 删除某个索引位置处的元素值,并返回被删除的元素值

  5. public boolean remove (Object o) : 直接删除元素值,删除成功返回true,删除失败返回false

  6. public E set(int index,E element) :修改某个索引位置处的元素值

代码实现:

public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>() ;
        list.add("Java");
        list.add("Java");
        list.add("MySQL");
        list.add("MyBatis");
        list.add("HTML");
        //1、public E get(int index) : 获取某个索引位置处的元素值
        String e = list.get(3);
        System.out.println(e);//MyBatis

        //2、public int size() :获取集合的大小(元素个数)
        System.out.println(list.size());//5

        //3、完成集合的遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
//Java
Java
MySQL
MyBatis
HTML

        //4、public E remove(int index) : 删除某个索引位置处的元素值,并返回被删除的元素值
        System.out.println(list); // [Java, Java, MySQL, MyBatis, HTML]
        String e2 = list.remove(2);
        System.out.println(e2);//MySQL
        System.out.println(list);//[Java, Java, MyBatis, HTML]

        //5、public boolean remove (Object o) : 直接删除元素值,删除成功返回true,删除失败返回false
        System.out.println(list.remove("MyBatis"));//true
        System.out.println(list);//[Java, Java, HTML]

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("Java");
        list1.add("王宝强");
        list1.add("Java");
        list1.add("MySQL");
        System.out.println(list1);//[Java, 王宝强, Java, MySQL]
        // 只会删除第一次出现的这个元素值,后面的不删除
        System.out.println(list1.remove("Java"));//true
        System.out.println(list1);//[王宝强, Java, MySQL]

        //6、public E set(int index,E element) :修改某个索引位置处的元素值
        String e3 = list1.set(0, "贾乃亮");
        System.out.println(e3);//王宝强
        System.out.println(list1);//[贾乃亮, Java, MySQL]
    }

 ArrayList集合案例

1、遍历并删除元素

 public static void main(String[] args) {
        //案例:遍历并删除元素值:从集合后面遍历去删除
        // 需求:某个班级的考试在系统上进行,成绩大致为:98,77,66,89,79,50,100;
        // 现需要先把成绩低于80分以下的数据去掉
        //1、创建一个ArrayList集合存储一个班级学生的成绩
        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);

        //2、把低于80分的成绩从集合中去掉。

        //有毛病的代码
//        for (int i = 0; i < scores.size(); i++) {
//            int score = scores.get(i);
//            if (score < 80){
//                //这个分数必须删除
//                scores.remove(i);
//            }
//        }
//        System.out.println(scores);

        //完美的方案之一
        /*for (int i = 0; i < scores.size(); i++) {
            int score = scores.get(i);
            if (score < 80){
                //这个分数必须删除
                scores.remove(i);
                i--; //删除成功后,必须退一步,这样可以保证下次回到这个位置,如此则不会跳过数据;删除一个数字后,需要让遍历会退一个数据,不然会导致有数字没有判断到
            }
        }
        System.out.println(scores);*/

        //scores = [98, 77, 66, 89, 79, 50, 100]
        //                                    i
        //完美方案之二:从后面倒着遍历再删除就可以
        for (int i = scores.size(); i >= 0; i--) {
            int score = scores.get(i);
            if (score < 80){
                //这个分数必须删除
                scores.remove(i);
            }
        }
        System.out.println(scores);
    }

2、需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来

public static void main(String[] args) {
        // 目标:理解ArrayList集合存储自定义类型的对象
        //1、定义一个电影类
        //2、创建三个电影对象
        Movie m1 = new Movie("《肖生克的救赎》" , 9.7 ,"罗宾汉");
        Movie m2 = new Movie("《霸王别姬》" , 9.6 ,"张国荣、张丰毅");
        Movie m3 = new Movie("《阿甘正传》" , 9.5 ,"汤姆.汉克斯");
        //3、创建一个电影类型的ArrayList集合,存储三部电影对象
        ArrayList<Movie> movies = new ArrayList<>();
        movies.add(m1);
        movies.add(m2);
        movies.add(m3);

        //4、遍历电影类型的集合中的每个电影对象,访问它的信息
        for (int i = 0; i < movies.size(); i++) {
            // i = 0 1 2
            Movie m = movies.get(i);
            System.out.println("电影名称:" + m.getName());
            System.out.println("电影评分:" + m.getScore());
            System.out.println("电影主演:" + m.getActor());
            System.out.println("-------------------------");
        }
    }

电影类:

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

3、案例:学生信息系统的数据搜索
需求:后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能。

学生班类信息(学号,姓名,性别,班级)
测试数据:
"20180302","叶孤城",23,"护理一班"
"20180303","东方不败",23,"推拿二班"
"20180304","西门吹雪",26,"中药学四班"
"20180305","梅超风",26,"神经科二班"

    public static void main(String[] args) {
        //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,"神经科二班"));

        //3、遍历这些学生信息展示
        System.out.println("学号\t名字\t年龄\t班级");
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println(s.getStudyNumber()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getClassName());
        }

        //4、定义方法完成按照学号的搜索功能
        Scanner sc = new Scanner(System.in);
        while(true){
            System.out.println("请您输入学号查询学生对象:");
            String studyNumber = sc.next();
            //5、调用方法查询
            Student s = getStudentById(students,studyNumber);
            //6、判断s中是否存在学生对象地址
            if (s == null){
                System.out.println("对不起,查无此人--");
            }else{
                System.out.println("您查询的学生信息如下: ");
                System.out.println(s.getStudyNumber()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getClassName());
            }
        }
    }

    /**
     * 根据学生的学会查询学生对象返回
     * @param students  存储全部学生对象的集合
     * @param studyNumber 搜索的学生的学号
     * @return 返回学生对象|null
     */
    public static Student getStudentById(ArrayList<Student> students,String studyNumber){
        //1、遍历全部学生对象
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            //2、询问当前遍历的这个学生对象的学号,是否是我们要找的学号
            if (s.getStudyNumber().equals(studyNumber)){
                //这个s代表的学生对象,就是我们要找的;返回它
                return s;
            }
        }
        //查无此人
        return null;
    }


/*
也可以定义一个无返回值的方法,即在方法里写输出的信息
*/
/*        //5、按照学号搜索学生信息的功能
        //定义一个方法
        while (true){
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您要搜索的学生的学号:");
            String newStudyNo = sc.next();
            //调用方法
            getStudentInformation(students,newStudyNo);
        }*/
    //按照学号搜索学生信息的方法
    /*public static void getStudentInformation(ArrayList<Student> students,String newStudyNo){
        //遍历集合,判断集合里的学号与搜索的学号相不相同
        for (int i = 0; i < students.size(); i++) {
            Student newStudent = students.get(i);
            if (newStudent.getStudyNo().equals(newStudyNo)){
                System.out.println("这个学生的信息为:");
                System.out.println( newStudent.getStudyNo()  +"\t"+ newStudent.getName()  +"\t\t"+ newStudent.getAge()  +"\t"+ newStudent.getStudyClass());
                break;
            }else{
                System.out.println("对不起,您输入的学号查无此人,请重新输入:");
                break;
            }
        }
    }*/

学生类:

public class Student {
    private String studyNumber;
    private String name;
    private int age;
    private String className;

    public Student() {
    }

    public Student(String studyNumber, String name, int age, String className) {
        this.studyNumber = studyNumber;
        this.name = name;
        this.age = age;
        this.className = className;
    }

    public String getStudyNumber() {
        return studyNumber;
    }

    public void setStudyNumber(String studyNumber) {
        this.studyNumber = studyNumber;
    }

    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 getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值