String类和常量池

String

1.String类概述

java。lang.String类代表字符串。java程序中所有的字符文字(例如“abc”)都可以被看作是实现类的实例,用双引号表示。

类String中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取字符串以及创建具有翻译为大写或小写的所有字符串的副本。

内存编码
Java中,字符串在内存里使用定长Unicode编码方式的。一个中文或英文字符(char)占用两个字节(16位) 。任何字符都算一个字符长度,占两个字节.

例:在Java语言中,字符串"abcdef"在内存中所占用的字节数是12个

而访问字符长度通过length()方法访问,该方法获得的长度是当前字符串的字符长度,与内存中存储无关。

2.使用步骤

  • 查看类

  • o java.lang.String :此类不需要导入。

  • 查看构造方法

  • String() 创建一个空的字符串对象

  • String(String original) 根据字符串来创建一个字符串对象

  • String(char[] value) 通过字符数组来创建字符串对象

  • String(byte[] bytes) 通过字节数组来构造新的字符串对象

  • String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象

代码如下:

public static void main(String[] args) {
        //1.String() 创建一个空的字符串对象
        String str1=new String();
        System.out.println("str1: "+str1);

        // 2.String(String original) 根据字符串来创建一个字符串对象
        String str2=new String("abc");
        System.out.println(str2);

        // 3.String(char[] value) 通过字符数组来创建字符串对象
        char[] chs={'A','B','C','D','E'};
        String str3 = new String(chs);
        System.out.println(str3);

        // 4.String(byte[] bytes) 通过字节数组来构造新的字符串对象
        byte[] bytes={97,98,99,100,101};
        String str4 = new String(bytes);
        System.out.println(str4);

        // 5.String(byte[] bytes, int offset, int length) 通过字节数组一部分来构造新的字符串对象
        String str5 = new String(bytes, 1, 2);
        System.out.println(str5);
    }

String特点

  1. 字符串不变:字符串的值在创建后就不能被更改

    String s1=“abc”;

    s1+=“d”;

    System.out.println(s1); //“abcd”

    //内存中有"abc",“abcd"两个对象,s1从指向"abc”,改变指向,指向了"abcd"

  2. 因为String对象是不可变的,所以它们可以被共享。

String s1=“abc”;

String s2=“abc”;

//内存中只有一个"abc"对象被创建,同时被s1和s2共享。

3.常用的方法

1.判断功能的方法

  • public boolean equals (Object anObject) :将此字符串与指定对象进行比较。
  • public boolean equalsIgnoreCase (String anotherString) :将此字符串与指定对象进行比较,忽略大小写。
  • public boolean contains(string str) :在此字符串查找是否包含指定str字符串
  • public boolean startsWith(string) :在此字符串查找是否以指定str字符串开头
  • public boolean endsWith(string) :在此字符串查找是否以指定str字符串结尾
  • public boolean isEmpty(): 判断字符串是否为空

演示代码:

public static void main(String[] args) {

    //创建字符串对象
    String s1="abcd";
    String s2="abcd";
    String s3="ABCD";

    //boolean equals(Object anObject) 将此字符串与指定对象进行比较。
    System.out.println(s1.equals(s2));      //true
    System.out.println(s1.equals(s3));      //false
    System.out.println("----------------");

    //boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
    System.out.println(s1.equalsIgnoreCase(s2));        //true
    System.out.println(s1.equalsIgnoreCase(s3));        //true
    System.out.println("----------------");
    
    //public boolean contains(string str) :在此字符串查找是否包含指定str字符串
    System.out.println(s1.contains("a"));//判断s1字符串是否包含a
    
    //public boolean startsWith(string) :在此字符串查找是否以指定str字符串开头
    System.out.println(s1.startsWith("http://"));//判断s1字符串是否以http://开头
    
    //public boolean endsWith(string) :在此字符串查找是否以指定str字符串结尾
    System.out.println(s1.endsWith(".png"));//判断s1是否以.png结尾
    
		//判断字符串是否为空
		String str8 = " ";
		System.out.println("str8是空字符串吗?" + str8.isEmpty());//false 因为空格也是字符,length是>0
}

注意:Object 是" 对象"的意思,也是一种引用类型。作为参数类型,表示任意对象都可以传递到方法中。

2.获取功能的方法

  • public int length () :返回此字符串的长度。

  • public String concat (String str) :将指定的字符串连接到该字符串的末尾。

  • public char charAt (int index) :返回指定索引处的 char值。

  • public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。

  • public int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引

  • public String substring (int beginIndex) :返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。

  • public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex不含endIndex

