String类

Java通过程序中建立String类可以轻松管理字符串。字符串是一个或多个字符组成的连续序列,程序需要存储的大量文字,字符都使用字符串进行表示处理。
Java中定义了String和StringBuffer两个类来封装对字符串的各种操作,它们都放到了Java.lang包中,不需要用import java.lang这个语句导入该包就可以直接使用他们。
String类用于比较两个字符串,查找和抽取串中的字符或字串,进行字符串与其他类型之间的相互转换等。String类对象内容一旦初始化就不能再改变,对于String类的每次改变(例如字符串连接等)都会生成一个新的字符串,比较浪费内存。
StringBuffer类用于内容可以改变的字符串,可以将其他各种类型的数据增加,插入到字符串中,也可以转置字符串中原来的内容。一旦通过StringBuffer生成了最终想要的字符串,就应该使用StringBuffer.toString()方法将其转换成String类,随后就可以使用String类的各种方法操纵这个字符串了。StringBuffer每次都改变自身,不生成新的对象,比较节约内存。

String s; 。声明一个字符串s分配一个内存空间,因为没初始化,所以没有存入任何对象。s作为局部变量是不会自动初始化的,必须显式地赋初始值,在用System.out.println(s)时会报错。

用户可以通过创建String类来创建字符串,String对象既可以隐式的创建,也可以显式地创建,具体创建形式取决于字符串在程序中的用法,为了隐式地创建一个字符串,用户只要将字符串放在程序中,Java则会自动的创建String对象。

String类的两种实例化方式

1,使用字符串常量直接初始化,String对象名称="字符串";
String s="有志者事竟成";

2,使用构造方法创建并初始化(public String(String str)),String 对象名称=new String("字符串");
String s=new String("有志者事竟成");

通过String类实例化方式

class jdjd
{
    public static void main(String args[])
    {
        String str1="Hello";   //直接赋值建立对象str1
        System.out.println("ste1:"+str1);   //输出
        String str2=new String("有志者事竟成");   //构造方法创建并初始化对象str2
        System.out.println("str2:"+str2);
        String str3="new"+"String";        //采用串联方式生成新的字符串str3
        System.out.println("str3:"+str3);
    }
    }
//三种方式都完成了String对象的创建及初始化

String对象也可以先声明在赋值

String str1;     //声明字符串对象str1
str1=“hello”;    //字符串对象str1赋值为“hello”。

2,构造方法先声明在赋值
String sre2 =new String();     构造方法创建一个字符串str2,内容为空字符串。等同于String str2=new String(" ");
str2="有志者事竟成";   //字符串对象str2赋值为"有志者事竟成"

String内容的比较

方法名称 类型 描述
public boolean equals(String anObject) 普通 区分大小写比较
public boolean equalsIgnoreCase(String anotherString) 普通 不区分大小写比较
public int compareTo(String anotherString) 普通 比较字符串大小关系

Java中判断字符串一致方法有两种

1,调用equals(object)方法。
String1.equals(String2),比较当前对象(String1)包含的值与参数对象(String2)包含的值是否相等,若相等则equals()返回true,否则false,equals()比较时考虑字符中字符大小写的区别。**equalslgnoreCase()可以忽略大小写的进行两个字符串的比较。

String str1="Hello Java";   //直接赋值实例化对象str1。
Boolean result=str1.equals("Hello Java");       //result=true
Boolean result=str1.equals("Hello java");      //result=false
Boolean result=str1.equalslgnoreCase("Hello java");      //result=true

2,使用运算符==
运算符==比较两个对象是否引用一个实例。

String str1="Hello";   //直接赋值实例化对象str1
String str2="Hello";   //直接赋值实例化对象str2
Boolean result=(str1==str2);    //result=true
String str3=new String("Hello");    //构造方法赋值
Boolean result2=("str1==str3");      //result=false

解析1,如果说String是一个类,那么str1一定是这个类的对象,对象名称一定要保存在栈内存之中,那么字符串"Hello"一定保存在栈内存之中;
2,任何情况下使用关键字new都会开辟一个新的堆内存空间;
3,String本身是一个类,所以String类的对象是一定可以进行引用传递的,引用传递的最终结果就是不同的栈内存将保存在同一块堆内存空间的地址;
4,栈内存像int型数据,里面保存的是数值,每一个栈内存只能够保存一块堆内存的物理地址数值。
"=="是对两个对象的堆内存地址的相等进行判断;对字符串内容判断使用equals()。

