【Java基础】字符串的内存情况及应用场景

String

特点

  • 用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改String str="hello";
  • 存储在堆中的字符串常量池
  • 已经定义过的字符串,再次定义时直接使用已有的
  • 字符串String类重写了**boolean equals(object obj)**方法,重写后的功能是比较两个字符串的内容是否一致

内存情况

  • 先去堆中的字符串常量池找"hello",没有找到则在字符串常量池中创建一个"hello"
  • 这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象,String str3=new String("hello");
java 复制代码
class Demo9{
	public static void main(String[] args){
//字符串:用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改
//先去堆中的字符串常量池找"hello",没有找到则在字符串常量池中创建一个"hello"
		String str1="he11o";
//先去堆中的字符串常量池找"hello",找到了,直接使用己有的"hello"
		String str2= "hello";
		sop(str1==str2); //true 
//这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象
		String str3=new String("hello"); 
		sop(str1==str3);//false
//字符串String类重写了boolean equals(object obj)方法,重写后的功能是比较两个字符串的内容是否一致
		boolean boo = str1.equals(str3);
		sop(boo);//true
	}
	//判断用户名密码是否正确
	public static boolean check(String username,String password){
		if(username!=null && username!="" && password!=null && password!=""){
			if("admin".equels(username)&&"123".equals(password))
				return true;
		}
	}
    //封装意识
	public static void sop(object obj){
		System.out.println(obj);
	}
}

字符串方法

获取

  1. 获取字符串的长度
    int length()

    java 复制代码
    int len = "owiueriouerioeur".length();
  2. 获取某一个位置上的字符
    char charAt(int index)

    java 复制代码
    char ch = "hello world".charAt(6);
  3. 获取字符在字符串中的位置

    如果要找的字符或者字符串不存在,返回值为**-1**

    • 返回字符在字符串中第一次出现的位置
      int indexOf(char ch)

      java 复制代码
      int index = "hello world".indexOf('l');
    • 第二个参数用于指定开始找的位置
      int indexOf(int ch, int fromlndex)

      java 复制代码
      int index = "hello world".indexOf('l',5);
    • 获取一个字符串在字符串中出现的位置
      int indexOf(String str)

      java 复制代码
      int index = "hello world llo".indexOf("llo");
    • 第二个参数用于指定开始找的位置
      int indexOf(String str, int fromIndex)

      java 复制代码
      int index = "hello world llo".indexOf("llo",5);
    • 最后一次出现的位置
      int lastlndexOf(char ch)

      java 复制代码
      int index = "hello world".lastIndexOf('k');

验证邮箱是否合法,包含@和. ,@在.的前边

java 复制代码
public static void main(String[] args) {
	boolean boo = checkEmail("xiaoer163.com");
	sop(boo);
}
public static boolean checkEmail(String email){
if(email!=null && email!="")
  if(email.indexOf('@' )==-1)
      return false;
	else if(email.indexOf(' . ' )==-1)
  	return false;
	else if(email.indexOf( '@' )>email.indexOf('.'))
  	return false;
	else
  	return true;
return false;
}

判断

  1. 判断是否包含 一个字符串
    boolean contains (CharSequence s) CharSequence

    java 复制代码
    boolean boo = "hello world".contains("wor");
  2. 判断两个字符串的内容是否相同 (区分大小写)
    boolean equals(Object anObject)

    java 复制代码
    boo = "hehe".equals("haha"); 
  3. 忽略大小写 ,判断两个字符串的内容是否相同
    boolean equalsIgnoreCase(String anotherString)

    java 复制代码
    boo = "HEHE".equalsIgnoreCase("hehe");
  4. 判断是否以某字符串开头
    boolean startsWith(String prefix)

    java 复制代码
    boo = "javamysql".startsWith("java");
  5. 判断是否以某字符串结尾
    boolean endsWith(String suffix)

    java 复制代码
    boo = "dog.jpg".endsWith("jpg");
  6. 判断字符串是否为

    为空返回true,不为空返回false

    只要双引号中有字符,就不是空字符串

    boolean isEmpty()

    java 复制代码
    boo = " ".isEmpty();

