Java学习笔记——十二、字符串

十二、字符串

1、API

1.1 API概述

API( Application Programming Interface):应用程序编程接口。

是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。

Java API:指的就是JDK中提供的各种功能的Java类。

这些类将底层的实现封装了起来,不需要关心这些类是如何实现的,

只需要学习这些类如何使用即可,可以通过帮助文档来学习这些API如何使用

1.2 API帮助文档

Java8 中文版API帮助文档:

https://www.matools.com/api/java8

2、String

2.1 String概述

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

String类代表字符串,Java程序中的所有字符串文字(例如“abc“)都被实现为此类的实例

也就是说,Java程序中所有的双引号字符串,都是 String类的对象

字符串的特点

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

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

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

2.2 String构造方法
  • public String():创建一个空白字符串对家,不含有任何内容
  • public String(char[]chs):根据字符数组的内容,来创建字符串对象
  • public String( byte[] bys):根据字节数组的内容,来创建字符串对象
  • String s=“abc”; 直接赋值的方式创建字符串对家,内容就是abc

推荐使用直接赋值的方式得到字符串对象

package String;

public class StringDemo {
    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);
    }
}

s1:

s2:abc

s3:abc

s4:abc

2.3 String对象的特点
  • 通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
  • 以“方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次, JVM都只会建立一个 String对象,并在字符串池中维护
    在这里插入图片描述
2.4 字符串的比较
  • 使用==做比较

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

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

  • 字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫: equals()

public boolean equals( Object anobject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串

package String;

public class StringDemo {
    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(s1 == 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));
    }
}

false

false

false

--------

true

true

false

2.5 案例:用户登录

需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示

思路:

①已知用户名和密码,定义两个字符串表示即可

②键盘录入要登录的用户名和空码,用 Scanner实现

③拿键盘录入的用户名、空码和已知的用户名、密码进行比较,给出相应的提示。字符串的内容比较,用 equals()方法实现

④用循环实现多次机会,这里的次数明确,采用for循环实现,并在登录成功的时候,使用 break结束循环

package String;

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
//        定义已知用户名和密码
        String username = "root";
        String userpassword = "123456";
//        用循环实现多次机会
        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(userpassword)) {
                System.out.println("登陆成功");
                break;
            } else {
                if (i == 2) {
                    System.out.println("账户已被锁定,五分钟后再试");
                } else {
                    System.out.println("登录失败,你还有" + (2 - i) + "次机会");
                }
            }
        }
    }
}
2.6 案例:遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

思路:

①键盘录入一个字符串,用 Scanner实现

②遍历字符串,首先要能够获取到字符串中的每一个字符

  • public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的

③遍历字符串,其次要能多获取到字符串的长度

  • public int length0:返回此字符串的长度
  • 数组的长度:数组名.length
  • 字符串的长度:字符串对象.length()

④遍历字符串的通用格式

package String;

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
//        键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
//        遍历字符串,首先要能够获取到字符串中的每一个字符
//        System.out.println(line.charAt(0));
//        System.out.println(line.charAt(1));
//        System.out.println(line.charAt(2));
//
//        for (int i=0;i<3;i++){
//            System.out.println(line.charAt(i));
//        }
//        遍历字符串,其次要能多获取到字符串的长度
//        System.out.println(line.length());

        for (int i=0;i<line.length();i++){
            System.out.println(line.charAt(i));
        }
    }
}
2.7 案例:统计字符次数

需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

思路:

①键盘录入一个字符串,用 Scanner实现

②要统计三种类型的字符个数,需定义三个统计变量,初始值都为0

③遍历字符串,得到每一个字符

④判断该字符属于哪种类型,然后对应类型的充计变量+1

假如h是一个字符,我要判断它属于大写字母,小写字母,还是数字,直接判断字符是否在对应的范围即可 。大写字母:ch>=‘A’&&ch<=‘Z’

小写字母:ch>=‘a’&&ch<=‘z’

数字:ch>=‘0’&&ch<=‘9’

⑤输出三种类型的字符个数

package String;

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
//        键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line = sc.nextLine();
//        要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
        int bigCount = 0;
        int smallCount = 0;
        int numberCount = 0;
//        遍历字符串,得到每一个字符
        for (int i = 0;i < line.length();i++){
            char ch = line.charAt(i);
//            判断该字符属于哪种类型,然后对应类型的充计变量+1
            if (ch >= 'A' && ch <= 'Z'){
                bigCount++;
            }else if (ch >= 'a' && ch <= 'z'){
                smallCount++;
            }else if (ch >= '0' && ch <= '9'){
                numberCount++;
            }
        }
        System.out.println("大写字母的个数:" + bigCount);
        System.out.println("小写字母的个数:" + smallCount);
        System.out.println("数字的个数:" + numberCount);
    }
}
2.8 案例:拼接字符串

