Java - day8 - 常用APl(String,ArrayList)


Java - day8 - 常用APl(String,ArrayList)

APl (Application Programming Interface,应用程序编程接口)

String简单介绍

  • String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用。
  • 例:登录:需要跟正确的用户名和密码进行比较。
  • 例:敏感词:敏感词替换。

ArrayList简单介绍

  • ArrayList代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的。
  • 通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用,更丰富的API(功能)给程序员使用。
  • 例:购物车使用集合对象来存储商品对象更合适,随时可能添加新商品对象进来(个数不确定),也随时可能删除商品对象。

String概述

  • java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。
  • Java程序中的所有字符串文字(例如“abc”)都为此类的对象。
    实例:

    String name ="李三";
    String schoolName ="政治";
    

String类的特点详解

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

String是不可变字符串的原因?

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

创建字符串对象的2种方式

  • 方式一:直接使用 " " 定义。(推荐方式)

    String name ="李三";
    
  • 方式二:通过String类的构造器创建对象。

实例:

package string;
/**
 目标:String类创建字符串对象的2种方式
 */
public class ss {
    public static void main(String[] args) {
        // 方式一:直接使用双引号得到字符串对象
        String name = "我爱你中国";
        System.out.println(name);

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

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

        // 3、public String(char[] c): 根据字符数组的内容,来创建字符串对象
        char[] chars = {'a' , 'b' , '中', '国'};
        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);  //abcABC

        System.out.println("---------------------------------------");
        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
    }
}

有什么区别吗?(面试常考)

  • 以 " " 方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
  • 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。

String常见面试题

问题:下列代码的运行结果是?

//false
public class Test2 {
public static void main( String[] args) {
String s2 = new String( "abc");
String s1 ="abc" ;
system.out.println(s1 == s2);  //false
}
}
//false
public class Test3 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
system.out.println(s1 == s3);  //false
}
}
//true
public class Test4 {
public static void main( String[] args) {
String s1 = "abc";
string s2 = "a" +"b” + "c" ;System.out.println(s1 == s2);
}
}  //Java存在编译优化机制,程序在编译时:“a”+“b”+“c”会直接转成"abc"

如果是字符串比较应该使用使用什么方式进行比较,为什么?

  • 使用String提供的equlas方法。
  • 只关心内容一样就返回true。

开发中什么时候使用==比较数据

  • 基本数据类型比较时使用。

实例:

public boolean equals (object anobject)

将此字符串与指定对象进行比较。只关心字符内容是否一致!

public boolean equalsIgnoreCase (string aotherstring)

将此字符串与指定对象进行比较,忽略大小写比较字符串。只关心字符内容是否一致!

package string;
import java.util.Scanner;

public class eauals {
    public static void main(String[] args) {
        String name = "qwer";
        String pass = "1234";

        Scanner sc = new Scanner(System.in);
        System.out.println("登录名称:");
        String name2 = sc.next();
        System.out.println("登录密码:");
        String pass2 = sc.next();

        if (name.equals(name2) && pass.equals(pass2)){
            System.out.println("成功");
        }else {
            System.out.println("失败");
        }

        //4、忽略大小写比较内容的Api:一般用于比较验证码这样的业务逻辑string syscode = "23AdFh" ;
        String sysCode = "23aDfH" ;
        String code1 = "23adfH" ;
        System.out.println(sysCode.equals(code1)); //false
        System.out.println(sysCode.equalsIgnoreCase(code1)); //true
    }
}

实例:

package string;

/**
 目标:掌握String常用的其他API。
 */
public class cyong_api {
    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是最厉害的编程语言!";
        //              01234567   89
        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 startsWith(String prefix)
        System.out.println(name3.startsWith("金三胖"));
        System.out.println(name3.startsWith("金三胖是最厉害的"));
        System.out.println(name3.startsWith("金三胖是最厉害的2"));

        // 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]);
        }
    }
}

实例:

package string;
import java.util.Random;

public class 随机验证码 {
    public static void main(String[] args) {
        String datas = "qwertyuiopasdfghjklzxcxvmb";

        String code = "";
        Random r = new Random();
        for (int i = 0; i < 5; i++) {
            int index = r.nextInt(datas.length());
            char c = datas.charAt(index);
            code += c;
        }
        System.out.println(code);
    }
}

实例:

package string;
import java.util.Scanner;

public class 登录 {
    public static void main(String[] args) {
        String login = "admin";
        String pass = "1234";

        Scanner sc = new Scanner(System.in);
        for (int i = 0; i <=3 ; i++) {
            System.out.println("登录名称:");
            String login2 = sc.next();
            System.out.println("登录密码:");
            String pass2 = sc.next();

            if (login.equals(login2)){
                if (pass.equals(pass2)){
                    System.out.println("成功");
                    break;
                }else {
                    System.out.println("错误"+(3 - i) + "次机会");
                }
            }else {
                System.out.println("错误"+(3 - i) + "次机会");
            }
        }
    }
}

实例:

package string;
import java.util.Scanner;

public class 屏蔽手机号 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("手机号:");
        String tel = sc.next();

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

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

ArrayList - 集合

数组和集合的元素存储的个数问题?

  • 数组定义后类型确定,长度固定
  • 集合类型可以不固定,大小是可变的。

数组和集合适合的场景

  • 数组适合做数据个数和类型确定的场景
  • 集合适合做数据个数不确定,且要做增删元素的场景

