Java中的String类的简单介绍

String本质上是一个字符数组;

构造方法

String有很多构造方法,这边只介绍几个:

  1. String(String original)
  2. String(char[] value);
  3. String(char[] value, int offset, int count);

来看几个例子:
1: String(String original)

public class TestString {
    public static void main(String[] args) {
        String s1 = new String("hello");
        System.out.println(s1); // String类的对象  直接输出时不会输出内存地址 而是内存地址指向的对象中包含的内容
    }
}

String是一种比较特殊的引用类型,直接输出的时候输出的不是内存地址,而是其指向的对象的内容。

2: String(char[] value);

public class TestString {
    public static void main(String[] args) {
        char[] chs = {'h','e','l','l','o'};
        String s2 = new String(chs);
        System.out.println(s2); // hello
    }
}

3.: String(char[] value, int offset, int count):

public class TestString {
    public static void main(String[] args) {
        char[] chs = {'h','e','l','l','o'};
        String s3 = new String(chs, 1, 3);
        System.out.println(s3); // ell 从第1个index开始,截取长度为3的字符串
    }
}

4: 字面量方式:

public class TestString {
    public static void main(String[] args) {
        String s4 = "hello";
        System.out.println(s4); // hello
    }
}

字面量创建和使用构造方法(即 new String())创建的区别

首先明确一点,字符串的内容是存储在方法区中的常量池里面的,这么做是为了字符串的重复使用。

来看例子:

public class TestString {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1 == s2); // false
        
        String s3 = "hello";
        String s4 = "hello";
        System.out.println(s3 == s4); // true
        System.out.println(s1 == s3); // false
    }
}

那么使用new String()操作的时候,只要有new操作,那么肯定要在堆中开辟空间,所以s1,s2指向了堆中的不同地址的对象。但是由于字符串的内容是存储在方法区中的常量池里面的,所以s1,s2中的内容,还是一个地址,指向的是常量池中的内容即"hello",s1和s2的内存地址不同,所以s1 == s2为false。

然而对于字面量方式创建字符串来说,并没有new操作,所以没有在堆中进行开辟空间,而是直接将s3,s4直接指向了常量池中的内容即"hello",所以s3 == s4是true(常量池中,重复使用)。

另外关于s1 == s3为false,是因为s1存的是指向的是堆中的对象的地址,这个堆中的对象的内容才是指向常量池中字符串的地址,而s3存的就是指向常量池中字符串的这个地址。所以二者不是一个地址。

pic

总结一下:
new String()创建的字符串是在堆内存,其的值又指向了方法区的常量池。
而字面量创建的字符串,直接就指向了方法区的常量池。

String类常用的判断功能

  • boolean equals(Object obj)
  • boolean equalsIgnoreCase(String str)
  • boolean startsWith(String str)
  • boolean endsWith(String str)
public class TestString {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "Hello";
        String s3 = "hello";
        
        System.out.println( s1.equals(s2)); // false
        System.out.println( s1.equals(s3)); // true
        System.out.println( s1.equalsIgnoreCase(s2)); // true
    }
}
public class TestString {
    public static void main(String[] args) {
        String s1 = "hello";
        
        System.out.println( s1.startWith("hel")); // true
        System.out.println( s1.startWith("DeeJay")); // false
    }
}

String类常用的获取功能

  • int length()
  • char charAt(int index)
  • int indexOf(String str)
  • String subString(int start)
  • String subString(int start, int end)
public class TestString {
    public static void main(String[] args) {
        String s1 = "hello";
        
        System.out.println( s1.length() ); // 5
        System.out.println( s1.charAt(0)); // h
        System.out.println( s1.indexOf("h")); // 0
        System.out.println( s1.subString(2)); // llo
        System.out.println( s1.subString(2,4));  // ll
    }
}

String类常见的转换功能

  • char[] toCharArray()
  • String toLowerCase()
  • String toUpperCase()
