第十四届蓝桥杯集训——字符串函数(基础函数操作)

举报
红目香薰 发表于 2023/01/23 17:04:03 2023/01/23
【摘要】 ​ ​编辑第十四届蓝桥杯集训——字符串函数(基础函数操作)目录 第十四届蓝桥杯集训——字符串函数String的由来String 和 new String的区别1、创建的字符串变量在内存中的区别。2、特性不同:3、性能效率不同:4、是否相同判断常用字符串列表substringreplacetrimtoCharArraytoLowerCase与toUpperCaseindexOfsplitStr...

 编辑

第十四届蓝桥杯集训——字符串函数(基础函数操作)


目录

 第十四届蓝桥杯集训——字符串函数

String的由来

String 和 new String的区别

1、创建的字符串变量在内存中的区别。

2、特性不同:

3、性能效率不同:

4、是否相同判断

常用字符串列表

substring

replace

trim

toCharArray

toLowerCase与toUpperCase

indexOf

split



String的由来

通过以下编码可以看出,字符串实际就是字符数组。

char chars[]={'a','b','c'};
String s=new String(chars);
System.out.println(s);
int len=s.length();
System.out.println(len);

字符串转成byte数组

String s = "Hello world";
byte[] bytes = s.getBytes();
for (byte b : bytes) {
    System.out.print((char)b);
}

编辑

String 和 new String的区别

1、创建的字符串变量在内存中的区别。

两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。

String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。

在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

编辑

2、特性不同:

String类 是final修饰的,不可以被继承。

String类的底层是基于char数组的。

3、性能效率不同:

String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。例如:
String str = “hello";
str = str + "world“;
所以当上文str指向了一个String对象(内容为“hello”),然后对str进行“+”操作,str原来指向的对象并没有变,而是str又指向了另外一个对象(“hello world”),原来的对象还在内存中。
由此也可以看出,频繁的对String对象进行修改,会造成很大的内存开销。此时应该用StringBuffer或StringBuilder来代替String。

而new String()更加不适合,因为每一次创建对象都会调用构造器在堆中产生新的对象,性能低下且内存更加浪费。

4、是否相同判断

String s0="abc",s1="abc" ;

if(s0==s1){} 结果为true 因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,所以a和b指向的是同一个对象。

String s2=new String("abc"); String s3=new String("abc");

if(s2==s3){} 结果为false,此时a和b指向不同的对象

String s2=new String("abc"); String s3=new String("abc");

if(a.equals(b)){} 结果为true

package com.item.action;

public class Demo {

	public static void main(String[] args) {
		String s0="abc";
		String s1="abc";
		String s2=new String("abc");
		String s3=new String("abc");
		System.out.println(s0==s1);
		System.out.println(s1==s2);
		System.out.println(s2==s3);
		System.out.println(s0.hashCode());
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		System.out.println(s3.hashCode());
		System.out.println(s0.equals(s1));
		System.out.println(s1.equals(s2));
		System.out.println(s2.equals(s3));
	}

}

输出结果: 

编辑

常用字符串列表

length()//取得字符串的长度

substring()//字符串截取

concat() //连接两个字符串

replace()//替换

trim()//去掉起始和结尾的空格

valueOf()//转换为字符串

toLowerCase()//转换为小写

toUpperCase()//转换为大写

toCharArray()//转char数组

equals()//比较两个字符串区分大小写

equalsIgnoreCase()//比较两个字符串不区分大小写

indexOf()//查找字符或者子串第一次出现的地方

lastIndexOf()//查找字符或者子串是后一次出现的地方

split()//字符串分割

substring

public class Demo {
    public static void main(String[] args) {
        String str="I HAVE A DREAM!";
        String s = str.substring(2, 2+4);
        System.out.println(s);
    }
}

replace

public class Demo {
    public static void main(String[] args) {
        String str="I HAVE A DREAM!";
        String s = str.replace("DREAM", "GOOD IDEA");
        System.out.println(s);
    }
}

trim

public class Demo {
    public static void main(String[] args) {
        String str="\tI HAVE A DREAM!\t";    
        String s = str.trim();
        System.out.println(s);
    }
}

toCharArray

public class Demo {
    public static void main(String[] args) {
        String str = "89dsa dady8)ILuhd9usa)(*YGIUhdusa hoi";
        char[] array = str.toCharArray();
        int low = 0;
        int up = 0;
        int num = 0;
        int other = 0;
        for (char c : array) {
            if (c >= 'a' && c <= 'z') {
                low++;
            } else if (c >= 'A' && c <= 'Z') {
                up++;
            } else if (c >= '0' && c <= '9') {
                num++;
            } else {
                other++;
            }
        }
        System.out.println(str.length());
        System.out.println(low);
        System.out.println(up);
        System.out.println(num);
        System.out.println(other);
    }
}

toLowerCase与toUpperCase

public class Demo {
    public static void main(String[] args) {
        String str="I HAVE A DREAM!";
        String lowerCase = str.toLowerCase();
        System.out.println(lowerCase);
        String upperCase = str.toUpperCase();
        System.out.println(upperCase);
    }
}

indexOf

import java.util.UUID;
 
public class Demo {
    public static void main(String[] args) {
        String str = UUID.randomUUID().toString().replaceAll("-", "");
        String fileName = str.concat(".jpg");
        int indexOf = fileName.indexOf(".jpg");
        System.out.println(indexOf);
        System.out.println(fileName.substring(indexOf,fileName.length()));
    }
}

split

import java.util.UUID;
 
public class Demo {
    public static void main(String[] args) {
        String str = UUID.randomUUID().toString();
        System.out.println(str);
        String[] split = str.split("-",str.length());
        for (String string : split) {
            System.out.println(string);
        }
    }
}

后续会有对应的联系题目。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。