黑马全套Java教程(三)(下)

简介: 黑马全套Java教程(三)

15.5 String


String概述


String类在java.lang包下,所以使用的时候不需要导包


String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例;也就是说,Java程序中所有的双引号字符串,都是String类的对象


字符串的特点


  • 字符串不可变,它们的值在创建后不能被更改


  • 虽然String的值是不可变的,但是它们可以被共享


  • 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])


String构造方法



package myString;
/*
    String构造方法:
        1. public String():创建一个空白字符串对象,不包含任何内容
        2. public String(char[] chs):根据字符数组的内容,来创建字符串对象
        3. public String(byte[] bys):根据字节数组的内容,来创建字符串对象
        4. String s = "abc"   直接赋值的方法创建字符串对象,内容就是abc
 */
public class StringDemo01 {
    public static void main(String[] args) {
        //public String():创建一个空白字符串对象
        String s1 = new String();
        System.out.println("s1:" + s1);  //输出空白内容
        //public String(char[] chs):根据字符数组的内容,来创建字符串对象
        char[] chs = {'a', 'b', 'c'};
        String s2 = new String(chs);
        System.out.println("s2:" + s2);
        //public String(byte[] bys):根据字节数组的内容,来创建字符串对象
        byte[] bys = {97,98,99};
        String s3 = new String(bys);
        System.out.println("s3:" + s3);
        //String s = "abc"   直接赋值的方法创建字符串对象,内容就是abc
        String s4 = "abc";   // 这里是没有使用构造方法的
        System.out.println("s4:" + s4);
    }
}



String对象的特点


特点1



特点2



特点1内存过程:输出false



package myString;
public class StringDemo1 {
    public static void main(String[] args) {
        //构造方法的方式得到对象
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
        System.out.println(s1==s2);
    }
}



特点2内存过程:输出true



代码实现比较如下:


package myString;
public class StringDemo2 {
    public static void main(String[] args) {
        //直接赋值的方式得到对象
        String s3 = "abc";
        String s4 = "abc";
        System.out.println(s3==s4);
    }
}



15.6 字符串的比较


使用==做比较


  • 基本类型:比较的是数据值是否相同


  • 引用类型:比较的是地址值是否相同


字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals(),返回值为bool类型


package myString;
/*
    使用 == 做比较
        基本类型:比较的是数据值是否相同
        引用类型:比较的是地址值是否相同
    public boolean equals(Object anObject)
    将此字符串与指定对象进行比较
 */
public class StringDemo02 {
    public static void main(String[] args) {
        //构造方法的方式得到对象
        char[] chs = {'a','b','c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
        //直接赋值的方式得到对象
        String s3 = "abc";
        String s4 = "abc";
        //比较字符串对象地址是否相同
        System.out.println(s1==s2);
        System.out.println(s2==s3);
        System.out.println(s3==s4);   //相同
        System.out.println("--------------");
        //比较字符串内容是否相同
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s3.equals(s4));
    }
}



案例1:用户登录模拟


package myString;
import java.util.Scanner;
public class StringTest01 {
    public static void main(String[] args) {
        //已知用户名和密码,定义两个字符串表示即可
        String username = "itheima";
        String password = "czbk";
        //for循环实现多次机会
        for (int i = 0; i < 3; i++) {
            //键盘录入要登录的用户名和密码,用Scanner实现
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String name = sc.nextLine();
            System.out.println("请输入密码:");
            String pwd = sc.nextLine();
            //进行比较
            if (name.equals(username) && pwd.equals(password)) {
                System.out.println("登录成功");
                break;
            } else {
                if (2 - i == 0) {
                    System.out.println("你的账户被锁定,请与管理员联系");
                } else {
                    System.out.println("登录失败,你还有" + (2 - i) + "次机会");
                }
            }
        }
    }
}


案例2:遍历字符串



package myString;
import java.util.Scanner;
public class StringTest02 {
    public static void main(String[] args) {
        //键盘录入一个字符串,用Scanner实现
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
        //遍历字符串,首先要能够获取到字符串的每一个字符
        //length()方法获取字符串长度
        for (int i = 0; i < line.length(); i++) {
            System.out.println(line.charAt(i));
        }
    }
}



案例3:统计字符次数