演示代码

public static void main(String[] args) {

    String str="HelloWorld";


    //public int length () :返回此字符串的长度。
    System.out.println(str.length());
    System.out.println("---------------");

    //public String concat (String str) :将指定的字符串连接到该字符串的末尾。
    String str2 = str.concat("_Java");
    System.out.println(str2);
    System.out.println("---------------");

    //public char charAt (int index) :返回指定索引处的 char值。
    char c1 = str2.charAt(0);
    char c2 = str2.charAt(1);
    System.out.println(c1);
    System.out.println(c2);
    System.out.println("---------------");

    //public int indexOf (String str) :返回指定子字符串第一次出现在该字符串内的索引。
    int a = str.indexOf("o");
    int b = str.indexOf("l");
    int c = str.indexOf("ll");
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
    System.out.println("---------------");
    
    //public int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
    int _a = str.lastIndexOf("o");
    int _b = str.lastIndexOf("l");
    System.out.println(_a);
    System.out.println(_b);
    System.out.println("---------------");
    

    /*	
    	public String substring (int beginIndex) :返回一个子字符串,
    	从beginIndex开始截取字符串到字符串结尾。
    */
    String sub1 = str.substring(5);
    System.out.println(sub1);
    System.out.println("---------------");

    /*
        public String substring (int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到
        endIndex截取字符串。含beginIndex,不含endIndex。
    */
    String sub2 = str.substring(2, 4);
    System.out.println(sub2);
    System.out.println("---------------");

}

3.转换功能的方法

  • public char[] toCharArray () :将此字符串转换为新的字符数组

  • public byte[] getBytes () :使用平台的默认字符集将该 String编码转换为新的字节数组。

  • public String toLowerCase() :使用默认语言环境的规则将此 String所有字符转换为小写

  • public String toUpperCase() :将此 String所有字符转换为大写,使用默认语言环境的规则。

  • public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。

  • public String trim() :将字符串两端的空格字符去除

演示代码:

public static void main(String[] args) {
    String str="abcde";

    //public char[] toCharArray () :将此字符串转换为新的字符数组。
    char[] chars = str.toCharArray();
    for(int i=0;i<chars.length;i++){
        System.out.print(chars[i]+",");
    }
    System.out.println("\n-------------");

    //public byte[] getBytes ():使用平台的默认字符集将该 String编码转换为新的字节数组。
    byte[] bytes = str.getBytes();
    for(int i=0;i<bytes.length;i++){
        System.out.print(bytes[i]+",");
    }
    System.out.println("\n-------------");

    //public String toLowerCase() :使用默认语言环境的规则将此 String所有字符转换为小写。
    String lowerCase = str.toLowerCase();
    System.out.println(lowerCase);
    System.out.println("-------------");

    //public String toUpperCase() :将此 String所有字符转换为大写,使用默认语言环境的规则。
    String upperCase = str.toUpperCase();
    System.out.println(upperCase);
    System.out.println("-------------");

    //public String replace (CharSequence target, CharSequence replacement) :将与target匹配的字符串使用replacement字符串替换。
    String str2="HelloWorld";
    String str3 = str2.replace("l", "L");
    System.out.println(str2);   //注意,replace会返回一个新的字符串,新字符串才是被替换后的。这里输出HelloWorld
    System.out.println(str3);   //HeLLoWorLd
    
    //public String trim() :将字符串两端的空格字符去除
    String str4 = "  HelloWorld   ";
    String str5 = str4.trim();
    System.out.println(str5);//HelloWorld
}
CharSequence 是一个接口,也是一种引用类型。作为参数类型,可以把String对象传递到方法中。

4.分割字符串功能的方法

  • public String[] split(String regex)将此字符串按照给定的regex(规则)拆分为字符串数组

方法演示,代码如下:

public static void main(String[] args) {

    String str="你好,我叫张三,我的兴趣爱好是:打篮球";
    String[] strs = str.split(","); //["你好","我叫张三","我的兴趣爱好是:打篮球"]
    for(int i=0;i<strs.length;i++){
        System.out.println(strs[i]);
    }

}

常量池(Constant pool)

常量池也是JVM中的一块内存区域,在JDK1.6及以前,常量池是存储在方法区的,在JDK1.7之后,常量池被划分到了堆内存。常量池的东西只会保存一份

String的内存区域

