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学习之==>常用字符串方法的更多相关文章

  1. Python学习之==>常用字符串方法

    1.常用字符串方法 a = '\n 字 符 串 \n\n' b = a.strip() # 默认去掉字符串两边的空格和换行符 c = a.lstrip() # 默认去掉字符串左边的空格和换行符 d = ...

  2. Java获取各种常用时间方法大全

    Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...

  3. c/c++再学习:常用字符串转数字操作

    c/c++再学习:常用字符串转数字操作 能实现字符串转数字有三种方法,atof函数,sscanf函数和stringstream类. 具体demo代码和运行结果 #include "stdio ...

  4. Java学习-026-类名或方法名应用之二 -- 统计分析基础

    前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...

  5. Java学习-025-类名或方法名应用之一 -- 调试源码

    上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...

  6. [ Java学习基础 ] String字符串的基本操作

    字符串的拼接 String字符串虽然是不可变的字符串,但也同样可以进行拼接,只是会产生一个新的对象.String字符串拼接的时候可以使用"+"运算符或String的concat(S ...

  7. 【原】Java学习笔记022 - 字符串

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 字符串 // 定义 ...

  8. java学习笔记5--类的方法

    接着前面的学习: java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址 ...

  9. java学习笔记--常用类

    一.Math类:针对数学运算进行操作的类 1.常用的方法 A:绝对值   public static int abs(int a) B:向上取整  public static double ceil( ...

随机推荐

  1. 标准C语言(1)

    C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...

  2. Glass Carving CodeForces - 527C (线段树)

    C. Glass Carving time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...

  3. Device Tree(一):背景介绍 转

    作者:linuxer 发布于:2014-5-22 16:46 分类:统一设备模型 一.前言 作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎 ...

  4. Mysql和ORACLE索引的实现方式

    B-Tree和B+Tree 目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 首先,对单个节点来说,是一个key value结构,key是作引的列,value有两种, ...

  5. solaris启动脚本S33installramdisk

    脚本内容: state="$1" case "$state" in 'start') echo 'Starting install mr ramdisk' &g ...

  6. HTML中的      等6种空格标记

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(      ‌‍)在不同浏览器中宽度各异.   它叫 ...

  7. 绑定与非绑定方法及反射,isinstance和issubclass内置函数

    目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...

  8. Python 面向对象Ⅳ

    类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 在python中继承中的 ...

  9. 40.数组中只出现一次的数字(python)

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   思路 将数组的因为就两个数只出现一次,所以,这些数字做异或之后,得到的结果是这两个数做异或的 ...

  10. Java架构师面试题——JVM性能调优

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...