package myString;
import java.util.Scanner;
public class StringTest03 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String line = sc.nextLine();
        int DaXie = 0;
        int XiaoXie = 0;
        int ZiMu = 0;
        for (int i = 0; i < line.length(); i++) {
            char ch = line.charAt(i);
            if (ch >= 'A' && ch <= 'Z') {
                DaXie += 1;
            } else if (ch >= 'a' && ch <= 'z') {
                XiaoXie += 1;
            } else if (ch >= '0' && ch <= '9') {
                ZiMu += 1;
            }
        }
        System.out.println("大写字母个数:" + DaXie);
        System.out.println("小写字母个数:" + XiaoXie);
        System.out.println("数字个数:" + ZiMu);
    }
}



案例4:拼接字符串



package myString;
/*
    拼接字符串
 */
public class StringTest04 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        //调用方法,接收结果
        String s = arrayToString(arr);
        System.out.println("s: "+ s);
    }
    public static String arrayToString(int[] arr) {
        //在方法中遍历数组,按照要求进行拼接
        String s = "";
        s += "[";
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                s += arr[i];
            } else {
                s += arr[i];
                s += ", ";
            }
        }
        s += "]";
        return s;
    }
}



案例5:字符串反转



package myString;
import java.util.Scanner;
/*
    字符串反转
 */
public class StringTest05 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();
        String sReverse = StringToReverse(s);
        System.out.println("反转后:" + sReverse);
    }
    public static String StringToReverse(String s) {
        String ss = "";
        for (int i = s.length() - 1; i >= 0; i--) {
            ss += s.charAt(i);
        }
        return ss;
    }
}



15.7 String中的方法


常见方法



可在帮助文档中查看到:





字符串中的方法比较多!


15.8 StringBuilder


String内存过程:我们知道字符串是不可变的,常量



可以看到进行字符串拼接会浪费堆内存



所以引出来了StringBuilder


StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的


String和StringBuilder的区别?


  • String:内容是不可变的


  • StringBuilder:内容是可变的


StringBuilder构造方法



例1


package myString;
/*
    StringBuilder构造方法
        public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
        public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
 */
public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //1.public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
        StringBuilder sb = new StringBuilder();
        System.out.println("sb:" + sb);
        System.out.println("sb.length():" + sb.length());
        System.out.println("--------------------------");
        //2.public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
        StringBuilder sb2 = new StringBuilder("hello");
        System.out.println("sb2:" + sb2);
        System.out.println("sb2.length():" + sb2.length());
    }
}



StringBuilder添加和反转的方法


例:添加:.append()


package myString;
public class StringBuilderDemo02 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();
        //
        StringBuilder sb2 = new StringBuilder("hello");
        StringBuilder sb3 = sb.append("hello");
        System.out.println("sb:" + sb);
        System.out.println("sb2:" + sb2);
        System.out.println("-----------------");
        System.out.println("sb==sb2:" + (sb==sb2));
        System.out.println("sb==sb3:" + (sb==sb3));
    }
}



例:反转:.reverse()


package myStringBuilder;
/*
    StringBuilder 的添加和反转方法
        public StringBuilder append(任意类型):添加数据,并返回对象本身
        public StringBuilder reverse():返回相反的字符序列
 */
public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();
//        sb.append("hello");
//        sb.append("world");
//        sb.append("java");
//        sb.append(100);
        //链式编程
        sb.append("hello").append("world").append("java").append(100);
        System.out.println(sb);
        //反转
        sb.reverse();
        System.out.println(sb);
    }
}



15.9 StringBuilder和String的相互转换


  • StringBuilder 转换为 String:toString()


  • String 转换为 StringBuilder:public StringBuilder(String s):通过构造方法就可以实现


package myStringBuilder;
/*
    StringBuilder 转换为 String
        toString()
    String 转换为 StringBuilder
        public StringBuilder(String s):通过构造方法就可以实现
 */
public class StringBuilderDemo02 {
    public static void main(String[] args) {
        //1.StringBuilder to String
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        //String s = sb;   //这个是错误做法
        String s = sb.toString();
        System.out.println(s);
        //2.String to StringBuilder
        String ss = "hello";
        //StringBuilder s = ss;  //这个是错误的
        StringBuilder sb2 = new StringBuilder(ss);
        System.out.println(sb2);
    }
}



案例:拼接字符串



package myStringBuilder;
/*
    拼接字符串
 */
public class StringBuilderDemo03 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        String s = pinJie(arr);
        System.out.println(s);
    }
    public static String pinJie(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if (i != arr.length - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        String s = sb.toString();
        return s;
    }
}


案例:字符串反转



package myStringBuilder;
/*
    字符串反转
 */
import java.util.Scanner;
public class StringBuilderDemo04 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
        String s = stringReverse(line);
        System.out.println("反转后:" + s);
    }
    public static String stringReverse(String s){
//        StringBuilder sb = new StringBuilder(s);
//        sb.reverse();
//        String ss = sb.toString();
//        return ss;
        //用一行代码实现上面功能
        return new StringBuilder(s).reverse().toString();
    }
}



