天天学JAVA-JAVA基础(6)

如果觉得我写的还行,请关注我的博客并且点个赞哟。本文主要介绍JAVA 中最常使用字符串常量String相关知识。

1.String简介
2.创建字符串对象两种方式的区别
3.String常用的方法
4.String的不可变性
5.一道阿里面试题,你会做吗?

1.String简介
1.1String源码
在这里插入图片描述

首先看一段String源码,String主要实现了Serializable、Comparable、CharSequence等接口。Serializable主要实现序列化,Comparable此接口强行对实现它的每个类的对象进行整体排序,CharSequence主要实现char值的一个可读序列。String使用final关键字修饰,表明String这个类是不能被继承。
在API中对String是这样描述:
String 类代表字符串。Java 程序中的所有字符串字面值(如 “cc程序员” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

 String str = "abc";
  相当于:
 char data[] = {'a', 'b', 'c'};
 String str = new String(data);
 

1.2.String中的成员变量

     @Stable
    //String的属性值
    private final byte[] value;
   // coder方法判断COMPACT_STRINGS为true的话,则返回coder值,否则返回UTF16;              isLatin1方法判断COMPACT_STRINGS为true且coder为LATIN1则返回true
    private final byte coder;
    //String类型的hash值
    private int hash;
    private static final long serialVersionUID = -6849794470754667710L;
    //默认为true
    static final boolean COMPACT_STRINGS = true;
    //创建串行化字段
    private static final ObjectStreamField[] serialPersistentFields 
    = new ObjectStreamField[0];
    public static final Comparator<String> CASE_INSENSITIVE_ORDER 
    = new String.CaseInsensitiveComparator();
    static final byte LATIN1 = 0;
    static final byte UTF16 = 1;

1.3.String的构造函数
在这里插入图片描述

2.创建字符串对象两种方式的区别

1.直接赋值方式创建对象
直接赋值方式创建对象是在方法区的常量池
String str="cc程序员";//直接赋值的方式
2.通过构造方法创建字符串对象
通过构造方法创建字符串对象是在堆内存
String str=new String("cc程序员");//实例化的方式,New一个对象

3.String常用的方法
在这里插入图片描述

3.1.String 的判断操作

//测试此字符串是否以指定的前缀开头
startsWith(String prefix)
//试在指定索引处开始的此字符串的子字符串是否以指定的前缀开头
startsWith(String prefix, int toffset)
//测试此字符串是否以指定的后缀结尾。
endsWith(String suffix)
//将此字符串与指定对象进行比较。 其结果是true当且仅当该参数不是null
//并且是String对象,表示相同的字符序列作为该对象。
equals(Object anObject)
//将此字符串与指定的StringBuffer进行StringBuffer 。 
//其结果是true如果并且如果该只String表示的字符作为指定的相同序列StringBuffer 。
// 该方法在StringBuffer上StringBuffer
contentEquals(StringBuffer sb)
//将此String与其他String比较,忽略案例注意事项。 
//如果两个字符串的长度相同,并且两个字符串中的相应字符等于忽略大小写,
//则两个字符串被认为是相等的
equalsIgnoreCase(String anotherString)

代码事例如下:

package com.cy.lambda.learning.base;


/**
 * cc程序员
 * String实例
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "cc程序员";
        String s2 = "CC程序员";
        StringBuffer sb = new StringBuffer("cc程序员");
        System.out.println("===:"+s1 == s2);//false
        //startsWith(String prefix)测试此字符串是否以指定的前缀开头
        System.out.println("startsWith(String prefix):"+s1.startsWith(s2));//false
        /**
         *  startsWith(String prefix, int toffset)试在指定索引处开始的此字符串
         *  的子字符串是否以指定的前缀开头
         */
         System.out.println("startsWith(String prefix, int toffset):"
                 +s1.startsWith(s2,3));//false
         // endsWith(String suffix)测试此字符串是否以指定的后缀结尾。
        System.out.println("endsWith:"+s1.endsWith("员"));//true

        /**
         *  equals(Object anObject)将此字符串与指定对象进行比较。
         *  其结果是true当且仅当该参数不是null并且是String对象,
         *  表示相同的字符序列作为该对象。
         */
        System.out.println("equal:"+s1.equals(s2));//true
        /**
         * contentEquals(StringBuffer sb)将此字符串与指定的StringBuffer进行StringBuffer
         * 其结果是true如果并且如果该只String表示的字符作为指定的
         * 相同序列StringBuffer 。该方法在StringBuffer上StringBuffer
         */
        System.out.println("contentEquals:"+s1.contentEquals(sb));//true
        /**
         *  equalsIgnoreCase(String anotherString)
         *  将此String与其他String比较,忽略案例注意事项。
         *  如果两个字符串的长度相同,并且两个字符串中的相应字符等于忽略大小写,
         *  则两个字符串被认为是相等的
         */
        System.out.println("equalsIgnoreCase:"+s1.equalsIgnoreCase(s2));//true
        //length() 字符串长度
        System.out.println(s1.length());
    }
}

4.String的不可变性

String是个常量,从一出生就注定不可变.正如文章开头介绍一样,String类被final修饰,所以她是不可变得。

因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,但是这样的做法仅仅适合于通过=符号进行的初始化。  
需要说明一点的是,在object中,equals()是用来比较内存地址的,但是String重写了equals()方法,用来比较内容的,即使是不同地址,只要内容一致,也会返回true,这也是为什么a.equals©返回true的原因了。
可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。

String不可变得好处:
我们的程序中大量使用了String字符串,有可能是出于安全性考虑。
大家都知道HashMap中key为String类型,如果可变将变的多么可怕。
当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝出里面的值,性能会有一定的损失

5.如何实现两金额数据相加(最多小数点两位)(阿里面试题)

如果你想知道答案或者你知道答案,请留言或者关注下方公众号,并且回复1030,将会得到答案和解析哟。

如果你觉得我写的还行,请关注我的博客并且点个赞哟,也请关注我的公众号并加入下方QQ群,每天都会定时推送干货以及共享一些优质的学习资料和视频哟.
在这里插入图片描述
在这里插入图片描述

发布了73 篇原创文章 · 获赞 246 · 访问量 24万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览