String 类 TRYTRY

目录

创建String的四种方法:

字符串的不可变性

如何修改字符串内容?

StringBuilder类和String类的相互转换

StringBuilder类的其他操作

字符串的比较

字符和字符串的相互转换。

如何把一个字符char[]转为字符串String?

String转换为char

如何判断一个字符串的对象是有纯数字构成的呢?

字符串和字节的相互转换

字符串的查找

字符串的替换

字符串的拆分

字符串截取

java中的字符串的其他操作


创建String的四种方法:

方法3只产生一个字符串对象,str不入池,他是new出来的,只在堆中,值为data。

字面量

10---整形字面量

10.1--double字面量

true---boolean 字面量

“ 硕大的萨顶顶2231”----字符串字面量 就是一个字符串的对象

String是引用数据类型: 字面量即使对象也是字面量。

字面量入池,字符数组不是字面量。

字符串比较值是不是相等用equals方法
System.out.println(str1.equals(str));
System.out.println(str1.equalsIgnoreCase(str1));这个是不区分大小写的比较

要比较字面量一定不为空时用前置的方式

关于字符串的常量池问题

 

 

有new就有新空间,三行代码产生四个字符串对象,一个在常量池三个在堆中。

  

何为“池”?
池乃放一些要打印的东西,避开内存浪费,池里面搞得像是一个批发商,店里只有一个样品,你喜欢他会给你订货。所以同样的内容,池里面一定有且只有一个。

intern()方法

 

  


 

 

字符串的不可变性

package string_test;

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

 过程:栈中的str先指向常量池中的“hello”,然后常量池中继hello之后右产生了一个“world”,之后hello和world拼接成helloword,str不再指向hello,转而指向helloworld;重复上述步骤,str指向helloworld!!!;

为何字符串的对象无法修改内容而其他类的对象能修改类的内容?

字符串其实是一个字符数组-->char[],字符串保存的值实际上在数组中保存。

看一下String的 源码:        这个value储存在char 数组中。

 解释:String的“hello”这个对象内部其实有一个value数组,这个value数组是“h”,“e”,“l”,"l"."o",为啥这个hello在外部改不了,因为value数组是private修饰,而且String类没有向外部提供Getter和Setter,外部根本就不可见。

如何修改字符串内容?

1.在运行时通过反射破坏value的数组封装

(反射没学之前不推荐,了解一下得了,反射是所有框架的基础)

package string_test;

import java.lang.reflect.Field;

public class String_Change {
    public static void main(String[] args) throws Exception{
        /**
         * 在运行时通过反射破坏value的数组封装
         */
        String str="hello";
        // 1获取反射对象class,类型是String,
        Class <String > cls=String.class;
        //2.获取String类型的属性
        Field field=cls.getDeclaredField("value");
        //破坏封装
        field.setAccessible(true);
        // 在String 类的外部通过反射拿到Value数组
        char []value= (char[]) field.get(str);
        //然后修改一个数组
        value[0]='H';
        System.out.println(str);
    }
}

Hello

2.更换使用StringBuilder或者StringBuffer类(这两个类已经不属于String类了)

StringBuilder类和String是不同的两个类,StringBuilder类的产生就是为了字符串的拼接,一定程度上补偿了String类无法修改的问题。

若碰到需要频繁的拼接字符串的情况,可以使用StringBuilder的append方法:

StringBuilder只会产生一个对象,他里面的值在不断变化着l。

package string_test;

public class StringBuilderTest {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder();
        sb.append("hello");
        sb.append("world");
        sb.append("!!!");
        System.out.println(sb);
    }
}

helloworld!!!
StringBuffer在线程安全上使用。

StringBuilder类和String类的相互转换

 任何的字符串常量都是String 对象,而且String 的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。

通常来讲String和StringBuilder 大部分功能是相同的。

在String中使用“+”来进行字符串链接,但是这个操作在StringBuffer类中需要更改为appen()方法:

public  synchronized StringBuffer append(各种数类型)

把String类变成StringBuilder操作:

1.通过构造方法把字符串的字面量变成StringBuilder的对象:

package string_test;

public class StringBuilderTest {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder();
        sb.append("123");
        System.out.println(sb);
    }
}

2.通过append

package string_test;

public class StringBuilderTest {
    public static void main(String[] args) {
     StringBuilder sb=new StringBuilder();
     sb.append("123");
        System.out.println(sb);
    }
}

把StringBuilder还原为String类的操作:
package string_test;

public class StringBuilderTest {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("hello");
        sb.append("123");
        System.out.println(sb);
        //还原为String的操作如下:
        String str=sb.toString();
        System.out.println(str);
    }
}

StringBuilder类的其他操作

 

 

字符串的比较

字符串的比较-equals (区分大小写)和eaualsIgnoreCase(不区分大小写)
字符串的比较--compareTo方法
CompareTo是根据字符串的ASC||差值比较

字符和字符串的相互转换。

字符串的内部是使用字符数组来存储的。

