2.String-Arraylist_API---黑马程序员

String-Arraylist

package包

D:\code\黑马\code\api-app\src\com\itheima\pkg

IDEA中自动导包设置:

image-20230721085651603

在自己的类中调用其他包下的类的注意事项

  • 使用同一个包下的其他类时,无需导包,可直接使用
  • 使用其他包下的类时,必须先导包
    • import 包名.类名
  • 在当前类中调用API, 也要先导包
    • Java.lang包下的类无需导包,可直接使用
  • 访问不同包下的同名的类,默认只能导入一个包,其他同名的类要带包名来访问
//com.itheima.pkg.itheima下的Demo2
        Demo2 d3 = new Demo2();
        d3.print();
//com.itheima.pkg.itcast下的Demo2
//第二次出现类名相同的,只能在类名前加上包名
        com.itheima.pkg.itcast.Demo2 d4 = new com.itheima.pkg.itcast.Demo2();
        d4.print();

Java.lang.String

D:\code\黑马\code\api-app\src\com\itheima\string

String创建字符串对象的方式

  • 直接将字符串赋值给对象
String name = "LMH";
  • 使用构造器

image-20230721093841428

        String rs1 = new String();

        String rs2 = new String("itheima");

        char[] chars = {'L', 'M', 'H'};
        String rs3 = new String(chars);

        byte[] bytes = {97, 98, 99};
        String rs4 = new String(bytes);

常用方法

image-20230721094258676

  • 获取字符串长度
        String s = "LMH";
        int length = s.length();
        System.out.println("长度为:" + length);
//result:长度为:3
  • 获取字符串中对应的索引位置的字符
        String s = "LMH";
        char c = s.charAt(1);//返回位置1对应的字节
        System.out.println(c);
//result:M
  • 将字符串转换成数组
    String s = "LMH";
    char[] chars = s.toCharArray();//转换成char类型的数组
    for (int i = 0; i < chars.length; i++) {
        System.out.print(chars[i] + " ");
    }
//result: L M H 
  • 判断两个字符串是否相等
    String s1 = "LMH";
    String s2 = "LMH";
    System.out.println(s1 == s2); //是两个String类型对象的地址比较,一定不相等
    System.out.println(s1.equals(s2)); // 比较两个String对象类型的内容
//result:
        false
        true
  • 忽略大小写,判断两个字符串是否相等(常用于验证码校验)
    String c1 = "34AeFG";//验证码
    String c2 = "34aEfg";//用户输入
    System.out.println(c1.equals(c2)); 
    System.out.println(c1.equalsIgnoreCase(c2));
//result:
		false
		true
  • 通过索引截取字符串(包括开始索引,不包括结束索引)
        String s3 = "Java是最好的编程语言之一";
        String rs = s3.substring(0, 8);
        System.out.println(rs);
//result:Java是最好的
  • 只通过开始索引截取字符串
        String s3 = "Java是最好的编程语言之一";       
		String rs2 = s3.substring(5);
        System.out.println(rs2);
//result:最好的编程语言之一
  • 使用新值替换字符串中的旧值,常用于敏感词检测
        String info = "这个电影简直是个垃圾,垃圾电影!!";
        String rs3 = info.replace("垃圾", "**");
        System.out.println(rs3);
//result:这个电影简直是个**,**电影!!
  • 判断字符串中是否包含某个字符串(精准匹配,会判断大小写)
    String info2 = "Java是最好的编程语言之一,我爱Java!";
    System.out.println(info2.contains("Java"));
    System.out.println(info2.contains("java"));
    System.out.println(info2.contains("Java1"));
//result:
		true
		false
		false
  • 判断字符串是否以某个字符串开始,常用于姓氏判断
        String rs4 = "张三丰";
        System.out.println(rs4.startsWith("张"));
        System.out.println(rs4.startsWith("张三"));
        System.out.println(rs4.startsWith("张三1"));
//result:
		true
		true
		false
  • 将字符串按某个字符切割成字符串数组
        String rs5 = "张无忌,周芷若,殷素素,赵敏";
        String[] names = rs5.split(",");
        for (String name : names) {
            System.out.print(name + " ");
        }
//result: 张无忌 周芷若 殷素素 赵敏 

