JavaSE常用类String01 2021.06.15-17

本文详细介绍了Java中的String类,包括其不可变性、内存分配、常量池概念,以及通过字面量和new操作符创建字符串的区别。此外,还探讨了字符串的拼接操作、equals()和compareTo()方法的使用,以及各种常用的字符串处理方法,如replace()、startsWith()、endsWith()等。同时,文章还提到了字符串与基本类型、char数组、byte数组之间的转换,并涉及了编码和解码的过程。

考完六级,搬完新家,有10天没学习java,要把java捡起来了呀,必须得加快点进度。
加油!

在这里插入图片描述
在这里插入图片描述

字符串相关的类:String

  • String:字符串。使用“”引起来表示

  • String声明为final的,不可被继承

  • String实现了Serializable接口:表示字符串是支持序列化的;实现了Comparable接口:表示String可以比较大小

  • String内部定义了final char[] value 用于存储字符串数据

  • String:代表不可变的字符序列。简称:不可变性

    • 当对字符串重新赋值、对现有的字符串进行连接操作、调用String的replace()方法修改指定字符或字符串时…只要修改了字符串,需要重新指定内存区域赋值,不能使用原有的value进行赋值。

        String a1="abc";//字面量的定义方式
        String a2="abc";

        System.out.println(a1==a2);//true
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  • 字符串常量池中是不会存储相同内容的字符串的。

String的实例化方式

        String a1="abc";//字面量的定义方式
        String a2="abc";

        String a3=new String("abc");
        String a4=new String("abc");

        System.out.println(a1==a2);//true
        System.out.println(a1==a3);//False
        System.out.println(a1==a4);//False
        System.out.println(a3==a4);//False
  • 通过字面量定义的方式:数据声明在方法区中的字符串常量池中。
  • 通过new + 构造器的方式,是数据在堆空间中开辟空间以后对应的地址。
        System.out.println(p1.name.equals(p2.name));//true
        System.out.println(p1.name== p2.name);//true,通过字面量方式定义,数据都在常量池

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

String的不同拼接操作

  • 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中。
  • 如果拼接的结果调用intern()方法,返回值就在常量池中。
        String s1 = "Hello";
        String s2 = "World";

        String s3 = "HelloWorld";
        String s4 = "Hello"+"World";

        String s5 = s1+"World";
        String s6 = "Hello"+s2;
        String s7 = s1 + s2;

        String s8 = s7.intern();

        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//false
        System.out.println(s3==s6);//false
        System.out.println(s3==s7);//false
        System.out.println(s3==s8);//true

        System.out.println(s5==s6);//false
        System.out.println(s5==s7);//false
        System.out.println(s6==s7);//false

        final String s9 ="Hello";//s9:常量
        String s10 =s9+"World";
        System.out.println(s3==s10);//true


面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
答案:两个,一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”

public class StringTest03 {
    public static void main(String[] args) {
        String str = "good";
        char[] ch={'t','e','s','t'};

        new StringTest03().change(str,ch);
        System.out.println(str);//good  String的不可变性,
        System.out.println(ch);//best  

    }
    public void change(String str,char ch[]){  //引用传递
        str="test ok";
        ch[0]='b';
    }
}

String常用方法

第一波:

  1. int length();返回字符串的长度: return value.length
  2. char charAt(int index);返回某索引处的字符:return value[index]
  3. boolean isEmpty();判断是否为空字符:return value.length == 0
  4. String toLowerCase();使用默认语言环境,将String中的所有字符转换为小写
  5. String toUpperCase();使用默认语言环境,将String中的所有字符转换为大写
  6. String trim();返回字符串的副本,忽略前导空白和尾部空白
  7. boolean equals(Object obj);比较字符串的内容是否相同
  8. boolean equalsIgnoreCase(String anotherString);与equals方法类似,忽略大小写
  9. String concat(String str);将指定字符串连接到此字符串的结尾。等价于用"+"
  10. int compareTo(String anotherString);比较两个字符串的大小
  11. String substring(int beginIndex);返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串
  12. String substring(int beginIndex,int endIndex);返回一个新的字符串,它是此字符串的从beginIndex开始截取到endIndex(不包含)的一个子字符串;(左闭右开)。有些方法是从某个位置开始取几个。