通过如下代码创建的String字符串都是存储在常量池的:
String s1="abc";
String s2="abc";
System.out.println(s1==s2);				//返回true
因为常量池的东西只保存一份,因此s1==s2返回的是true
String s1="abc";
String s2="ab"+"c";
System.out.println(s1==s2);				//返回true
java编译器编译期间会对代码进行优化:
如果都是字符串常量进行拼接:String s2="ab"+"c"; 会被优化成String s2="abc";,在常量池只生成一个"abc"字符串常量,因此s1==s2返回的是true

字符串拼接内存图详解

代码如下:
public static void main(String[] args) {
    String s1="abc";
    String s2="abc";
    String s3=new String("abc");
    String s4=new String("abc");

    System.out.println(s1==s2);         //true
    System.out.println(s1==s3);         //false
    System.out.println(s1==s4);         //false
    System.out.println(s3==s4);         //false
}

示例代码如下:

package com.gec.common;

import java.util.Arrays;

public class StringDemo {
	public static void main(String[] args) {
		//表示一个字符串
		String str = new String("hello");
		String str2 = "world";
		
		//构造器
		char[] cs = new char[] {'你','好','啊'};
		String str3 = new String(cs);
		System.out.println("str3:" + str3);
		
		//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 
		String str4 = new String(cs,0,cs.length-1);
		System.out.println("str4:" + str4);
		
		//charAt(int index) 返回 char指定索引处的值
		char c = str2.charAt(0);
		System.out.println("charAt(0):" + c );
		
		//将指定的字符串连接到该字符串的末尾
		str2 = str2.concat("!");
		System.out.println("str2:" + str2);
		
		//contains判断包含
		System.out.println("str2是否包含d这个字符:" + (str2.contains("d") == true ? "包含" : "不包含"));
		
		//测试此字符串是否以指定的后缀结尾
		System.out.println("是以感叹号为后缀吗" + str2.endsWith("?"));
		
		//测试前缀
		System.out.println("是以w为前缀吗:" + str2.startsWith("w"));
		
		String str5 = "World!";
		System.out.println("str2.equals(str5):" + str2.equals(str5));
		
		//调用忽略大小写的方法 用户名可以忽略大小写
		System.out.println("str2.equalsIgnoreCase(str5):" + str2.equalsIgnoreCase(str5));
		
		//输入 admin 去除字符串的前后空格 trim()
		String str6 = "        admin      ";
		System.out.println("str6:" + str6 + " abc");
		System.out.println("str6:" + str6.trim() + " abc");
		
		//返回指定字符第一次出现的字符串内的索引。
		String str7 = "aabcdb";
		System.out.println("第一次出现的b索引是:" + str7.indexOf('b'));
		
		//判断字符串是否为空
		String str8 = " ";
		System.out.println("str8是空字符串吗?" + str8.isEmpty());//false 因为空格也是字符,length是>0
		
		// 数组有length属性,String是有length方法
		System.out.println("str8.length():" + str8.length());
		
		//返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 
		String str9 = "你大,爷的";
		System.out.println(str9.replace("大,爷", "**"));
		
		//将此字符串分割为给定的 regular expression的匹配
		// 选中数据删除
		String str10 = "1_2_3_4";
		String[] split = str10.split("_");
		System.out.println(Arrays.toString(split));
		
		//返回一个字符串,该字符串是此字符串的子字符串 截取字符串
		String str11 = "1234,中国是一个伟大的国家,我爱中国,我爱人民";
		String substring = str11.substring(5);
		System.out.println("sustring(5):" + substring);
		
		//区间截取
		String substring2 = str11.substring(5, str11.length()-1);
		System.out.println(substring2);
		
		//将字符串转换成char数组
		char[] cs2 = str10.toCharArray();
		for (char d : cs2) {
			System.out.println(d);
		}
		
		//小写转大写
		String str12 = "abc";
		System.out.println("abc转大写:" + str12.toUpperCase());// char  97 65
		
		//大写转小写
		String str13 = "ABC";
		System.out.println(str13 + "转小写:" + str13.toLowerCase());
		
		
	}
}

```java
substring2 = str11.substring(5, str11.length()-1);
		System.out.println(substring2);
		
		//将字符串转换成char数组
		char[] cs2 = str10.toCharArray();
		for (char d : cs2) {
			System.out.println(d);
		}
		
		//小写转大写
		String str12 = "abc";
		System.out.println("abc转大写:" + str12.toUpperCase());// char  97 65
		
		//大写转小写
		String str13 = "ABC";
		System.out.println(str13 + "转小写:" + str13.toLowerCase());
		
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值