注意事项

  • String对象是不可变的字符串对象

    • 此时name中存的是堆内存中字符串常量池中的黑马的地址
    • 此时并未执行name += "程序员"中的=操作,仅仅执行了+操作
      • image-20230721103303225
    • 此时name中存的是经过常量池中”黑马“和”程序员“合并后生成的”黑马程序员“的新地址
    • 此时name += "程序员"中的=操作执行完毕
      • image-20230721103325550
  • 只要是以双引号给出的字符串对象会存储在堆内存的常量池中,而且内容相同时只会存储一份

    • image-20230721105446551

    •         String s1 = "abc";
              String s2 = "abc";
              System.out.println(s1 == s2);//判断s1与s2指向的堆内存中的地址是否一致
      //result:true
      
  • 使用构造方法创建字符串对象,每次new出来的都是一个新对象,每次都在堆内存中重新开辟空间,不考虑内容是否一致(是直接放在堆内存中的,不是放在堆内存的常量池中)

    • image-20230721110952606

    •         char[] chars = {'a', 'b', 'c'};
              String a1 = new String(chars);
              String a2 = new String(chars);
              System.out.println(a1 == a2);
      //result:false
      

笔试题

  1. image-20230721111359226

  2. 下面的s1指向堆内存中的常量池中的”abc“,s2 + c指向堆内存中新的对象”abc“,不在常量池中,因为出现了运算+,只要是运算,就不会放入堆内存的常量池中,而在堆内存中

image-20230721111520439

  1. 在对s2对象赋值之前,根据JAVA编译机制,“a” + “b” + c自动会先变成abc,因为这三个均为常量不是变量,而第2题中由于s2是变量,所以编译器无法在程序运行前知道s2的内容

image-20230721113204770

验证是否自动转为"abc",需要看反编译文件

D:\code\黑马\code\api-app\out\production\api-app\com\itheima\string

  • 源代码:
        String s3 = "abc";
        String s4 = "a" + "b" + "c";
        System.out.println(s1 == s2);
  • 编译后的class:
    String s3 = "abc";
    String s4 = "abc";
    System.out.println(s1 == s2);

案例

image-20230721114435447

public class StringTest4 {
    public static void main(String[] args) {
            // 1、开发一个登录界面
        for (int i = 0; i < 3; i++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请您输入登录名称:");
            String loginName = sc.next();
            System.out.println("请您输入登录密码:");
            String passWord = sc.next();

            // 5、开始调用登录方法,判断是否登录成功
            boolean rs = login(loginName, passWord);
            if(rs){
                System.out.println("恭喜您,欢迎进入系统~~");
                break; // 跳出for循环,代表登录完成
            }else {
                System.out.println("登录名或者密码错误,请您确认~~");
            }
        }
    }

    /**
      2、开发一个登录方法,接收用户的登录名和密码,返回认证的结果
     */
    public static boolean login(String loginName, String passWord){
        // 3、准备一份系统正确的登录名和密码
        String okLoginName = "itheima";
        String okPassWord = "123456";

        // 4、开始正式判断用户是否登录成功
        return okLoginName.equals(loginName) && okPassWord.equals(passWord);
    }
}

image-20230721114922475

public class StringTest5 {
    public static void main(String[] args) {
        System.out.println(createCode(4));
        System.out.println(createCode(6));
    }

    /**
       1、设计一个方法,返回指定位数的验证码
     */
    public static String createCode(int n){
        // 2、定义2个变量 一个是记住最终产生的随机验证码 一个是记住可能用到的全部字符
        String code = "";
        String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        Random r = new Random();
        // 3、开始定义一个循环产生每位随机字符
        for (int i = 0; i < n; i++) {
            // 4、随机一个字符范围内的索引。
            int index = r.nextInt(data.length());
            //r.nextInt(data.length())会生成0~data.length()-1范围内的int类型随机数
            // 5、根据索引去全部字符中提取该字符
            code += data.charAt(index);
        }
        // 6、返回code即可
        return code;
    }
}

ArrayList

D:\code\黑马\code\api-app\src\com\itheima\arraylist

构造器

image-20230721132027817

常用方法

image-20230721132009591

  • add(直接在末尾插入和在指定位置插入)
ArrayList<String> list = new ArrayList<>();
//在末尾插入
        list.add("LMH");
        list.add("SM");
        list.add("LMH");
        System.out.println(list);
//在指定位置插入
        list.add(1, "LOVE");
        System.out.println(list);
