Java String类的使用

1.介绍

1.String是Java数据类型中的引用类型不属于基本数据类型
2.Java中的String对象都是用英文输入法下的双引号("")包起来的。---"abc","123","对象" 。
3.String对象是放在Java内存中方法区的常量池中的。(因为在现实开发中,String的使用太过频繁,为了提高执行效率,将其放在了方法区的常量池中)。

2.String的不可变特性(长度,内容都不可变)

1.在String类中包含一个数组: private final char[ ] value; //存储String中的每一个字串

2.final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。

3.final :最终的不可改变的——>地址不可改变,数组长度也不可变化

4.private :私有的,当前类中——>数组中的内容也不能改变。

5.也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab"

3.创建字符串

String str1 = "abc";

方式1:
先从常量池查看有元"abc"数据堂间,有直接指向,没有则重新上创建,然后指向。str1最终指向的是常量池的空间地址。。

String str2 = new String("abc");

方式2:
先在堆空间创建,里面维护了Value属性指向常量池的abc空间。如果常量池没有"abc"则创建,通过Value指向常量池的abc空间地址。str2最终指向的是堆中的地址。

Java String类的使用_第1张图片

4.字符串的比较

1.比较时,可用"=="号或equals(String str)方法。

注:

"=="号比较的是基本类型的值,或者是引用类型的地址

equals:

1.equals 是object类中的方法只能判断引用类型

2.默认判断的是地址是否相等(判断是否为同一对象),子类中往往是重写该方法,用于判断内容是否相等.

相等 => true
不相等 => false

equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。

equals() 会判断大小写区别,equalsIgnoreCase() 不会判断大小写区别:

5.String的特性

1.
String a = "hello" + "world" ; 创建了几个对象?
String e = "helloworld"

==>编译器优化等价 : String a = "helloworld" ; //一个对象
a==e ? //true,指向同一个地址
2.
String a = "hello"
String b = "world"
String c = a+b;
String d = "helloworld"
创建了几个对象? 3个

先在常量池中创建"hello",地址指向str1, 再创建world ,指向str2。
对于c,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到"helloworld",再调用 toString() 转换得到的地址指向 c。
String c = a+b;

Java String类的使用_第2张图片
c==d ? //false,各自指向的地址不一样

总结:
String a = "hello" + "world"
常量相加,看池

String c = a+b;
变量相加,看堆

6.String方法(常用方法)

trim()
去除当前字符串两边的空白字符。中间空格不会删除,只会删除两边的空格。

substring(int start,int end)
截取当前字符串中指定范围内的字符串(含头不含尾)

toUpperCase()
将当前字符串中的英文部分转为全大写

toLowerCase()
将当前字符串中的英文部分转为全小写

valueOf()
String类中提供的静态方法,将其它数据类型转换为String

length()
返回字符串的长度

concat()
将给定的字符串拼在当前字符串之后

byte[] = getBytes()
char[] = toCharArray()
将当前的字符串转化为指定类型的数组

String[] a = split("表达式")
按照给定的表达式将原来的字符串拆分
Java String类的使用_第3张图片

image.png
上图是将字符串以"-"为“中间商”拆分成一个个字符串的

split方法的简单使用
1000————10000中的回文数
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。如:1001 1221

public class HuiWenShu {
public static void main(String[] args) {
    for(int i=1000;i<10000;i++){
        //将int类型的值,转化成String字符串
        String strNum = Integer.toString(i);
        //使用String中的split方法将字符串拆分
        String[] str = strNum.split("");
        //用于判断是否是回文数
        boolean flag =true;
        /*1221  拆分成: 1 2 2 1
            比较左右的值是否相等*/
        for(int j=0;j

String 类中 concat() 方法和 + 号的区别:

    String str1 = "a".concat("b").concat("c");
    String str2 = "a"+"b"+"c";
    String str3 = "abc";
    String str4 = new String("abc");
    System.out.println(str1 == str2); //运行结果为false
    System.out.println(str1 == str3); //运行结果为false
    System.out.println(str2 == str3); //运行结果为ture
    System.out.println(str2 == str4); //运行结果为false
    System.out.println(str1.equals(str4)); //运行结果为true

解析:

首先关于 new 出来的对象和 String s = "字符串" 的 == 执行结果为 false 就不多赘述了,因为 == 比较的是两个对象的地址值,equals() 比较的是字面值。那么 concat 方法和 + 号的区别在这里有体现了,我们查看concat方法的源码可以看到,它是通过复制数组在通过 char 数组进行拼接生成一个新的对象,所以地址值会有变动,而 + 号不会。

@转载自菜鸟教程的某位同学的笔记https://www.runoob.com/note/5...

你可能感兴趣的:(java)