Java学习之==>常用字符串方法
1、定义字符串
// 定义, 为初始化
String str1; // 定义, 并初始化为null
String str2 = null; // 定义, 并初始化为空串
String str3 = ""; // new 空串
String str4 = new String(); // new "hello"
String str5 = new String("hello"); // char数组创建
char[] chars = {'h', 'e', 'l', 'l', 'o'};
String str6 = new String(chars);
System.out.println("str6=" + str6); // 在char数组中切片,从0开始,切3个长度,即:hel
String str7 = new String(chars, 2, 3);
System.out.println("str7=" + str7); // ASCII码组成的数组切片后再转化成字符串
int[] codePoints = new int[]{97, 98, 99, 100, 101};
String str8 = new String(codePoints, 0, 3);
System.out.println("str8=" + str8); // 将字符串转化为字节数组
String val = "中国";
String str9 = new String(val.getBytes());
System.out.println("str9 = " + str9); // 将字符串转化为字节数组并指定字符编码
String str10 = new String(val.getBytes("UTF-8"), StandardCharsets.UTF_8);
System.out.println("str10 = " + str10);
2、获取字符串的属性
String str = " "; // String str = ""; // 空串
// String str = null; // 空指针
// 字符串是否为空,"",若为空则返回true,若不为空则返回false
boolean isEmpty = str.isEmpty();
System.out.println("str.isEmpty() = " + isEmpty); // 业务中经常使用的判断操作,是不是空指针, 然后才是判断是不是空串
// checkpoint 检查点, 这里是一些说明
if (str == null || str.isEmpty()) {
System.out.println("这是一个空串/空指针");
} // 字符串的长度
int length = str.length();
System.out.println("length = " + length); // 获取字符串的hash码
int hashCode = str.hashCode();
System.out.println("hashCode = " + hashCode);
3、转化:将各种数据类型转化为字符串
// 定义字符串
String str = "hello world"; // int & Integer 转 String
Integer num1 = 1024;
int num2 = num1;
String intValue = String.valueOf(num2);
System.out.println(intValue); // long & Long 转String的操作
Long num3 = 5689087678L;
long num4 = num3;
String longValue = String.valueOf(num4);
System.out.println(longValue); // float(Float) & double(Double) 转String,
String.valueOf(10.24F);
String.valueOf(10.24D); // boolean类型转化成String
String.valueOf(false); // 字节转化为String
String.valueOf('a'); // 对象转化成String
String.valueOf(new byte[]{1, 2, 3, 4});
String.valueOf(new char[]{'a', 'b', 'c', 'd'});
4、分割与连接
String str = "hello,world,hi,thank,you";
// 分割
String[] strarray = str.split(","); // 数组遍历
for (String s : strarray) {
System.out.println(s);
} System.out.println("\n-----我是分割线------\n"); String[] strarray2 = str.split(",", 3);
for (String s : strarray2) {
System.out.println(s);
} System.out.println("\n-----我是分割线------\n"); // 连接
String joinResult1 = String.join("+", strarray);
System.out.println("joinResult1 = " + joinResult1);
5、截取
String str = "123456789"; // 从beginIndex开始截取,一直截取到最后
String res1 = str.substring(3);
System.out.println("res1 = " + res1); System.out.println("\n-----我是分割线------\n"); // 从beginIndex开始截取一直截取到endIndex
String res2 = str.substring(3, 6);
System.out.println("res2 = " + res2); System.out.println("\n-----我是分割线------\n"); String originStr = " \nabcdefg\n ";
System.out.println("origin:[" + originStr + "]"); // 去掉字符串两边的空格和换行符
originStr = originStr.trim();
System.out.println("origin:[" + originStr + "]");
6、定位
String str = "hello,love,how are you, love,thanks,"; // 从前向后查找
int index = str.indexOf("love");
System.out.println("love first index = " + index); index = str.indexOf("love", 7);
System.out.println("love jump index = " + index); // 循环定位所有的字符串
String[] strarray = str.split(",");
for (String s : strarray) {
int i = str.indexOf(s);
System.out.println(s + ":" + i);
} index = str.indexOf('e');
System.out.println("char index = " + index); // 从后向前查找
index = str.lastIndexOf("love");
System.out.println("last index = " + index); // 找不着,返回-1
index = str.indexOf("yes");
System.out.println("none exists index = " + index); // 根据下标返回字符
char ch = str.charAt(0);
System.out.println("ch = " + ch);
ch = str.charAt(1);
System.out.println("ch = " + ch);
7、判断:值相等,地址相等,前缀相等,后缀相等,包含
String str1 = "hello";
String str2 = "hi";
String str3 = "hello";
String str4 = "HELLO"; // 判断字符串的值是否相等,不相等,返回false,相等则返回的true
boolean isEq = str1.equals(str2);
System.out.println("1:" + isEq);
isEq = str1.equals(str3);
System.out.println("2:" + isEq); // 判断内存地址是否相等
isEq = (str1 == str3);
System.out.println("3:" + isEq);
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str3)); // 忽略大小写的 相等判断
isEq = str1.equalsIgnoreCase(str4);
System.out.println("4:" + isEq);
isEq = str1.equals(str4);
System.out.println("5:" + isEq); // 起始前缀匹配判断 ,210_ 支付宝,230_ 微信,
String orderId1 = "210_100012342324324";
String orderId2 = "230_100012342324324";
boolean isStartWith1 = orderId1.startsWith("210_");
boolean isStartWith2 = orderId2.startsWith("210_");
System.out.println("isStartWith:" + isStartWith1);
System.out.println("isStartWith:" + isStartWith2); // 末尾后缀匹配判断
final boolean isEndWith = orderId1.endsWith("4324");
System.out.println("isEndWith = " + isEndWith); // 包含判断,如果包含子串返回true, 不包含返回false
String str = "hello world,hi";
final boolean isContains = str.contains("hi");
System.out.println("isContains = " + isContains);
8、转换&&替换
// 将所有字符转换为大写
String str = "hello";
String upperCase = str.toUpperCase();
System.out.println("upperCase = " + upperCase); // 将所有字符转换为小写
String str2 = "HELLO";
final String lowerCase = str2.toLowerCase();
System.out.println("lowerCase = " + lowerCase); // 将字符串转换为字符数组
String str3 = "abcde";
char[] chars = str3.toCharArray();
for (char ch : chars) {
System.out.println(ch);
} // 替换目标字符串
"hello world".replace("hello", "hi");
"hello world,hello java".replaceAll("hello", "hi");
"hello world,hello java".replaceFirst("hello", "hi");
9、面试点
1、String str = new String(“Hello”) 这段代码创建了几个对象
两个,字符串“Hello”存在常量池中,由这个字符串创建的一个新对象(存在堆内存当中)赋给了str 2、
public void interviewPoint1() {
String str1 = "hello";
String str2 = new String("hello"); System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
} 3、
public void interviewPoint2() {
String str1 = "hello";
String str2 = "hello"; System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
} 4、
public void interviewPoint3() {
String str1 = "a" + "b" + "c";
String str2 = "abc"; System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
} 5、
public void interviewPoint4() {
String str1 = "ab";
String str2 = "abc";
String str3 = str1 + "c"; System.out.println(str2 == str3); // false
System.out.println(str2.equals(str3)); // true
}
10、谈谈String, StringBuilder, StringBuffer的区别
设计
- String
- 由于其实现是不可变的(Immutable),进而原生支持线程安全,因为String对象一但建立就不可在修改。
- 引申: java8的 LocalDateTime。
- StringBuilder和StringBuffer
- 均继承自AbstractStringBuilder。
- 实现方法除Buffer的所有方法使用了synchronized外,无其他区别。
- 内部使用char数组做数据接收。
- class AbstractStringBuilder # char[] value;
- 默认大小是16,若超过16之后,会触发数组的扩容,arrayCopy,会有性能开销。
- 因此若能预估大小,尽量做到设定预期值,避免扩容。
应用
- String
- Java中字符串类,被修饰为final,因此是不可变数值的类,也不可被继承。
- 进而其相关操作,如截取,剪切,拼接等都是产生新的String。
- StringBuffer
- 当大量的String进行拼接时会产生大量的对象,为解决此问题则引入了StringBuffer。
- StringBuffer本质是一个线程安全的可修改的字符序列,为保证其线程的安全必定会损失一定的性能开销。
- 所有方法都带有 synchronized 关键字修饰 ** StringBuilder。
- jdk1.5新增,功能与StringBuffer一致,只是去掉了线程安全的实现部分,进而可提升其性能。
扩展
即使尽量减少了拼接带来的大量字符串对象的产生,但是程序内依旧还有很多重复的字符串,要怎么解决呢? 使用**缓存机制 **
- intern()方法,告知jvm将字符串缓存起来共用。
- dk1.6时不建议使用此方法,因为这个缓存的动作将将对象存储在PermGen(永久代),其空间有限,很难被gc,弄不好就容易造成OOM。
- 1.6之后的版本将此缓存至于堆中,大小为60013。
- 查看数值的参数配置: -XX:+PrintStringTableStatistics。
- 配置缓存的大小: -XX:StringTableSize=1024。
- 缺点: 程序员自己手动显示调用,很难把控好。
- jdk1.8 8u20之后,增加了一个新特性,G1 GC字符串排重。
- 将相同数据的字符串指向同一份数据来做到的,JVM底层提供支持。
- 此功能默认关闭,开启: -XX:UseStringDuplication, 前提: 使用G1 GC。
Java学习之==>常用字符串方法的更多相关文章
- Python学习之==>常用字符串方法
1.常用字符串方法 a = '\n 字 符 串 \n\n' b = a.strip() # 默认去掉字符串两边的空格和换行符 c = a.lstrip() # 默认去掉字符串左边的空格和换行符 d = ...
- Java获取各种常用时间方法大全
Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...
- c/c++再学习:常用字符串转数字操作
c/c++再学习:常用字符串转数字操作 能实现字符串转数字有三种方法,atof函数,sscanf函数和stringstream类. 具体demo代码和运行结果 #include "stdio ...
- Java学习-026-类名或方法名应用之二 -- 统计分析基础
前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...
- Java学习-025-类名或方法名应用之一 -- 调试源码
上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...
- [ Java学习基础 ] String字符串的基本操作
字符串的拼接 String字符串虽然是不可变的字符串,但也同样可以进行拼接,只是会产生一个新的对象.String字符串拼接的时候可以使用"+"运算符或String的concat(S ...
- 【原】Java学习笔记022 - 字符串
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 字符串 // 定义 ...
- java学习笔记5--类的方法
接着前面的学习: java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址 ...
- java学习笔记--常用类
一.Math类:针对数学运算进行操作的类 1.常用的方法 A:绝对值 public static int abs(int a) B:向上取整 public static double ceil( ...
随机推荐
- 标准C语言(1)
C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...
- Glass Carving CodeForces - 527C (线段树)
C. Glass Carving time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...
- Device Tree(一):背景介绍 转
作者:linuxer 发布于:2014-5-22 16:46 分类:统一设备模型 一.前言 作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎 ...
- Mysql和ORACLE索引的实现方式
B-Tree和B+Tree 目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 首先,对单个节点来说,是一个key value结构,key是作引的列,value有两种, ...
- solaris启动脚本S33installramdisk
脚本内容: state="$1" case "$state" in 'start') echo 'Starting install mr ramdisk' &g ...
- HTML中的     等6种空格标记
HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格( )在不同浏览器中宽度各异. 它叫 ...
- 绑定与非绑定方法及反射,isinstance和issubclass内置函数
目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...
- Python 面向对象Ⅳ
类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 在python中继承中的 ...
- 40.数组中只出现一次的数字(python)
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 将数组的因为就两个数只出现一次,所以,这些数字做异或之后,得到的结果是这两个数做异或的 ...
- Java架构师面试题——JVM性能调优
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...