/*
result:
		[LMH, SM, LMH]
		[LMH, LOVE, SM, LMH]
*/
  • 获取指定位置的元素
//获取索引为1的元素    [LMH, LOVE, SM, LMH]
        String rs = list.get(1);
        System.out.println(rs);
/*
result:LOVE
*/
  • 获取list的长度
//获取集合的大小(返回集合中存储的元素个数)[LMH, LOVE, SM, LMH]
        System.out.println(list.size());
/*
result:4
*/
  • remove(根据索引或者根据内容删除)
//初始数组:[LMH, LOVE, SM, LMH]
//根据索引删除集合中的某个元素值,返回被删除的元素值  
        String removeElement = list.remove(1);
        System.out.println(removeElement);
        System.out.println(list);
/*
result:
		LOVE
		[LMH, SM, LMH]
*/
//删除指定元素值,只会删除第一个匹配项,返回true表示删除成功,返回false表示删除失败
        Boolean Flag = list.remove("LMH");
        System.out.println(Flag);
        System.out.println(list);
/*
result:
		true
		[SM, LMH]
*/
  • set
//初始数组:[SM, LMH]
//修改某个索引位置处的数据,返回修改前的数据
        System.out.println(list.set(1, "LOVE"));
        System.out.println(list);
/*
result:
		LMH
		[SM, LOVE]
*/

案例

image-20230723202652058

        //删除所有名字中带枸杞的元素
	    ArrayList<String> list = new ArrayList<>();
        list.add("枸杞");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("枸杞子");
        System.out.println(list);

        //方式一:从末尾开始删除,防止访问不到某些元素,因为删除元素后,list的长度也会发生变化
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i).contains("枸杞")){
                list.remove(i);
            }
        }
        System.out.println(list);

        //方式二:每次删除一个元素后,让i往左退一步
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).contains("枸杞")){
                list.remove(i);
                i--;
            }
        }
        System.out.println(list);
    }

image-20230724110321610

  • 主函数

    public class FoodTest {
        public static void main(String[] args) {
            FoodOperator operator = new FoodOperator();
            operator.start();
        }
    }
    
  • 实体类

    public class Food {
        private String name;
        private double price;
        private String desc; // 描述
    
        public Food() {
        }
    
        public Food(String name, double price, String desc) {
            this.name = name;
            this.price = price;
            this.desc = desc;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        @Override
        public String toString() {
            return "Food{" +
                    "name='" + name + '\'' +
                    ", price=" + price +
                    ", desc='" + desc + '\'' +
                    '}';
        }
    
  • 操作类

    public class FoodOperator {
        private ArrayList<Food> foodList = new ArrayList<>();
    
        public void addFood(){
            Food f = new Food();
    
            Scanner sc = new Scanner(System.in);
    
            System.out.println("请您输入该菜品名称:");
            String name = sc.next();
            f.setName(name);
    
            System.out.println("请您输入该菜品价格:");
            double price = sc.nextDouble();
            f.setPrice(price);
    
            System.out.println("请您输入该菜品描述:");
            String desc = sc.next();
            f.setDesc(desc);
    
            foodList.add(f);
            System.out.println("上架成功!");
        }
    
        public void showAllFoods(){
            if(foodList.size() == 0) {
                System.out.println("没有菜品");
                return;
            }
            for (int i = 0; i < foodList.size(); i++) {
                Food f = foodList.get(i);
                System.out.println(f.toString());
            }
        }
    
        public void start(){
            while (true) {
                System.out.println("请选择功能:");
                System.out.println("1、上架菜品");
                System.out.println("2、展示菜品");
                System.out.println("3、退出");
    
                Scanner sc = new Scanner(System.in);
                System.out.println("请选择您的操作:");
                String command = sc.next();
                switch (command) {
                    case "1":
                        addFood();
                        break;
                    case "2":
                        showAllFoods();
                        break;
                    case "3":
                        System.out.println("see you!");
                        return;
                    default:
                        System.out.println("您输入的命令不存在,请重新输入!");
                }
            }
        }
    
            System.out.println("请选择您的操作:");
            String command = sc.next();
            switch (command) {
                case "1":
                    addFood();
                    break;
                case "2":
                    showAllFoods();
                    break;
                case "3":
                    System.out.println("see you!");
                    return;
                default:
                    System.out.println("您输入的命令不存在,请重新输入!");
            }
        }
    }
    

    总结

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值