//判断字符串是否相同
class jdjd
{
    public static void main(String args[])
    {
        String str1="Hello";  //直接赋值
        String str2=new String("Hello");   //构造方法赋值
        String str3=str2;   //引用传递
        System.out.println(str1==str2);   //false
        System.out.println(str1==str3);   //false
        System.out.println(str2==str3);   //true
        System.out.println(str1.equals(str2));   //true
        System.out.println(str1.equals(str3));   //true
        System.out.println(str2.equals(str3));   //true
    }
    }

Java中判断字符串大小
如果希望知道字符串大小情况,需要调用compareTo()方法
字符串对象小于给定字符串:compareTo()方法返回小于0的值;
字符串对象等于给定字符串:compareTo()方法返回小于0的值;
字符串对象大于给定字符串:compareTo()方法返回大于0的值;
比较是根据字母顺序,严格来讲是根据字符的ASCII码值进行比较的,返回结果是第一个不同字符ASCII码的差值。

class jdjd
{
    public static void main(String args[])
    {
    String str1="This is a string";   //直接赋值建立对象str1
    String str2=new String("this is a string");  //构造方法建立对象str2
    int result=str1.compareTo("That is another string");   // result=8
    int result1=str1.compareTo("This is a string");  //result=0
    int result2=str1.compareTo(str2);    //resutl=-32
    System.out.println(result);
    System.out.println(result1);
    System.out.println(result2);
    }
    }

字符串常量是String类的匿名对象
任何语言实际上都不会提供字符串类型,但是在Java里面为了简化用户开发难度专门提供了String类和使用“ " ”定义的字符串,但实际上每一个字符串严格来讲都是String类的匿名对象。
匿名对象特点:没有名字,而且可以调用类中相关方法

String str="Hello";
System.out.println(str.equals("Hello"));   //true,字符串对象调用equals()
System.out.println("Hello".equals(str));    //true,字符串常量调用equals(),"Hello"是String类的匿名对象。

判断某一用户输入的字符串内容是否等于指定的字符串内容,若采用字符串对象.equals("内容")的方式,如果用户没输入字符串,会出现NullPointerException警告,可以采用"字符串".equals(字符串对象)的方式解决这个问题。

String str=null;    //假设这个字符串由用户输入
if(str.equals("Hello"))   //true,字符串对象调用equals()
{
System.out.println("验证通过");
}
if("Hello".equals(str))   //equals()可自动处理null问题,正常判断
{
System.out.println("验证通过");
}

两种字符串实例化方式的区别
实例化字符串对象可以采用两种方式完成,不同方式在内存中呈现的方式不同的分配形式。
1,直接赋值方式
如果采用直接赋值形式,那么就好比将一个字符串的常量赋给了指定的字符串变量,而且每一个字符串都属于String的匿名对象。 ** String str="Hello";** //直接赋值
以直接赋值方式创建对象str,仅开辟一块堆内存和一块栈内存空间。

2,构造方法实例化
此时会开辟两块堆内存空间,其中一块堆内存将会成为垃圾,通过构造方法进行的String类对象也无法进入自动入池的操作,即,数据无法共享。
在String类中提供了一个方法,可以帮助用户手工入池。
手工入池:public String intern();

class ffff
{
    public static void main(String args[])
    {
        String str1="Hello";   //直接赋值
        String str2=new String("Hello").intern();   //手工入池
        String str3="Hello";   //直接赋值
        String str4=new String("Hello");   //构造方法赋值
        System.out.println(str1==str2);    //true
        System.out.println(str1==str3);    //true
        System.out.println(str2==str3);    //true
        System.out.println(str1==str4);   //false
    }
}

字符串一旦声明则不可改变
改变也只会改变String对象的引用。

-----------------------------分割线---------------------------
String类常用方法

方法名称 类型 描述
public String(char[] value) 构造 将接收到的字符变为字符串
public Stringchar[] value,int offset,int count) 构造 将部分字符数组变为字符串
public char charAt(int index) 普通 返回指定索引位置上的字符内容
public char[] toCharArray() 普通 将字符串变为字符数组
//求字符串中的指定字符
public class Main
{
    public static void main(String[] args)
    {
        String str="hellojava";    //直接赋值
        System.out.println(str.charAt(0));   //取出字符串中的第一个字符
        System.out.println(str.charAt(3));   //取出字符串中的第4个字符
    }
}