ArrayList集合

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

ArrayList集合的对象获取

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

ArrayList集合添加元素的方法

  • 方法名1:public boolean add(E e)
  • 说明1:将指定的元素追加到此集合的未尾
  • 方法名:2:public void add(int index,E element)
  • 说明2:在此集合中的指定位置插入指定的元素

实例:

package string;
import  java .util.ArrayList;

public class ArrayList2 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();

        list.add("aa");
        list.add("a2a");
        list.add("a23a");
        list.add(11);
        list.add(54.6);
        list.add(false);

        System.out.println(list);
    }
}

ArrayList类如何创建集合对象的,如何添加元素?

  • ArrayList list = new ArrayList();
  • public boolean add(E e)
  • public void add(int index,E element)

ArrayList对于泛型的支持

泛型概述

  • ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。

举例:

  • ArrayList<String> :此集合只能操作字符串类型的元素。
  • ArrayList<lnteger>:此集合只能操作整数类型的元素。
  • 注意:集合中只能存储引用类型,不支持基本数据类型。

怎么去统一ArrayList集合操作的元素类型?

  • 使用泛型:<数据类型>
  • ArrayList<String> list1 = new ArrayList();

实例:

package string;
import java.util.ArrayList;

//目标:能够使用泛型约束ArrayList集合操作的数据类型
public class 泛型 {
    public static void main(String[] args) {
        //ArrayList<string> list = new ArrayList<string>();
        //JDK 1.7开始,泛型后面的类型申明可以不写
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");

        //泛型定义集合是一种规范
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(123);
    }
}

ArrayList常用API、遍历

实例:

package string;
import java.util.ArrayList;

/**
 目标:掌握ArrayList集合的常用API
 */
public class ArrayListDemo3 {
    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);

        // 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); // [Java, Java, MySQL, MyBatis, HTML]
        String e2 = list.remove(2);
        System.out.println(e2);
        System.out.println(list);

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

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("Java");
        list1.add("王宝强");
        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 , "贾乃亮");
        System.out.println(e3);
        System.out.println(list1);

    }
}

ArrayList集合案例:遍历并删除元素

实例:

package string;
import java.util.ArrayList;

/**
 案例:从集合中遍历元素且删除。
 */
public class ArrayListTest4 {
    public static void main(String[] args) {
        // 1、创建集合对象:存入学生成绩(98,77,66,89,79,50,100)
        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);

        for (int i = scores.size() -1 ; i >= 0 ; i--) {
            int score = scores.get(i);
            if (score <80){
                scores.remove(i);
            }
        }
        System.out.println(scores);
    }
}

ArrayList集合案例:存储自定义类型的对象

实例:(movie类请自己创建)

package movie;
import java.util.ArrayList;

/**
 案例:集合存储自定义元素并遍历。
 需求:定义电影类(名称,分值,演员),创建3个电影对象,代表三部影片,存入集合中并遍历。
 《肖生克的救赎》, 9.7 , 罗宾斯
 《霸王别姬》, 9.6 , 张国荣、张丰毅
 《阿甘正传》, 9.5 , 汤姆.汉克斯
 */
public class movie2 {
    public static void main(String[] args) {
        ArrayList<movie> movies = new ArrayList<>();
        movie m1 = new movie("lisi",5.5,"dd");
        movie m2 = new movie("lis2i",5.3,"dd1");
        movie m3 = new movie("li3si",5.7,"d3d");

        movies.add(m1);
        movies.add(m2);
        movies.add(m3);
        System.out.println(movies);

        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("===========");
        }
    }
}

ArrayList集合案例:元素搜索

实例:(student类请自己创建)

package student;
import java.util.ArrayList;
import java.util.Scanner;

/**
 案例:学生信息系统:展示数据,并按照学号完成搜索
 学生类信息(学号,姓名,性别,班级)
 测试数据:
 "20180302","叶孤城",23,"护理一班"
 "20180303","东方不败",23,"推拿二班"
 "20180304","西门吹雪",26,"中药学四班"
 "20180305","梅超风",26,"神经科2班"
 */
public class SU {
    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,"神经科2班"));
        System.out.println("学号\t\t名称\t年龄\t\t班级");

        // 3、遍历集合中的每个学生对象并展示其数据
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println(s.getStudyId() +"\t\t" + s.getName()+"\t\t"
                    + s.getAge() +"\t\t" + s.getClassName());
        }

        // 4、让用户不断的输入学号,可以搜索出该学生对象信息并展示出来(独立成方法)
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入要查询的学生的学号:");
            String id = sc.next();
            Student s = getStudentByStudyId(students, id);
            // 判断学号是否存在
            if(s == null){
                System.out.println("查无此人!");
            }else {
                // 找到了该学生对象了,信息如下
                System.out.println(s.getStudyId() +"\t\t" + s.getName()+"\t\t"
                        + s.getAge() +"\t\t" + s.getClassName());
            }
        }
    }

    /**
     根据学号,去集合中找出学生对象并返回。
     * @param students
     * @param studyId
     * @return
     */
    public static Student getStudentByStudyId(ArrayList<Student> students, String studyId){
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            if(s.getStudyId().equals(studyId)){
                return s;
            }
        }
        return null; // 查无此学号!
    }
}

声明:三二一的一的二|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Java - day8 - 常用APl(String,ArrayList)


三二一的一的二