public class TestString {
    public static void main(String[] args) {
        String s1 = "Hello";
        char[] chs = s1.toCharArray();
        for(int i = 0; i < chs.length; i ++) {
            System.out.println(chs[i]); // 依次输出 H e l l o
        }
        
        System.out.println( s1.toLowerCase() ); // hello
        System.out.println( s1.toUpperCase() ); // HELLO
    }
}

字符串的遍历方法:
1. length()加上charAt()
2. 把字符串转换为字符数组toCharArray(),然后遍历数组。

public class TestString {
    public static void main(String[] args) {
        String s1 = "hello wrold";
        for(int i = 0; i < s1.length(); i ++) {
            System.out.println(s1.charAt(i));
        }
        // 或者也可以使用toCharArray()
        char[] chs = s1.toCharArray();
        for(int i = 0; i < chs.length; i ++) {
            System.out.println(chs[i]);            
        }
    }
}

String类的其他常用api

  • String trim()
  • String[] split(String str)
public class TestString {
    public static void main(String[] args) {
        String str = "a,b,c";
        String[] strArr = str.split(",");
        
        for(int i = 0; i < strArr.length; i ++) {
            System.out.println(strArr[i]);  // 依次输出 a b c           
        }
    }
}

关于StringBuilder

对于简单的字符串拼接问题,由于String不可变,每次进行拼接的时候,其实本质上是在先在常量池中新增一个空间存放"world",然后在新增一个空间存放"helloworld",最后把str指向这个"helloworld",而之前常量池中的"hello""world"就变成了垃圾。

public class TestString {
    public static void main(String[] args) {
        String str = "hello";
        str += "world";
        
        System.out.println(str);
    }
}

而StringBuilder就可以解决这个问题,StringBuilder是一个可变的字符序列.

String的内容是固定不可变的,而StringBuilder是可变的

关于StringBuilder的使用

public class TestStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); // 默认的无参的构造方法 创建的容量为16
        
        System.out.println(sb.capaticy()); // 16
        System.out.println(sb.length()); // 0

    }
}

StringBuilder类常见操作

  • public StringBuilder append(任意类型)
  • public StringBuilder reverse()
public class TestStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); 
        StringBuilder sb2 = sb.append("Hello") ;
        System.out.println(sb); // Hello
        System.out.println(sb2); // Hello
        System.out.println(sb == sb2); // true
    }
}

来看这个例子 ,append返回的也是一个StringBuilder类的值,同时调用append()之后,原来的那个sb的值也发生了改变,最后发现sb 和 sb2 指向的是同一块地址,即说明StringBuilder是可变的(可修改)。

对于append(),其改变了自身之后,又返回了其自身,所以支持链式调用。

public class TestStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); 
        sb.append("Hello").append("World").append(true);
        System.out.println(sb); // HelloWorldtrue
    }
}

reverse()就是反转StringBuilder类的对象。

String和StringBuilder类的相互转换

  • StringBuilder ====> String:
    使用public String toString()
public class TestStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); 
        sb.append("hello").append("world");
        
        String s = sb.toString();
        System.out.println(s);
    }
}
  • String ====> StringBuilder:
    使用构造函数 StringBuilder(String str)
public class TestStringBuilder {
    public static void main(String[] args) {
        String s = "Hello world";
        StringBuilder sb = new StringBuilder(s); 
        System.out.println(sb); // Hello world        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 1,346评论 0 9
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 3,079评论 0 7
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,264评论 0 4
  • 01 这几年自媒体的发展,很多人靠写字成了网红。比如,咪蒙,孙晴悦,特立独行的猫,剽悍一只猫,李尚龙等等。一夜爆...
    灵女侠阅读 464评论 0 0
  • 看一个男人有没责任心,就看他能不能给女人一个归宿,直到女人人生谢幕时,这个男人还是唯一的观众。 在现实面前,没有一...
    剪辑life阅读 127评论 0 0