public class StringMethodTest01 {
    public static void main(String[] args) {
        String s1="Hello World";
        System.out.println(s1.length());//11 空格也算; 1. int length();返回字符串的长度: return value.length

        System.out.println(s1.charAt(0));//H 2. char charAt(int index);返回某索引处的字符:return value[index]
        System.out.println(s1.charAt(10));//d

        System.out.println(s1.isEmpty());//false  3. boolean isEmpty();判断是否为空字符:return value.length == 0

        String s2=s1.toLowerCase();// 4. String toLowerCase();使用默认语言环境,将String中的所有字符转换为小写
        String s3=s1.toUpperCase();// 5. String toUpperCase();使用默认语言环境,将String中的所有字符转换为大写
        System.out.println(s1);//Hello World
        System.out.println(s2);//hello world
        System.out.println(s3);//HELLO WORLD

        String s4="   He llo  World   ";
        String s5=s4.trim(); // 6. String trim();返回字符串的副本,忽略前导空白和尾部空白
        System.out.println("---"+s4+"---");//---   He llo  World   ---
        System.out.println("---"+s5+"---");//---He llo  World---

        System.out.println(s1.equals(s2));//false 7. boolean equals(Object obj);比较字符串的内容是否相同

        System.out.println(s1.equalsIgnoreCase(s2));//true  8. boolean equalsIgnoreCase(String anotherString);与equals方法类似,忽略大小写

        String s6 ="Hello";
        String s7 =" World";
        System.out.println(s6.concat(s7));//Hello World  9. String concat(String str);将指定字符串连接到此字符串的结尾。等价于用"+"

        String s8="abc";
        String s9=new String("abd");
        System.out.println(s8.compareTo(s9));//-1  涉及到字符串排序。10. int compareTo(String anotherString);比较两个字符串的大小

        String s10="陈浩贤超级爱泳琳猪";
        System.out.println(s10.substring(1));//浩贤超级爱泳琳猪
        System.out.println(s10.substring(1, 8));//浩贤超级爱泳琳
        // 11. String substring(int beginIndex);返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串
        // 12. String substring(int beginIndex,int endIndex);返回一个新的字符串,它是此字符串的从beginIndex开始截取到endIndex(不包含)的一个子字符串;(左闭右开).有些方法是从某个位置开始取几个。
    }
}

第二波:

  1. boolean endsWith(String suffix);测试此字符串是否以指定的后缀结束
  2. boolean startsWith(String prefix);测试此字符串是否以指定的前缀开始
  3. boolean startsWith(String prefix,int toffset);测试此字符串从指定索引开始的子字符串是否以指定的前缀开始
  4. boolean contains(CharSequence s);当且仅当此字符串包含指定的char值序列时,返回true
  5. int indexOf(String str);返回指定子字符串在此字符串中第一次出现处的索引
  6. int indexOf(String str,int fromIndex);返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
  7. int lastIndexOf(String str);返回指定子字符串在此字符串中最后边出现处的索引
  8. int lastIndexOf(String str,int fromIndex);返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
    public static void main(String[] args) {
        String s1="Hello World";
        System.out.println(s1.endsWith("ld"));// true
        System.out.println(s1.startsWith("He"));//true
        System.out.println(s1.startsWith("he"));//false,区分大小写
        System.out.println(s1.startsWith("ll", 2));//true
        //1. boolean endsWith(String suffix);测试此字符串是否以指定的后缀结束
        //2. boolean startsWith(String prefix);测试此字符串是否以指定的前缀开始
        //3. boolean startsWith(String prefix,int toffset);测试此字符串从指定索引开始的子字符串是否以指定的前缀开始

        String s2="lo";
        System.out.println(s1.contains(s2));//true
        //4. boolean contains(CharSequence s);当且仅当此字符串包含指定的char值序列时,返回true

        System.out.println(s1.indexOf(s2));//3
        System.out.println(s1.indexOf("lo w"));//-1
        System.out.println(s1.indexOf("or",5));//7
        //5. int indexOf(String str);返回指定子字符串在此字符串中第一次出现处的索引
        //6. int indexOf(String str,int fromIndex);返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始

        String s3="hellorworld";
        System.out.println(s3.lastIndexOf("or"));//7
        System.out.println(s3.lastIndexOf("or",6));//4

        // 7. int lastIndexOf(String str);返回指定子字符串在此字符串中最后边出现处的索引
        // 8. int lastIndexOf(String str,int fromIndex);返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
        //注:indexOf和lastIndexOf方法如果未找到都是返回-1
    }