字符串与字符数组互相转换

public class Main
{
    public static void main(String[] args)
    {
        String str="hellojava";
        char data[]=str.toCharArray();   //将字符串变为字符串数组
        for(int x=0;x<data.length;x++)
        {
            System.out.print(data[x]+" ");
            data[x]-=32;//小写变大写(str字符串中的内容为小写字符,同一个小写的ASCII码比大写大32)
        }
        System.out.println();
        System.out.println("将全部字符数组变为字符串:"+new String(data));
        //取得部分内容的时候需要设置起始点和长度(5为起始点,4为长度)
        System.out.println("将部分字符数组变为字符串:"+new String(data,5,4)); 
}
}

字节与字符串

方法名称 类型 描述
public String(byte[] bytes) 构造 将全部字节数组变为字符串
public String(byte[] bytrs,int offset,int length) 构造 将部分字节数变为字符串
public byte[] getBytes() 普通 将字符串变为字节数组
public byte[] getBytes(String charsetName)throws UnsupportedEncodingException 普通 将字符串转码
//字符串与字节相互转换
public class Main
{
    public static void main(String[] args)
    {
        String str="hellojava";
        byte data[]=str.getBytes();  // 将字符串变为byte数组
        for(int i=0;i<data.length;i++)
        {
            data[i]-=32;
        }
        System.out.println(new String(data));  //将全部byte数组变为字符串
        System.out.println(new String(data,5,4));   //将部分byte数组变为字符串
    }
}

字符串查找方法

由一个字符串中若干字符按顺序形成的连续字符片段,就是字符串的子串
从一个指定的字符串之中查找某一个子字符串是否存在操作,称为字符串查找。查找操作方法如下