转换

字符数组字符串的转换

  1. 使用构造方法
    String(char[] value)

    java 复制代码
    char[] ch={'h','e','l','l','o'};
    String str1=new String(ch);//hello

    String(char[] value,int offset, int count) 字符数组,开始下标,个数

    java 复制代码
    String str2=new String(ch,2,3);//llo
  2. 使用静态方法
    static String copyValueOf(char[] data)

    java 复制代码
    String str3 = String.copyValueOf(ch);//hello

    static String copyValueOf(char[] data, int offset, int count)

    java 复制代码
    String str4=String.copyValueOf(ch,2,3);//llo
  3. 将字符串转成字符数组
    char[] toCharArray()

    java 复制代码
    char[] arr = "hello".toCharArray();//[h, e, l, l, o]
  4. 将字节数组转成字符串-----解码
    String(byte[] bytes)

    String(byte[] bytes, int offset, int length)

    java 复制代码
    byte[] b={65,66,67,68,69};
    String str5 = new String(b);//使用平台默认的编码进行解码
    sop(str5);//ABCDE
    String str6 = new String(b,2,3);
    sop(str6);//CDE

    使用指定的编码将字节数组转换成字符串:
    String(byte[] bytes, String charsetName)

    java 复制代码
    byte[] bb={-28, -67, -96, -27, -91, -67};
    String str6=new String(bb,"UTF-8");//使用UTF-8进行解码
    sop(str);//你好
  5. 将字符串转成字节数组-----编码
    byte[] getBytes()

    java 复制代码
    byte[] c = "你好".getBytes(); //------使用平台默认的编码进行编码
    sop(Arrays.toString(c));//[-60, -29, -70, -61]
    byte[] cc = "你好".getBytes("UTF-8"); //------使用UTF-8进行编码
    sop(Arrays.toString(cc));//[-28, -67, -96, -27, -91, -67]
  6. 将基本数据类型转换成字符串

    静态方法String.valueOf()

    java 复制代码
    String ss=String.valueOf(88);//88

替换

生成新的字符串,原字符串并没有被修改,字符串是不能被修改的

String replace(char oldChar, char newChar )
String replace(CharSequence target, CharSequence replacement)

java 复制代码
String str = "hello world".replace('o','k');//hellk wkrld
String ss = "hello world".replace("wor","wc");//hello wcld

子串

String substring(int beginIndex )
String substring(int beginIndex, int endIndex)

包含起始位置,不包含结束位置,到结束位置的前一位

java 复制代码
String s="I love java";
String s1=s.substring(7);//java
String s2=s.substring(2,6);//love

转换

大小写转换
String toLowerCase()
String toUpperCase( )

java 复制代码
String t = "abcdefg".toUpperCase();//ABCDEFG
String tt = "LMN".toLowerCase();//lmn

去除空格

将字符串两端的空格去掉
String trim()

java 复制代码
String m="    iweurie   owieuroiwer  ".trim();
sop("["+m+"]");//[iweurie   owieuroiwer]

模拟trim方法,将字符串两端的空格去掉String trim()

java 复制代码
class Demo3{
	public static void main(String[] args){
		String s=trim("   hello ");
		sop("["+s+"]");
	}
	public static String trim(String str){
		int start=0,end=str.length()-1;
		//从左边找到第一个不是空格的字符
		while (str.charAt(start)==' ' && start<=end)
			start++;
		//从右边找到第一个不是空格的字符
		while (str.charAt(end)==' ' && end>=0)
			end--;
		return str.substring(start,end+1);
	}
	public static void sop(Object obj){......}
}

比较

  • 字典顺序比较两个字符串;

  • 左边的大于右边的返回大于0的数,左边的小于右边的返回小于0的数,左边的等于右边的返回0;

  • 对应的字符一一对比(第一个和第一个比,第二个和第二个比,......),当出现第一对互不相同的字符时,哪个字符大哪个字符串就大

int compareTo(String anotherString )
int compareToIgnoreCase(String str) (不区分大小写,比较大小)