第三波

  1. String replace(char oldChar,char newChar);返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
  2. String replace(CharSequence target,CharSequence replacement);使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
  3. String replaceAll(String regex,String replacement);使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
  4. String replaceFirst(String regex, String replacement);使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串。
  5. boolean matches(String regex);告知此字符串是否匹配给定的正则表达式。
  6. String[] split(String regex);根据给定正则表达式的匹配拆分此字符串
  7. String[] split(String regex,int limit);根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
    public static void main(String[] args) {
        String s1="陈浩贤非常爱梁泳琳";
        System.out.println(s1.replace("陈", "帅"));
        System.out.println(s1.replace("非常", "超级"));
        // 1. String replace(char oldChar,char newChar);返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
        // 2. String replace(CharSequence target,CharSequence replacement);使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。

        String s2="12hello23world41java241mysql1241";
        System.out.println(s2.replaceAll("\\d+", ",").replaceAll("^,|,$",""));//hello,world,java,mysql
        // 3. String replaceAll(String regex,String replacement);使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
        // 4. String replaceFirst(String regex, String replacement);使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串。

        String s3="12345";
        String s4="0760-88888888";
        System.out.println(s3.matches("\\d+"));//判断字符串中是否全部由数字组成。
        System.out.println(s4.matches("0760-\\d{8}"));
        // 5. boolean matches(String regex);告知此字符串是否匹配给定的正则表达式。


        String s5="hello|world|java|beckham|unlia";
        String[] strs = s5.split("\\|");
        for (int i = 0; i <strs.length; i++) {
            System.out.println(strs[i]);
        }

        String[] strs2=s5.split("\\|",3);
                for (int i = 0; i < strs2.length; i++) {
            System.out.println(strs2[i]);
        }
        // 6. String[] split(String regex);根据给定正则表达式的匹配拆分此字符串
        // 7. String[] split(String regex,int limit);根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
    }

String与其他类型之间的转换

回顾:String与基本数据类型和包装类的转换
        //String -->基本数据类型、包装类:调用包装类的静态方法:parseXXX(String str)
        //基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)

        String str ="123";
        
        int num = Integer.parseInt(str);//得到包装类后拆箱

        String s = String.valueOf(num);
        String s2=num+"";
String与char[] 之间的转换
        //String-->char[]:调用String的toCharArray()
        //char[]-->String:调用String的构造器
        
        String str1="abc123";
        
        char[] chars1 = str1.toCharArray();
        for (int i = 0; i <chars1.length; i++) {
            System.out.println(chars1[i]);
        }

        char[] chars2=new char[]{'h','e','l','l','o'};
        String str2 = new String(chars2);
        System.out.println(str2);
String与byte[] 之间的转换
  • 编码:字符串–>字节(看得懂—>看不懂的二进制数据)
  • 解码:编码的逆过程,字节—>字符串(看不懂的二进制数据—>看得懂)
  • 说明:解码时:要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
        //String与byte[]之间的转换
        //编码:String --> byte[]:调用String的getBytes();
        //解码:byte[] --> String:调用String的构造器

        //编码:字符串-->字节(看得懂--->看不懂的二进制数据)
        //解码:编码的逆过程,字节--->字符串(看不懂的二进制数据--->看得懂)

        //说明:解码时:要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。

        String s3="我爱泳琳";
        byte[] bytes = s3.getBytes();//使用默认的字符集,进行编码。
        System.out.println(Arrays.toString(bytes));

        byte[] gbks = s3.getBytes("gbk");//使用gbk字符集进行编码
        System.out.println(Arrays.toString(gbks));

        String s4 = new String(bytes);//使用默认的字符集,进行解码
        System.out.println(s4);

        String s5 = new String(gbks);
        System.out.println(s5);//出现乱码,因为编码集和解码集不一致

        String s6 = new String(gbks, "gbk");
        System.out.println(s6);//没有出现乱码,因为编码集和解码集一致