方法名称 类型 描述
public boolean contains(String s) 普通 判断某一个子字符串是否存在
public int indexOf(String str) 普通 由前向后查找指定子字符串的位置,找不到返回-1
public int indexOf(String str,int fromIndex) 普通 由指定位置查找子字符串位置,找不到返回-1
public int lastIndexOf(String str) 普通 由后向前查找制定字符串位置,找不到返回-1
public int lastIndexOf(String str,int fromIndex) 普通 由指定位置从后向前查找
public boolean startsWith(String prefix) 普通 判断是否以指定字符串开头
public boolean startsWith(String prefix,int toffset 普通 从指定位置开始判断是否以指定字符串开头
public boolean endsWith(String suffix) 普通 判断是否以指定字符串结尾
//字符串查找方法
public class Main
{
    public static void main(String[] args)
    {
        String str="**hello$$world##";
        if(str.contains("hello"))   //查找hello是否存在
        {
            System.out.println("内容存在,已经查到");
        }
        if(str.indexOf("r")!=-1)   //查找hello是否存在
        {
            System.out.println("内容存在,字符串位置:"+str.indexOf("r"));
        }
        if(str.indexOf("o",6)!=-1)   //由指定位置开始查找
        {
            System.out.println("内容存在,字符串位置:"+str.indexOf("o",6));
        }
        if(str.lastIndexOf("w",12)!=-1)   //由指定位置从后向前开始查找
        {
            System.out.println("内容存在,字符串位置:"+str.lastIndexOf("w",12));
        }
        System.out.println(str.startsWith("**"));//判断字符串的起始内容
        System.out.println(str.startsWith("$$",7));   //判断从索引7位置是否以$$开始
        System.out.println(str.endsWith("##"));   //判断是否以##结束
        }
        }

字符串替换

方法名称 类型 描述
public String replaceAll(String regex,String replacement) 普通 字符串全部替换为指定内容
public String replaceFirst(String regex,String replacement) 普通 替换掉首个内容
//字符串替换方法
public class Main
{
    public static void main(String[] args)
    {
        String str="helloworld";
        System.out.println(str.replaceAll("o","***"));   //所有子串出现的位置都替换
        System.out.println(str.replaceFirst("l","_"));    //替换第一次出现字符子串
    }
    }

字符串截取
从一个字符串中取出里面部分内容,即子串。从字符串截取子串方法如下

方法名称 类型 描述
public String substring(int beginIndex) 普通 由指定位置截取到结尾
public String substring(int beginIndex) 普通 截取指定范围字符串
//字符串中取子串方法
public class Main
{
    public static void main(String[] args)
    {
        String str="Hellojava";
        System.out.println(str.substring(5));   //截取从指定位置到末尾的子串
        System.out.println(str.substring(0,5));   //截取从指定位置到结束位置子串
    }
    }

字符串拆分
字符串拆分指的是将一个字符串按照指定的字符串regex拆分为字符串,返回一个字符型数组,regex不作为任何数组元素的部分返回。操作方法如下

方法名称 类型 描述
public String[] split(String regex) 普通 按照指定的字符串全拆分
public String[] split(String regex int limit) 普通 将字符串拆分为指定元素个数的字符数组
//字符串拆分方法
public class Main
{
    public static void main(String[] args)
    {
        String str="hello world hello java";
        String data[]=str.split(" ");  // 按照空格拆分
        for(int i=0;i<data.length;i++)
        {
            System.out.println(data[i]);
        }
        System.out.println("------我是分割线------");
        String data1[]=str.split(" ",3);   //按照空格拆分为3个字符数组元素
        for(int x=0;x<data1.length;x++)
        {
            System.out.println(data1[x]);
        }
    }
    }

如果用“.”或“|”作为分隔的话必须写法如下String split("\.") 或String split("\|")。如果用“\”作为分隔必须写成String split("\\")。如果在一个字符中有多个分隔符,可以用“|”作为连接符,比如str="account=8 and uu=45 or n=25",把三个都分隔出来可以用Str.splitz"and|or)",即用and或or进行分隔。

方法名称 类型 描述
public String concat(String str) 普通 字符串连接,功能与“+”操作一样
public String intern() 普通 入池
public int length 普通 取得字符串长度
public boolean isEmpty() 普通 判断是否为空字符串(但不是NULL)
public String toLowerCase() 普通 字符串转小写
public String toUpperCase 普通 字符串转大写
public String trim 普通 去掉字符串前后空格

其他方法

方法名称 类型 描述
public String concat(String str) 普通 字符串连接,功能与“+”操作一样
public String intern() 普通 入池
public int length 普通 取得字符串长度
public boolean isEmpty() 普通 判断是否为空字符串(但不是NULL)
public String toLowerCase() 普通 字符串转小写
public String toUpperCase 普通 字符串转大写
public String trim 普通 去掉字符串前后空格
//字符串常用方法
public class Main
{
    public static void main(String[] args)
    {
        String str="Hello World...";
        System.out.println("原始字符串内容【"+str+"】"+",长度:"+str.length());  //求字符串长度
        System.out.println("原始字符串内容【"+str+"】"+",长度:"+str.trim().length());  //去掉字符串前后空格的长度
        System.out.println("".isEmpty());  //判断字符串是否为空
        System.out.println(str.isEmpty());  //判断str字符串是否为空
        System.out.println("Hello World!!".toUpperCase());   //字符串字符全变大写
        System.out.println("Hello World!!".toLowerCase());   //字符串字符全变小写
        System.out.println(str.concat("java"));   //字符串连接
    }
}

总结

String str=new String("java");
1,创建String对象的个数是两个对象,一个是“java”,一个是指向“java”的引用对象str。
2,java中堆内容和栈内存区别
堆内容是一个子集。栈内存存取速度仅次于寄存器,栈内存里面的数据可共享,但其中数据大小和生存期必须在运行前确定。堆内容是运行时可动态分配的数据区,从速递看比堆内存慢,堆内容里面数据不共享,大小和生存期都可以运行时在确定。new关键字是运行时在堆内容里面创建对象。每new一次都一定会创建新对象,因为堆数据不共享。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 一、String 类 1、定义: 1、从概念上讲,java字符串就是Unicode字符序列。每个用双引号括起来的字...
    玉圣阅读 1,505评论 0 1
  • JAVA Doc public final class String extends Object impleme...
    风语安然阅读 1,018评论 0 3
  • 在编写程序的过程中,不了避免的要用到字符串,所以String类的常用方法的用法是必须掌握的。学习一个类的使用方法最...
    Geg_Wuz阅读 1,169评论 0 4
  • 1、Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函...
    青春前行阅读 235评论 0 0