java 复制代码
int x = "aecd".compareTo("aaa");//4
x = "abc".compareToIgnoreCase("ABC");//0

拼接

String concat(String str)

java 复制代码
String y = "hello".concat("world");//helloworld

切割

String[] split(String str)

java 复制代码
String str=",wang,ji,guo,chen,sun";
String[] arr = str.split(",");
for(String ss:arr)
	sop(ss);

静态方法

将若干个字符串拼接到一起,在拼接的时候,元素与元素之间以指定的分隔符进行分隔。
String join ( CharSequence delimiter, CharSequence... elements )

java 复制代码
String ss = String.join(",","ding","wang","yan");

以指定的格式,进行字符串的格式化
String format ( String format, object... args )

java 复制代码
ss = String.format("%8s%5d%.1f%8c","hello",66,88.88,'k');
//1234567812345123412345678
//   hello   6688.9       k
ss = String.format("%8s %5d %.1f %8c","hello",66,88.88,'k');
//12345678_12345_1234_12345678
//   hello    66 88.9        k
常见占位符

%s : 替代字符串 → %ns : 凑够n位字符串,如果不够,补空格
%d : 整型数字占位符 → %nd : 凑够n位,如果不够,补空格
%f : 浮点型数字占位符 → %.hf : 保留小数点后面指定位的数字
%c : 字符型占位符

字符串缓冲区

  • StringBuffer

    可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。

    线程安全的,可以安全地被多个线程使用

  • StringBuilder

    不能安全使用多线程

存储

  • StringBuffer append(boolean b)

    • 默认添加在容器的末尾
    • 返回原容器
    java 复制代码
    StringBuffer stringBuffer=new StringBuffer(); //字符串缓冲区
    StringBuffer sb1 = stringBuffer.append(false);//返回原容器
    StringBuffer sb2 = stringBuffer.append(666);
    sop(stringBuffer==sb1);
    sop(stringBuffer==sb2);
    stringBuffer.append(false).append(666).append("hello");//默认添加在容器的末尾
    sop(stringBuffer);//StringBuffer重写了toString方法,返回的是容器中的字符串
  • StringBuffer insert(int offset, boolean b)

    • 在指定位置添加数据
    java 复制代码
    stringBuffer.insert(8,"ok");//在指定位置添加数据

删除

StringBuffer delete(int start, int end)

不包括结束下标上的字符,到结束下标的前一位

StringBuffer deleteCharAt(int index)

java 复制代码
stringBuffer.delete(8,10);
stringBuffer.deleteCharAt(7);

修改

StringBuffer replace(int start, int end, String str)

不包括结束下标上的字符,到结束下标的前一位

void setCharAt(int index, char ch)

java 复制代码
stringBuffer.replace(5,7,"88");
stringBuffer.setCharAt(6,'6');

获取

char charAt(int index)
int indexOf(String str)
int indexOf(String str, int fromIndex)

int lastIndexOf(String str)

返回最右边出现的指定子字符串在此字符串中的索引。

int lastIndexOf(String str, int fromIndex)

返回最后一次出现的指定子字符串在此字符串中的索引。

int length()

返回长度(字符数)。

反转

StringBuffer reverse()

练习:使用StringBuilder打印一个矩形

java 复制代码
public static void show(int rows,int cols)
{
	StringBuilder stringBuilder=new StringBuilder();
	for(int i=1;i<=rows;i++)
	{
		for(int j=1;j<=cols;j++)
		{
			stringBuilder.append("*");
		}
			stringBuilder.append("\r\n");
	}
		sop(stringBuilder);
}
相关推荐
wm104319 分钟前
java web springboot
java·spring boot·后端
smile-yan20 分钟前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风21 分钟前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~25 分钟前
Maven极简安装&配置-241223
java·maven
皮蛋很白27 分钟前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea
青年有志29 分钟前
JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
java·web
上海研博数据33 分钟前
flink+kafka实现流数据处理学习
java
KpLn_HJL35 分钟前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
小扳2 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
龙少95432 小时前
【深入理解@EnableCaching】
java·后端·spring