这些方法都能在帮助文档中找到!


如下:






本博客到黑马视频的第133个!


16 集合


集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变


集合类有很多,目前只学习一个:ArrayLlist,需要导包


16.1 ArrayList


ArrayList< E>


  • 可调整大小的数组实现


  • < E>:是一种特殊的数据类型,泛型


什么用呢?


在出现E的地方我们使用引用数据类型替换即可


举例:ArrayList<String>ArrayList<Student>


16.2 ArrayList构造方法和添加方法



package myArrayList;
import java.util.ArrayList;
/*
    ArrayList构造方法:
        public ArrayList():创建一个空的集合对象
    ArrayList添加方法:
        public bollean add(E e):将指定的袁术追加到此集合的末尾
        public void add(int index, E,element):在此集合中的指定未知插入指定的元素
 */
public class ArrayListDemo01 {
    public static void main(String[] args) {
        //public ArrayList():创建一个空的集合对象
        //ArrayList<String> array = new ArrayList<>();
        ArrayList<String> array = new ArrayList<String>();  //这两个都行
        //add添加元素
        System.out.println(array.add("hello"));
        System.out.println(array.add("world"));
        array.add("100");
        //add指定位置添加元素
        array.add(1, "java");   //如果索引超出会报错
        array.add(4, "javaee");
        //输出集合
        System.out.println("array:" + array);
    }
}


16.3 ArrayList集合常用方法



代码举例如下:


package myArrayList;
import java.util.ArrayList;
/*
    Array常用方法:
        remove删除指定元素
        remove删除指定索引处的元素
        set修改指定索引处的元素
        get获取指定索引处的元素
        size()返回集合元素个数
 */
public class ArrayListDemo02 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> array = new ArrayList<String>();
        //添加元素
        array.add("world");
        array.add(1, "hello");
        array.add("java");
        array.add("python");
        System.out.println("attay:" + array);
        //1.删除指定元素
        System.out.println("1.删除world:" + array.remove("world"));
        System.out.println(" 删除javaee:" + array.remove("javaee")); //没有这个,false
        System.out.println("attay1:" + array);
        //2.指定索引
        System.out.println("删除指定索引1,返回索引对应的值:" + array.remove(1));  //返回索引值的元素
        //System.out.println(array.remove(3));   //删除时索引越界会报错
        System.out.println("attay2:" + array);
        //3.修改索引对应的值
        System.out.println("修改索引1的值,返回被修改的值:" + array.set(1, "C++"));
        //注意:索引越界会报错
        System.out.println("attay3:" + array);
        //4.返回指定索引处的元素
        System.out.println("返回1索引的元素:" + array.get(1));
        System.out.println("attay4:" + array);
        //5.获取元素个数
        System.out.println("元素个数:" + array.size());
    }
}


案例:存储字符串并遍历



package myArrayList;
import java.util.ArrayList;
public class ArrayListTest01 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> array = new ArrayList<String>();
        //添加元素
        array.add("aaa");
        array.add("bbb");
        array.add("ccc");
        //遍历
        for (int i=0; i<array.size(); i++){
            String s = array.get(i);
            System.out.println(s);
        }
    }
}


案例2:存储学生对象并遍历



package myArrayList;
import java.util.ArrayList;
public class ArrayTest02 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student> array = new ArrayList<Student>();  //括号里面改了
        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("风清扬", 33);
        Student s3 = new Student("张曼玉", 18);
        //添加学生对象到集合中
        array.add(s1);
        array.add(s2);
        array.add(s3);
        //遍历
        for (int i=0; i< array.size(); i++){
            Student s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}


案例3:



package myArrayList;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayTest03 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<Student1> array = new ArrayList<Student1>();
        //键盘录入
        addStudent(array);
        addStudent(array);
        addStudent(array);
        //遍历集合
        for(int i=0; i<array.size(); i++){
            Student1 s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
    public static void addStudent(ArrayList<Student1> array){
        //键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生姓名:");
        String name = sc.nextLine();
        System.out.println("请输入学生年龄:");
        String age = sc.nextLine();
        //创建学生对象
        Student1 s = new Student1();
        s.setName(name);
        s.setAge(age);
        //往集合中添加学生对象
        array.add(s);
    }
}


此博客到视频139截止!

目录
相关文章
|
27天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
27天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
27天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
13天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
10 0
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
77 2
|
2月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
27 3
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
23 3
|
2月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
|
2月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)