廖雪峰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见易佰教程
顺便吐槽以下,台独无处不在
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转换为其他类型
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
/*"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');
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编码
转载于:https://www.cnblogs.com/csj2018/p/10289915.html
廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码相关推荐
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday {//定义int常量public static final int SUN = 0;public static final int MON = ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...
- 【JAVA学习】2、面向对象编程的核心——对象和类
[JAVA学习]面向对象编程的核心--对象和类 前言 面向过程VS面向对象 基础概念 优缺点比较 面向对象三大基础特性 封装 继承 多态 面向对象编程的五大基本原则 单一职责原则SRP(Single ...
- python的核心理念是什么_Python 面向对象编程的核心概念知识点简介
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于 无量测试之道 ,作者: 无量测试之道 刚接触Python的新手.小白,可以复制下面 ...
- 【面向对象编程】(4) 类的继承,重构父类中的方法
各位同学好,今天和大家分享一下面向对象编程中,类的三大特征之继承.主要介绍:子类继承父类的基本方法:重写父类的类方法:重构父类的初始化方法:super() 方法.本节主要是单继承,多继承在下一节中介绍 ...
- 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系
各位同学好,今天和大家分享一下面向对象编程中,类之间的交互,类之间的依赖关系和关联关系.有不明白的可见前一章节:https://blog.csdn.net/dgvv4/article/details/ ...
- c语言面向对象编程中的类_C ++中的面向对象编程
c语言面向对象编程中的类 Object oriented programming, OOP for short, aims to implement real world entities like ...
- Java面向对象编程篇1——类与对象
Java面向对象编程篇1--类与对象 1.面向过程 1.1.概念 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了 1.2.优缺点 优点:性 ...
- System Verilog面向对象编程(OPP)基础——类(class)的基本使用
该文主要是笔者梳理绿皮书对应章节的内容 System Verilog面向对象编程OPP基础--类(class)的基本使用 面向对象编程 概述 考虑名词而非动词 编写第一个类class OOP术语 创建 ...
最新文章
- mysql100个优化技巧_MySQL 调优/优化的 100 个建议
- printf 中转义字符大全
- WIN7实现多用户远程桌面
- ad 单点登录 java 访问权限_AD 单点登录以及windows认证详细说明
- spi 动态加载、卸载_理解 ServiceLoader类与SPI机制
- 洛谷入门题P1422、P1085、P1089、P1909题解(Java语言描述)
- 7-15 求组合数 (15 分)
- netstat命令详解Linux,Linux netstat命令详解
- wps 宏 禁用_WPS宏被禁用如何打开
- android+浮层布局,如何使用Android实现单页面浮层可拖动view
- ws550 第三方固件_华为WS550路由器如何固件升级
- 2019年新能源汽车补贴政策,赶紧了解车牌识别!
- python h5py详解
- easyExcel设置最后一行的样式【可以拓展为每一行】
- 数据库的升序降序排列
- Vue全家桶系列之Vuex(三)
- 微信APP支付服务端PHP完整代码
- blood pressure android app,App Store 上的“Blood Pressure App ++”
- 扫码授权登录最佳实践
- belt rust take tours_「Rust每日新闻」本周精选 • 第二十二期
热门文章
- unraid 下 nextcloud 的偏保姆级搭建教程
- cocos2dx游戏开发学习——虚拟摇杆(8方向)讲解
- HomeWorkDay05---下载小说
- PB读取配置文件ini(ProfileString)
- 开启可牛超强保护模式,提示:eset nod32 file on-access scanner无法删除的解决方案
- 考研规划计算机科学与技术,2017考研:计算机科学与技术专业考研年复习规划...
- php数组排序后保留键名,详解PHP 二维数组排序保持键名不变
- 麦芒6计算机记录,最简单易懂的HUAWEI 麦芒6实用小攻略
- R语言数字 时间戳转化成时间
- 上海交大计算机专业英语课本,学术英语 上海交通大学