廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码
Java的字符串用String表示
1.String特点:
- 可以直接使用"..."表示一个字符串,不强制使用new String
- 内容不可变
String s1 = "hello world";
String s2 = new String("Hello");
2.判断是否相等equals
String s = "hello world";
s.equals("hello world");
s.equalsIgnoreCase("Hello WORLD");//忽略大小写
3.是否包含一个子串
- contains:是否包含一个字串,boolean类型
- indexOf:返回子串在原字符中的第一个位置的索引,没有返回-1,int类型
- lastIndexOf:返回子串在原字符中最后一个位置的索引,没有返回-1,int类型
- startsWith:原字符串是否以子串开始,boolean类型
- endsWith:原字符串是否以子串结尾,boolean类型
String s = "hello world";
System.out.println(s + "是否包含world:" + s.contains("world"));
System.out.println(s + "中第一个o的位置:"+ s.indexOf("o"));
System.out.println(s + "最后一个o的位置:" + s.lastIndexOf("o"));
System.out.println(s+ "是以ll开头:" + s.startsWith("ll"));
System.out.println(s+"是以ld结尾:" + s.endsWith("ol"));
4.trim()移除字符串的空格
- 移除首尾空白字符,包含空格 \t \r \n
- 注意:trim不改变字符串内容,而是返回新字符串
String s = " \thello world\r\n";
System.out.println(s.trim());
System.out.println("a"+s+"a");//首尾添加字符可以看到原字符包含的空格
5.提取字串
String s = "hello world";
System.out.println("4:"+s.substring(4));
System.out.println("4-8:"+s.substring(4,8));
6.大小写转换
- toUpperCase()转换为大写,可以加地区
- toLowerCase()转换为小写,可以加地区
String s = "hello world";
System.out.println(s.toUpperCase());
System.out.println(s.toLowerCase());
System.out.println(s.toLowerCase(Locale.CANADA));
System.out.println(s.toUpperCase(Locale.CANADA));
关于java.util.locale见[易佰教程](https://www.yiibai.com/java/util/java_util_locale.html)
顺便吐槽以下,台独无处不在
7.替换字串replace
replace有2个重载方法,分别替换1个字符和1串字符
正则表达式替换字串
- replaceAll(String regex, String replacement)
- replaceFirst(String regex, String replacement)
String s = "hello world";
System.out.println(s.replace("l","r"));
System.out.println(s.replace("ll","er"));
8.分割字符串split
通过正则表达式分割字符串
String s = "hello world";
String[] ss = s.split("[e|o]");
System.out.println(Arrays.toString(ss));
9.拼接字符串join()
使用String的静态方法join拼接字符串
String[] arr = {"A","B","C"};
String s = String.join("~~",arr);
System.out.println(s);
10.String类和其他数据类型的转换
如果要任意数据转换为String,可以使用String的static方法:
//String.valueOf(可以传入int类型、布尔类型、object对象)
System.out.println(String.valueOf(123));
System.out.println(String.valueOf(true));
System.out.println(String.valueOf(new Object()));
System.out.println(new Object().toString());
把String转换为其他类型
```#java
System.out.println(Integer.parseInt("123"));
System.out.println(Integer.valueOf("123"));
System.out.println(Integer.getInteger("123"));//去环境变量查找有无123这个环境变量
```
11.String和char的互相转换
String类型内部为一个char类型的数组,因此可以把String和char类型互相转换
- String转换为char数组:toCharArray()
- char数组转换为String:new String(char[])
String s = "hello world";
char[] cs = s.toCharArray();
String s2 = new String(cs);
System.out.println(Arrays.toString(cs));
System.out.println(s2);
12.String和byte的转换
String转换为byte[]:
- getBytes() 使用系统自带的编码格式不推荐。因为系统默认编码不一致。windows使用gbk编码,Linux、Mac使用utf-8编码
- getBytes(String) 指定编码格式
- getBytes(Charset) 指定编码格式
public static void main(String[] args) throws UnsupportedEncodingException {
//字符串转化为byte[]
byte[] bs1 = "hello world".getBytes();
byte[] bs2 = "女人找不到,男人也能凑合".getBytes("UTF-8");
byte[] bs3 = "智能ABC".getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(bs1));
System.out.println(Arrays.toString(bs2));
System.out.println(Arrays.toString(bs3));
//byte[] 转换为String:
String s1 = new String(bs1);
String s2 = new String(bs2);
String s3 = new String(bs3);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
计算机中只能表示数字,如果要表示字符,需要把字符编码为数字。
最早的编码是ASCII码,一个字符占一个字节,ASCII码最高位是0,因此最多表示128个字符(2^7)。如字符A的编码是0x41。
对于中文来说,显然是不够用的,因此一个中文字符需要占用2个字节。中文编码规范有GB2132,GBK,GB18030。中文编码的第一个字节最高位是1。如GBK编码中,“中”两个字节是d6和d0。
同理其他不同的国家使用双字节进行编码,就会冲突。比如页面有多国文字,如果编码冲突,就会显示乱码。为了解决这一问题,出现了全球统一编码:Unicode。
unicode确保全球所有文字都有唯一编码,这样就不会再有冲突。一个Unicode字符通常占2个字节,Java使用Unicode编码。
问题:有了Unicode,为什么还需要UTF-8?
原因:1.英文Unicode编码和ASCII不一致。一个英文字符,Unicode占用2个字节,最高字节是0;ASCII占用1个字节。因此包含大量英文的文本会浪费一定的空间。
2.其次原来的软件不能识别Unicode编码会报错
UTF-8编码是变长编码
* 英文UTF-8和ASCII一致
* 其他Unicode字符需2-6字节不等 “中”:GBK~d6d0 ,Unicode:4e2d,UTF-8~e4b8ad
```#java
/*
"A"在ASCII、Unicode、UTF-8不同编码中的值
utf-8和ASCII都返回一个10进制数65。
将其转换为16进制,结果为41。
Unicode为2个字节,补全第一个字节,使用Java自身的Unicode打印编码为0041的char,结果为A
*/
String a = "A";
byte[] bs1 = a.getBytes("UTF-8");
System.out.println(Arrays.toString(bs1));
byte[] bs2 = a.getBytes(StandardCharsets.US_ASCII);
System.out.println(Arrays.toString(bs2));
System.out.println(Integer.toHexString(65));
System.out.println('\u0041');
<img src="https://img2018.cnblogs.com/blog/1418970/201901/1418970-20190119163816175-6398155.png" width="500" />
```#java
public static void main(String[] args) throws UnsupportedEncodingException {
//打印‘中’在utf-8,unicode,gbk中的不同编码值
String a = "中";
System.out.print("\nutf-8编码转换为16进制后:");
byte[] bs1 = a.getBytes("UTF-8");
for(byte b:bs1){
System.out.print((String)Integer.toHexString(b)+"\t");
}
System.out.print("\nGBK编码转换为16进制后:");
byte[] bs2 = a.getBytes("GBK");
for(byte b:bs2){
System.out.print(Integer.toHexString(b)+"\t");
}
char c = '中';
int n = c;
System.out.print("\nUnicode编码转换为16进制后:"+Integer.toHexString(n));
System.out.println();
System.out.println("使用Unicode打印\\u4e2d的char值:"+'\u4e2d');
}
- UTF-8容错能力强
单字节的utf-编码首位是0:0xxxxxxx
双字节的utf-编码前2位是11:110xxxxx xxxxxxxx
三字节的utf-编码首位是111:1110xxxx xxxxxxxx xxxxxxxx
Java使用Unicode编码,程序运行时使用Unicode编码
- 输入输出是把String和byte[]转换,需要考虑编码
- 始终优先考虑UTF-8编码
总结:
- 字符串是不可变对象
- 字符串操作不改变原字符串内容,而是返回新字符串
- 常用的字符串操作:提取子串、查找、替换、大小写转换等
- 字符串和byte[]互相转换时要注意编码,建议总是使用utf-8编码
廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码的更多相关文章
- 廖雪峰Java2面向对象编程-6Java核心类-3包装类型
Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...
- 廖雪峰Java2面向对象编程-6Java核心类-2StringBuilder
字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0 ...
- 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...
- 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean
1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...
- 廖雪峰Java2面向对象编程-3继承和多态-1继承
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...
- 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...
- 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar
1.classpath 1.1classpath定义 classpath是一个环境变量 classpath指示JVM如何搜索class classpath设置的搜索路径与操作系统相关 * window ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...
随机推荐
- CentOS安装备忘2
CentOS7安装备忘2 安装过程中不联网,安装完成也不要立刻联网,先关闭远程的服务后再联网更新.安装默认使用English,目的是生成的Home下所有文件夹都是英文的,方便使用. ========= ...
- Linux,IDS入侵防御系统
https://www.comparitech.com/net-admin/network-intrusion-detection-tools/11 2018年的顶级入侵检测工具 https://op ...
- 《DSP using MATLAB》Problem 5.17
1.代码 %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% ...
- Python基础线程和协程
线程: 优点:共享内存,IO操作时,创造并发操作 缺点:枪战资源 线程不是越多越好,具体案例具体分析,请求上下文切换耗时 IO密集型适用于线程,IO操作打开文件网络通讯类,不需要占用CPU,只是由CP ...
- Centos7安装teamviewer 32/64位
centos7安装teamviewer teamviewer安装包,自己去官网下吧,不用找了,估摸着就没有Centos7 64位的 所以直接下centos teamviewer 32位那个rpm包吧 ...
- shell基础入门(一)
//获取输入内容 #!/bin/bash echo "What is your name?" read PERSON read -p "who are you name: ...
- postgresql的基本使用,以及数据库的备份与恢复
安装过程没什么说的,基本是一直下一步下一步,就是中间需要输入密码之类的 postgresql使用模式是数据库表,视图等的集合,我们可以自荐创建一个schema 创建表的方法 进入sql命令行窗口的方法 ...
- MySQL DataType--字符串函数
1.UPPER和UCASE返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写.该函数对多字节是可靠的. 2.LOWER和LCASE返回字符串str, ...
- Singer 学习五 docker 运行说明
介绍过一个工具knots ,方便Singer 可视化开发的工具,但是默认这个工具包含的tap 以及target 比较少(可以自己扩展) 同时这个工具就是基于docker 运行的 docker 运行的几 ...
- Unity项目架构设计与开发管理 学习
视频地址:https://v.qq.com/x/page/d016340mkcu.html assetstore save manager