如何把一个字符char[]转为字符串String?

构造方法

将字符数组的部分内容转换为字符串对象

String转换为char

1.取出字符串中指定索引的字符

2.将字符串中的内容转换为字符数组返回

//此时产生了一个新的字符数组,将字符串的内容 复制过去
//记住铭哥说的:String对象不可变,内容变不了。

如何判断一个字符串的对象是有纯数字构成的呢?


 

package string_test;

import org.omg.CORBA.StringHolder;


public class string_Test {
    public static void main(String[] args) {
        String str="123";
        String str1="12a3";
        System.out.println(isNumber(str));
        System.out.println(isNumber(str1));
    }

    /**
     * 传入一个String对象,判断是否由纯数字构成
     * @param str
     * @return
     */
    public static boolean isNumber(String str){
        //先把字符串转变为字符数组,用to,CharArray()
        char [] data =str.toCharArray();
        // 循环遍历data中所有的字符,判断这个字符是否是数字字符
        // 如何判断是否是数字字符是关键。就用ASC||
        for (char c :data) {
            // 找到反例了!字符型的0和9
            if (c< '0'||c>'9'){
                // 此时字符'c'不是数字字符
                return false;
            }
        }
        return true;
    }
}

true
false
铭哥语录:在处理一个逻辑让你返回TRUE OR FALSE 时

我们的思想是在循环中找反例,有一个反例就return FALSE。

对,反向思考问题。只要你能想到的方法,java中一定都帮你实现了!!!

look:char    的包装类, isDigit是不是数字

 铭哥语录:字符串和数组之间的转换很重要,咱们碰到的大部分问题都需要转换为字符型数组来处理。

字符串和字节的相互转换

1.字节转字符串

按照ASC||来转的哦哦!

 

2.String 转byte[]

和字符不同,我们字符串不能转换为单个的字节,只能转成一个字节数组。 

 

铭哥语录:牵扯到网络传输和文件存储就一定牵扯到字节,将文件保存到文件中,或是通过网络传输就会用到字节数组,比如我在QQ聊天框打入“显平”两个字,对方可以收到说明, 经历两String to byte 又从byte to  String 的过程。

字符串的查找

1.判断一个子字符串是否存在contains

2.从头位置开始查找指定字符串的位置,查到了返回未知的开始索引,如果查不到返回-1;  (indexOf  是JDK1.5之后追加的)

3.从指定位置开始查

4.从后向前查

5.从后向前的某索引位置开始找

6.判断是不是以指定字符开头的

7.从指定位置开始判断是不是以指定字符开头的

8.判断是否以字符串结尾

字符串的替换

1.

 ·替换 所有的指定内容,有几个替换几个。
 ·replaceAll方法

 

2.替换一次

 铭哥语录:针对字符串的所有操作方法都不会修改原字符串,而是产生了一个新的字符串。字符串不可变。

字符串的拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

split(),若字符串中没有指定拆分的子串,拆分后任然的到原数组。

 

拆分IP地址

 得到一个空数组,如果发现没拆成,说明这个格式是一个转义字符,要特殊处理,或者这个格式在字符串中不存在;

比如我么的这个“.”就是一个引用操作符,我们需要对他转义处理,

字符串截取

从一个完整的     字符串中截取出部分内容

java中的字符串的其他操作

 

 

 

 

 

 


str == null表示 str 没有指向任何对象,就是没有对应堆中对象

str.length() == 0表示 str 指向一个字符串对象,但是这个字符串长度为0

/**
 * ·java中没有提供首字母大写操作,需要自己实现
 */
public class byteToStr {
    public static void main(String[] args) {
        System.out.println(fistUpper("hello"));
        System.out.println(fistUpper(""));
        System.out.println(fistUpper("a"));
    }
    public static String fistUpper(String str){
        if (str==null||"".equals(str)){
            return str;
        }
        if (str.length()>1){
            //substring:字符串的截取操作,toUpperCase()转大写,接上后边的部分
            return str.substring(0,1).toUpperCase()+str.substring(1);
        }
        return str.toUpperCase();
    }
}

 

package string_test;

/**
 * ·StringBuffer的内容可以修改.
 */

import java.util.Locale;

/**
 * ·java中没有提供首字母大写操作,需要自己实现
 * @必须掌握
 */
public class StringBuffer {
    public static void main(String[] args) {
        System.out.println(fistUpper("hello"));
        System.out.println(fistUpper(""));
        System.out.println(fistUpper("a"));
    }
    public static String fistUpper(String str){
        //判空
        if (str==null||str.isEmpty()){
            return null;
        }
        //边界
        if (str.length()==1) {
            return str.toUpperCase(Locale.ROOT);
        }
            //substring:字符串的截取操作,toUpperCase()转大写,接上后边的部分
            return str.substring(0,1).toUpperCase()+str.substring(1);
    }
}

Hello
null
A

作业
package string_test;

/**
 * 为什么输出的不是“test ok and gbc”而是 good and gbc
 */
public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值