需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法 并在控制台输出结果。例如,数组为 intl ar={1,2,3;,执行方法后的輸出结果为:[1,2,3]

思路:

①定义一个int类型的数组,用静态初始化完成数组元素的初始化

②定义一个方法,用于把int数组中的数据按照指定格式拼接成个字符串返回。返回值类型 String 参数列表 int[] arr

③在方法中遍历数组,按照要求进行拼接

④调用方法,用一个变量接收结果

⑤输出结果

package String;

public class StringDemo {
    public static void main(String[] args) {
//        定义一个int类型的数组,用静态初始化完成数组元素的初始化
        int[] arr = {11, 22, 33, 44, 55};
//        调用方法,用一个变量接收结果
        String s = arrayToString(arr);
        System.out.println(s);
    }

    //    定义一个方法,用于把int数组中的数据按照指定格式拼接成个字符串返回
    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;
    }
}

[11, 22, 33, 44, 55]

2.9 案例:字符串反转

需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果 例如,键盘录入abc,輸出结果cba

思路

①键盘录入一个字符串,用Scanner实现

②定义一个方法,实现字符串反转。返回值类型 String,参数 String s

③在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符申并返回

④调用方法,用一个变量接收结果

⑤输出结果

package String;

import java.util.Scanner;

public class StringDemo {
    public static void main(String[] args) {
//        键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String line= sc.nextLine();
//        调用方法,用一个变量接收结果
        String sss=reverse(line);
        System.out.println(sss);
    }
//    定义一个方法,实现字符串反转。返回值类型 String,参数 String s
    public static String reverse(String s){
        String ss="";
//        在方法中把字符串倒着遍历,然后把每一个得到的字符拼接成一个字符申并返回
        for (int i=s.length()-1;i>=0;i--){
            ss+=s.charAt(i);
        }
        return ss;
    }
}

3、StringBuilder

3.1 StringBuilder概述

如果对字符串进行拼接操作,每次拼妾,都会构建一个新的 String对象,既耗时,又浪费内存空间,而这种操 作还不可避免。那么我们可以通过java提供的StringBuilder类就来解决这个问题。

Stringbuilder是一个可变的字符串类,我们可以把它看成是一个容器

这里的可变指的是 Stringbuilder对象中的内容是可变的

String和 StringBuilder的区别:

  • String:内容是不可变的
  • StringBuilder:内容是可变的
3.2 StringBuilder构造方法

public StringBuilder:创建一个空白可变字符串对象,不含有任何内容

public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象

package StringBuilder;

public class StringBuilderDemo {
    public static void main(String[] args) {
        //    public StringBuilder 创建一个空白可变字符串对象,不含有任何内容
        StringBuilder sb=new StringBuilder();
        System.out.println("sb:"+sb);
        System.out.println("sb.length():"+sb.length());

        //    public StringBuilder(String str)    根据字符串的内容,来创建可变字符串对象
        StringBuilder sb2=new StringBuilder("hello");
        System.out.println("sb2:"+sb2);
        System.out.println("sb2.length():"+sb2.length());
    }
}

sb:

sb.length():0

sb2:hello

sb2.length():5

3.3 StringBuilder的添加和反转方法

public StringBuilder append(任意类型):添加数据,并返回对象本身

public StringBuilder reverse():返回相反的字符序列

package StringBuilder;

public class StringBuilderDemo {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
//        public StringBuilder append(任意类型):添加数据,并返回对象本身
//        StringBuilder sb2 = sb.append("hello");
//
//        System.out.println("sb:" + sb);
//        System.out.println("sb2:" + sb2);
//        System.out.println(sb == sb2);
//        sb和sb2其实是同一个对象

//        sb.append("hello");
//        sb.append("world");
//        sb.append("java");
//        sb.append(999);
//        链式编程
        sb.append("hello").append("world").append("java").append(999);
        System.out.println("sb:" + sb);

//        public StringBuilder reverse():返回相反的字符序列
        sb.reverse();
        System.out.println("sb:" + sb);
    }
}

sb:helloworldjava999

sb:999avajdlrowolleh

3.4 StringBuilder和String相互转换
  • StringBuilder转换为 String

public String tostring():通过 tostring()就可以实现把 StringBuilder 转换为 String

  • String转换为StringBuilder

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

package StringBuilder;

public class StringBuilderDemo {
    public static void main(String[] args) {
/*
//        StringBuilder转换为 String
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
//        String s=sb;  这样的做法是错误的
        String s = sb.toString();
        System.out.println("s:" + s);
*/

//        String转换为StringBuilder
        String s = "hello";
//        StringBuilder sb=s;  这样的做法是错误的
        StringBuilder sb = new StringBuilder(s);
        System.out.println("sb:" + sb);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CiiikG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值