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. Mac OSX编译安装php5.6

    安装好OSX 10.13以后默认自带的php7.1.7,跟现有环境不兼容,所以准备编译安装php5.6,自带的php7不建议卸载,重新安装一份php5.6 1.安装php的一些依赖,推荐使用brew安 ...

  2. Codeforces Round #581 (Div. 2) B. Mislove Has Lost an Array (贪心)

    B. Mislove Has Lost an Array time limit per test1 second memory limit per test256 megabytes inputsta ...

  3. 【转载】Stanford CoreNLP Typed Dependencies

    总结自Stanford typed dependencies manual 原文链接:http://www.jianshu.com/p/5c461cf096c4 依存关系描述句子中词与词之间的各种语法 ...

  4. IDEA查看JDK源代码

    之前已经讲解过如何使用Eclipse查看源代码,IDEA作为一个集成开发环境越来越流行,今天学习以下如何使用Eclipse查看JDK的代码. File->Project Structure,选择 ...

  5. 程序包管理工具yum

    yum 首先要有一个网络上或本地或远程的yum仓库.然后需要yum安装程序的机器去yum仓库下载yum元数据(包括包信息和依赖信息)到本地的cache里.当需要安装程序的时候,会查看yum源数据里是否 ...

  6. Spring整合Hibernate实现Spring Data JPA (简单使用)

    直接上代码: pom.xml <!-- hibernate start --> <!-- spring data jpa --> <dependency> < ...

  7. Swagger使用--在一个Controller中使用相同(类似)参数的方法

    解决方法:在Startup.cs中加入CustomSchemaIds // Register the Swagger generator, defining 1 or more Swagger doc ...

  8. 29. ClustrixDB 分布式架构/并发控制

    介绍 ClustrixDB使用多版本并发控制(MVCC)和2阶段锁(2PL)的组合来支持混合的读写工作负载.在我们的系统中,读取器享受无锁快照隔离,而写入器使用2PL来管理冲突.并发控制的组合意味着读 ...

  9. 计算机网络(十二),Socket简介

    目录 1.Socket简介 2.Socket工作原理 十二.Socket简介 1.Socket简介 2.Socket工作原理

  10. Python初记

    ------Python是一个优雅的大姐姐 我是通过<老男孩Python>学习Python,根据我手上的资源学习Python,资料不齐,但是这个是最好的,边学习边寻找有没有相同的类型. 在 ...