廖雪峰java教程学习笔记——Java核心类

StringString是引用类型,不可变;本身是一个class,内部是由char[]数组表示的,通过private final char[]字段确保其不可变。声明String的方式:String s1 = "Hello!";String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});字符串比较 ==和equals()equals()方法能比较出二者内容是否相同;==方法只能比较二者是否指向同一个对象;要注意Java编
摘要由CSDN通过智能技术生成

String

String是引用类型,不可变;本身是一个class,内部是由char[]数组表示的,通过private final char[]字段确保其不可变。

声明String的方式:

String s1 = "Hello!";
String s2 = new String(new char[] {
   'H', 'e', 'l', 'l', 'o', '!'});

字符串比较 ==和equals()

equals()方法能比较出二者内容是否相同;

==方法只能比较二者是否指向同一个对象;

要注意Java编译器会把所有相同的字符串当作一个对象放入常量池,所以相同字面量的引用是相同的:

        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);

如果字符串内容相同,但指向不同对象,就要用equals()比较:

        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1 == s2);  //false
        System.out.println(s1.equals(s2));  //true

常用方法

s1.equalsIgnoreCase(s2);  //忽略大小写比较

"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true

"Hello".substring(2); // "llo"
"Hello".substring(2, 4); //"ll" 类似python切片

"  \tHello\r\n ".trim(); // "Hello"
"\u3000Hello\u3000".strip(); // "Hello",加强版trim(),类似中文的空格字符\u3000也会被移除

"".isEmpty(); // true,因为字符串长度为0
"  ".isEmpty(); // false,因为字符串长度不为0
"  \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符

String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~"

String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // 正则替换,"A,B,C,D"

String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"},注意splite的参数需要用双引号,传入的是正则表达式

String[] arr = {
   "A", "B", "C"};
String s = String.join("***", arr); // "A***B***C",String.join()静态方法,从无到有

//String.format()静态方法,生成格式化字符串,也是从无到有
String.format("Hi %s, your score is %.2f!", "Bob", 59.5);  //Hi Bob, your score is 59.50! 

类型转换

任意类型转String:

//类型转换,String.valueOf()静态方法
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c

String转int,用Integer.parseInt()静态方法:

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer:

Integer.getInteger("java.version"); // 获取系统变量之版本号,11

String转boolean:

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

String转char[],用String.toCharArray():

char[] cs = "Hello".toCharArray(); // String -> char[]

char[] 转 String,可以直接作为实例参数。这里s指向一个新对象,修改cs的值不会影响s:

String s = new String(cs); // char[] -> String

从String的不变性设计可以看出,如果传入的对象有可能改变,需要复制而不是直接引用。例如:

public class Main {
   
    public static void main(String[] args) {
   
        int[] scores = new int[] {
    88, 77, 51, 66 };
        Score s = new Score(scores);
        s.printScores();
        scores[2] = 99;
        s.printScores();
    }
}

class Score {
   
    private int[] scores;
    public Score(int[] scores) {
   
        this.scores = scores.clone();  //这里要复制一份,否则类内部的scores[2]会被改为99
    }

    public void printScores() {
   
        System.out.println(Arrays.toString(scores));
    }
}

编码

  • ASCII: 1个字节
  • GB2312:2个字节,能表示汉字
  • Unicode:UCS-2用2个字节,UCS-4用4个字节
  • UTF-8:变长编码,用来把固定长度的Unicode编码变成1~4字节的变长编码。比如英文字符的Unicode编码高字节总是00,就有了压缩的空间。UTF-8编码的另一个好处是容错能力强,因为其高字节位能确定一个字符究竟是几个字节,它经常用来作为传输编码。

java中的char类型是2字节的Unicode,可以用getBytes()方法转为相应的编码(始终优先考虑UTF-8编码):

byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐
byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换,推荐
byte[] b2 = "Hello".getBytes("GBK"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
廖雪峰 Java 教程 Java教程 Java快速入门 Java简介 安装JDK 第一个Java程序 Java代码助手 使用IDE 使用IDE练习插件 Java程序基础 Java程序基本结构 变量和数据型 整数运算 浮点数运算 布尔运算 字符和字符串 数组型 流程控制 输入和输出 if判断 switch多重选择 while循环 do while循环 for循环 break和continue 数组操作 遍历数组 数组排序 多维数组 命令行参数 面向对象编程 面向对象基础 方法 构造方法 方法重载 继承 多态 抽象 接口 静态字段和静态方法 包 作用域 classpath和jar 模块 Java核心 字符串和编码 StringBuilder StringJoiner 包装JavaBean 枚举 BigInteger BigDecimal 常用工具 异常处理 Java的异常 捕获异常 抛出异常 自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class 访问字段 调用方法 调用构造方法 获取继承关系 动态代理 注解 使用注解 定义注解 处理注解 泛型 什么是泛型 使用泛型 编写泛型 擦拭法 extends通配符 super通配符 泛型和反射 集合 Java集合简介 使用List 编写equals方法 使用Map 编写equals和hashCode 使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream Filter模式 操作Zip 读取classpath资源 序列化 Reader Writer PrintStream和PrintWriter 日期与时间 基本概念 Date和Calendar LocalDateTime ZonedDateTime DateTimeFormatter Instant 最佳实践 单元测试 编写JUnit测试 使用Fixture 异常测试 条件测试 参数化测试
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值