0
点赞
收藏
分享

微信扫一扫

【Java】常用类.String



文章目录

  • ​​常用类.String​​
  • ​​一、基本知识​​
  • ​​二、String常用方法​​
  • ​​2.1 String类常用的构造方法​​
  • ​​2.2 字符串常用方法​​

常用类.String

一、基本知识

java.lang.String;是字符串类型的

1.字符串一旦创建不可再改变

  • “abc”字符串对象一旦创建,不可再改成“abcd”。

2.提升字符串的访问效率:

  • 在程序中使用了“缓存”技术。即用""括起来的字符串都会在"字符串常量池"中创建一份 。字符串常量池在方法区内存被存储。

3.在程序执行过程中,如果程序用到某个字符串,例如"abc"。name程序会在常量池中去搜索该字符串 ,如果未找到就在字符串常量池中新建一个abc字符串,有的话就直接拿来用。 (字符串常量池是一个缓存区,为了提高访问字符串的效率)

public class StringTest01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//s1是一个引用,指向的是“abc”
String s1 = "abc";
//s1只是局部变量,在未有final修饰时,可以指向新的字符串
//但是"abc""def"两个字符串一经创建后就会进入缓存区,不可更改
s1 = "def";

String s2 = "hello"; //在字符串常量池中新建
String s3 = "hello"; //直接从常量池中那来用,内存地址一样
System.out.println(s2==s3); //这里比较的仅是内存地址 true
System.out.println(s2.equals(s3)); //true
//== 两边如果是引用类型,则比较内存地址,地址相同为true,不同为false
// 所以 Object中的equals方法 比较的是两者的内存地址
// Object中的equals方法设计目的:比较两个对象是否一致

String s4 = new String("abc");
String s5 = new String("abc");
System.out.println(s4==s5); //创建了两个不同的对象,内存地址不一样 false
System.out.println(s4.equals(s5)); //true Object类中的equals比较的是内存地址,本该是false
//但是String类中重写了equals方法,比较的是内容。

//以下程序会建立3个字符串对象
String s6 = "aaa";
String s7 = "bbb";
String s8 = s6+s7;
}
}

true
true
false
true

4.对于两种方式的比较:

String s1 = “abc”; //只会在字符串常量池中创建新的"abc"对象
String s2 = new String("abc"); //若字符串常量池中未存在,将会新建对象,并且关键的是还会在堆内存的对象内再次创建一个对象

【Java】常用类.String_字符串常量池


通常第二种方式比较浪费内存。

例如:

String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");

该方法创建了一共有5个新的对象:
堆内存 — 3个 (hello、hello、world)
字符串常量池 — 2个 (hello、world)

5.使用String时,我们应当尽量不要做字符串的拼接操作。因为字符串一旦创建不可更改,如果频繁的拼接,会导致字符串常量池中连续地创建新的字符串对象,一来浪费空间,二来会给垃圾回收器带来问题。
​​​另外本人找到一篇关于Java常量池理解与总结较为详细,可供参考:https://www.jianshu.com/p/c7f47de2ee80 非常感谢此作者的文章!​​

​​返回顶部​​

二、String常用方法

2.1 String类常用的构造方法

public class StringTest02 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//1.
String s1 = "abc";

//2.
String s2 = new String("abc");

//3.
byte[] bytes = {97,98,99,100};
String s3 = new String(bytes);
System.out.println(s3); //从结果可以看出String重写了Object的toString方法

//4.
String s4 = new String(bytes,1,2);
System.out.println(s4);

//5.
char[] c1 = {'我','是','中','国','人','武','汉','加','油'};
String s5 = new String(c1);
System.out.println(s5);

//6.
String s6 = new String(c1,5,4);
System.out.println(s6);
}
}

以下是jdk帮助文档中的一些相关内容:

【Java】常用类.String_字符串_02

【Java】常用类.String_字符串_03


【Java】常用类.String_字符串_04

【Java】常用类.String_常用类_05


【Java】常用类.String_字符串_06

​​返回顶部​​

2.2 字符串常用方法

public class StringTest03 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//1.char charAt(int index);
//返回指定所引出的一个char值
char c1 = "asfdaf".charAt(4);
System.out.println(c1); //c

String s1 = "我是猪";
char c2 = s1.charAt(2);
System.out.println(c2); //猪

//2.boolean endsWith(String endStr);
System.out.println("helloWorld.java".endsWith(".java")); //true

//3.boolean equalsIgnoreCase(String anotherString);
//比较字符串是否相等,并且忽略大小写
System.out.println("abc".equalsIgnoreCase("ABC")); //true

//4.byte[] getBytes()
//使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
byte[] bytes = "abc".getBytes();
for(int i = 0; i < bytes.length; i++){
System.out.println(bytes[i]); // 97 98 99
}

//5.int indexOf(int ch)
//返回指定字符第一次出现的字符串内的索引。 空格也占一个字节
System.out.println("I love you forever!".indexOf("forever")); //11

//6.int indexOf(int ch, int fromIndex)
//返回指定字符第一次出现的字符串内的索引,以指定的索引开始往后搜索。
System.out.println("javaScript.java".indexOf("java", 2)); //11

//7.int lastIndexOf(String str)
//返回指定子字符串最后一次出现的字符串中的索引。
System.out.println("javaScript.java".lastIndexOf("java")); //11

//8.int lastIndexOf(String str, int fromIndex)
//返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始往前搜索。
System.out.println("javaScript.java".lastIndexOf("java", 14)); //11

//9.String replaceAll(String regex, String replacement)
//用给定的替换替换与给定的 regular expression匹配的此字符串的每个子字符串。
//该部分共创建4个字符串对象
System.out.println("javaScript.java".replaceAll("java", "mysql")); //mysqlScript.mysql

//10.String[] split(String regex)
//将此字符串分割为给定的 regular expression的匹配。
String myTime = "2020-02-20";
String[] ymd = myTime.split("-");
for(int i = 0; i < ymd.length; i++){
System.out.print(ymd[i]+" "); //2020 02 20
}

//11.boolean startsWith(String prefix)
//测试此字符串是否以指定的前缀开头。
System.out.println("/helloWorld.java".startsWith("/")); //true

//12.String substring(int beginIndex)
//返回一个字符串,该字符串是此字符串的子字符串。 截取字符串
System.out.println("/helloWorld.java".substring(6)); //World.java

//13.String substring(int beginIndex, int endIndex)
//返回一个字符串,该字符串是此字符串的子字符串 到endIndex-1处
System.out.println("/helloWorld.java".substring(6,11)); //World

//14.char[] toCharArray()
//将此字符串转换为新的字符数组。
char[] c3 = "我是赵宇轩".toCharArray();
for(int i = 0; i < c3.length; i++){
System.out.print(c3[i]+" "); //我 是 赵 宇 轩
}

//15.String toUpperCase()
//将所有在此字符 String使用默认语言环境的规则大写。
System.out.println("abcdef".toUpperCase()); //ABCDEF

//16.String toLowerCase()
//将所有在此字符 String使用默认语言环境的规则,以小写。
System.out.println("ABCDEF".toLowerCase()); //abcdef

//17.String trim()
//返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。 (中间不删除)
System.out.println(" I love you forever! ".trim()); //I love you forever!

//18.static String valueOf(Object obj)
//返回 Object参数的字符串 Object形式。
Object o = null;
System.out.println(o); //null 不出现空指针异常,因为String.valueof(Object)这个方法对空值进行重写了!
System.out.println(String.valueOf(o));//null
//System.out.println(o.toString()); 会出现空指针异常
}
}

​​返回顶部​​


举报

相关推荐

0 条评论