<think>我们正在处理用户关于多个软件特定版本的下载请求。用户需要以下软件的下载文件或安装包: -JDK8u361(Linux和 Windows) -Hadoop3.3.4 tar.gz- ApacheZookeeper3.5.9 binarytar.gz-Spark3.2.0 withHadoop3.2 binary-Anaconda32021.05(Linux和Windows)- ApacheHive3.1.3binary tar.gz- MySQLConnector/J:5.1.34和8.0.13 (用于MySQL5.7) 由于这些软件都是开源项目,我们可以从官方或可靠的镜像站点获取。下面将逐一提供下载链接。请注意,由于网络环境或时间因素,链接可能会发生变化,如果无法访问,建议到官方网站查找。1. **JDK8u361**:-Oracle JDK8u361需要Oracle账户才能下载。我们可以提供OpenJDK的替代方案,但用户明确要求8u361,因此我们提供Oracle官方下载链接(需要登录):- Linux: https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html (选择jdk-8u361-linux-x64.tar.gz)-Windows:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html (选择jdk-8u361-windows-x64.exe)注意:如果用户没有Oracle账户,可以考虑使用OpenJDK的构建,例如AdoptOpenJDK或AmazonCorretto,但版本号可能不完全匹配。2.**Hadoop3.3.4**:-官方镜像:https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz3.**ApacheZookeeper3.5.9**:-注意:3.5.x版本在Apache镜像中通常以`apache-zookeeper-3.5.9-bin.tar.gz`的形式提供(因为3.5.x开始,二进制包带有`bin`后缀)。-官方镜像:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz4.**Spark3.2.0with Hadoop3.2**:-官方下载:https://archive.apache.org/dist/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz5.**Anaconda32021.05**:-Anaconda的存档版本可以在其官方存档站点找到:-Linux:https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh-Windows:https://repo.anaconda.com/archive/Anaconda3-2021.05-Windows-x86_64.exe6.**ApacheHive3.1.3**:-官方镜像:https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz7.**MySQLConnector/J**:-注意:用户要求两个版本:5.1.34和8.0.13。这两个版本都可以从MySQL官方存档下载。-5.1.34:https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.34.tar.gz (解压后得到jar文件)或者直接jar:https://cdn.mysql.com/archives/mysql-connector-java-5.1/mysql-connector-java-5.1.34.jar(可能不稳定,建议从归档下载压缩包)-8.0.13: https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.13.tar.gz (同样,解压后得到jar文件)直接jar: https://cdn.mysql.com/archives/mysql-connector-java-8.0/mysql-connector-java-8.0.13.jar注意:MySQL Connector/J8.0系列是推荐用于MySQL5.7的,因为5.1系列已经较老。但用户同时要求了5.1.34,可能是为了兼容旧应用。 由于下载链接可能因地区或时间而失效,建议用户如果遇到问题,可以访问官方网站的下载页面自行选择版本。另外,请注意,OracleJDK的下载需要接受许可协议,并且可能需要创建Oracle账户。对于自动化下载,这可能会带来不便。如果用户希望避免登录,可以考虑使用OpenJDK的构建(例如AdoptOpenJDK、Amazon Corretto等),但版本号可能不完全一致。最后,在安装这些软件时,请确保遵循官方文档进行配置。§§相关问题§§1.如何验证下载文件的完整性(例如,通过校验和或签名)? 2.在Linux系统中,如何安装和配置这些软件?3.这些特定版本之间是否存在已知的兼容性问题?</think>### 软件特定版本下载指南 以下是您所需软件的官方下载链接(基于 Apache 官方镜像、Oracle 存档等可靠来源),所有链接均为直接下载地址: #### 1. **JDK 8u361** - **Linux** (tar.gz): [https://download.oracle.com/java/8u361/archive/jdk-8u361-linux-x64.tar.gz](https://download.oracle.com/java/8u361/archive/jdk-8u361-linux-x64.tar.gz) *需接受 Oracle 许可协议* - **Windows** (exe): [https://download.oracle.com/java/8u361/archive/jdk-8u361-windows-x64.exe](https://download.oracle.com/java/8u361/archive/jdk-8u361-windows-x64.exe) #### 2. **Hadoop 3.3.4** - **二进制包** (tar.gz): [https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz](https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz) #### 3. **Zookeeper 3.5.9** - **二进制包** (tar.gz): [https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz](https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz) #### 4. **Spark 3.2.0 (Hadoop 3.2)** - **预编译包** (tgz): [https://archive.apache.org/dist/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz](https://archive.apache.org/dist/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz) #### 5. **Anaconda3 2021.05** - **Linux** (sh): [https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh](https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh) - **Windows** (exe): [https://repo.anaconda.com/archive/Anaconda3-2021.05-Windows-x86_64.exe](https://repo.anaconda.com/archive/Anaconda3-2021.05-Windows-x86_64.exe) #### 6. **Hive 3.1.3** - **二进制包** (tar.gz): [https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz](https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz) #### 7. **MySQL Connector/J** - **5.1.34** (jar): [https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.34.jar](https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.34.jar) - **8.0.13** (jar): [https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.13.jar](https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.13.jar) --- ### 注意事项 1. **Oracle JDK 下载**:需在浏览器中先访问 [Oracle存档页](https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html) 手动接受许可协议,否则直接下载链接可能返回 403 错误[^1]。 2. **版本兼容性**: - Spark 3.2.0 要求 Java 8+ 和 Scala 2.12 - Hive 3.1.3 需搭配 Hadoop 3.x 和 Java 8 - MySQL Connector 8.0.x 兼容 MySQL 5.7,但需配置 `useSSL=false`[^2] 3. **验证文件**:所有 Apache 项目均提供 `.sha512` 校验文件,例如 Hadoop 的校验文件位于: ``` https://downloads.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz.sha512 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值