Java学习笔记19(String类)

本文详细介绍了 Java 中 String 类的特点、创建方式及比较方法,并演示了如何使用 String 的构造方法和其他实用方法,如 substring 和 toCharArray。

String代表字符串,在Java中,所有的字符串字面值都作为此类的实例实现

字符串的特点以及简单的原理分析:

package demo;
/*
 * String类的特点:
 * 所有的""都是String的对象
 * 字符串一旦创建就是常量,不能改变
 */
public class StringDemo {
    public static void main(String[] args) {
        //发现创建对象不需要new
        String str = "abcd";
        System.out.println(str);
        //输出:abcd而不是内存地址,因为String类重写了toString方法
        str = "efgh";
        System.out.println(str);
        //输出:efgh,之前不是说常量不能改变吗?这里的原因:
        //字符串本身是一个对象,在堆内存中,字符串本质是一个字符的数组
        //源码:private final char value[];有final修饰,因此String是常量
        //str = "efgh"是在内存中重新开一片,str的指向改变了,而"abcd"字符串对象没有改变
        
    }
}

 

String类的创建方式和比较:

 

package demo;

public class StringDemo {
    public static void main(String[] args) {
        //字符串定义的两种方式,直接=,使用String的构造方法
        String str1 = new String("abc");
        String str2 = "abc";
        //直接=更为方便,但是存在区别
        
        System.out.println(str1==str2);//false
        System.out.println(str1.equals(str2));//true
        
        //使用构造方法定义原理:
        //实际上创建了两个对象,一个是new String对象,一个是"abc"对象
        //而new String对象中保存了"abc"这个字符数组对象的地址
        //str1指向new String对象
        //打印str1的时候,调用重写的toString方法找到字符串
        
        //由于"abc"对象已经存在
        //所以str2直接指向"abc"对象,不创建新的对象
        //因此,str1==str2为false,因为对象的地址不同
        //而str1.equals(str2)是true,原理:
        //String类继承Object,重写了父类方法equals,建立了字符串自己的字符串比较方式
        //即只要字符串的每个字符相同就是true,与地址无关
    }
}

 

String类的构造方法:

1.官方资料:String(byte[] byte)    通过使用平台的默认字符集解码指定的byte数组,构造一个新的String

示例:

package demo;
/*
 * String类的构造方法
 */
public class StringDemo2 {
    public static void main(String[] args) {
        byte[] bytes = {97,98,99,100};
        String s = new String(bytes);
        System.out.println(s);
        //输出:abcd
        //将字节数组中的每个字节,查询编码表得到的结果
    }
}

 

2.官方资料:String(byte[] byte, int offset, int length)  

示例:

package demo;
/*
 * String类的构造方法
 */
public class StringDemo2 {
    public static void main(String[] args) {
        byte[] bytes = {65,66,67,68,69};
        String s = new String(bytes, 2 ,3);
        //第二个参数是起始索引,第三个参数是选取个数
        System.out.println(s);
        //输出:CDE
    }
}

 

3.官方资料:String (char[] value) 分配一个新的String,使其表示字符数组参数中当前包含的字符序列

示例:

package demo;
/*
 * String类的构造方法
 */
public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }
    public static void function(){
        char[] ch = {'a','b','c','d','e'};
        String s = new String(ch);
        System.out.println(s);
    }
}
//输出:abcde

 

4.和前两个相似,官方资料:String(char[] value, int offset, int length)

示例:

package demo;
/*
 * String类的构造方法
 */
public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }
    public static void function(){
        char[] ch = {'a','b','c','d','e'};
        String s = new String(ch,1,3);
        System.out.println(s);
    }
}
//输出:bcd

 

  还有很多的构造方法,不过常用的是这些

 

String类的其他方法:

1.官方资料:int length() 返回此字符串的长度(比较简单,不做示例了)

2.官方资料:String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串

   另一个:String substring(int beginIndex,int endIndex) 同上,多了一个结束索引值

示例:

package demo;

public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }
    public static void function(){
        String str = "iamhandsome";
        String str1 = str.substring(3);
        String str2 = str.substring(3, 5);
        System.out.println(str1);
        System.out.println(str2);
    }
}
/*输出:
handsome
ha

这里注意,区间是左闭右开,意思是包括起始索引,不包括终止索引
*/

 

3.官方资料:boolean startsWith(String prefix)

        测试字符串是否以指定的前缀开始

        有前缀也应该有后缀:

          boolean endWith(String suffix)

4.官方资料:boolean contains(String s)判断一个字符串中是否包含另一个字符串

5.int indexOf(char ch) 查找一个字符在字符串中第一次出现的索引

3,4,5示例:

package demo;

public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }

    public static void function() {
        String string = "Iamhandsome";
        boolean b = string.startsWith("Ia");
        System.out.println(b);// true
        boolean b1 = string.endsWith("ome");
        System.out.println(b1);// true
        boolean b2 = string.contains("hand");
        System.out.println(b2);//true
        int a = string.indexOf("a");
        System.out.println(a);//1
    }
}

 

 6.将字符串转成字节数组:

  byte[] getBytes()

  此功能和String的构造方法相反

示例:

package demo;

public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }

    public static void function() {
        String str = "abc";
        byte[] bytes = str.getBytes();
        for(int i=0; i<bytes.length; i++){
            System.out.println(bytes[i]);
        }
    }
}
/*输出:
97
98
99
*/

 

7.将字符串转成字符数组:char[] toCharArray();

package demo;

public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }

    public static void function() {
        String str = "abc";
        char[] chars = str.toCharArray();
        for(int i=0; i<chars.length; i++){
            System.out.println(chars[i]);
        }
    }
}
/*输出:
a
b
c
*/

 

比较字符串是否相同

示例:

package demo;

public class StringDemo2 {
    public static void main(String[] args) {
        function();
    }

    public static void function() {
        String str1 = "Abc";
        String str2 = "abc";
        boolean b1=str1.equals(str2);
        boolean b2 = str1.equalsIgnoreCase(str2);
        System.out.println(b1);//false
        System.out.println(b2);//true
        //比较字符串是否相同,第二个忽略大小写
    }
}

 

转载于:https://www.cnblogs.com/xuyiqing/p/8257325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值