zoukankan      html  css  js  c++  java
  • 【忘不了的Java基础】之String

    问题:

    1. String存放在内存的哪个区域中?

    2. String创建几种方式的对比?

    3. String的比较==,和equals()方法,有什么不同?

    4. String为什么要设置成final类型?

    5. String做形参的传递是怎么的?

    6. String,与StringBuffer,StringBuilder?

     

    1.String存放在内存的哪个区域中?

    String str = "hello";

    内容“hello”在常量池中,常量池在方法区中

    str是指向内容“hello”的引用(地址),在栈中

    String str1= new String( "hello");

    new的对象在堆中,

    str1是指向堆中String实例内容“hello”的引用(地址),在栈中

    2.String创建几种方式的对比?

        public static void main(String[] args) {
            String s1 = "a";  //第一种
            String s3 = "a";
            String s2 = new String("a");  //第二种
    ​
            System.out.println("s1==s2  "+(s1==s2));  //false
            System.out.println("s1==s3  "+(s1==s3));  //true
    ​
            System.out.println("s1.equal(s2)  "+s1.equals(s2)); //true
            System.out.println("s1.equal(s3)  "+s1.equals(s3)); //true
        }

     3.String的比较==,和equals()方法,有什么不同?

    == 比较的是对象的引用

    equals()比较String的内容value

    //String源码
    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {   //依次比较字符数组的内容
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

     

    4.String为什么要设置成final类型?

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];

    首先String类是用final关键字修饰,这说明String不可继承。再看下面,String类的主力成员字段value是个char[ ]数组,而且是用final修饰的。final修饰的字段创建以后就不可改变。

    当需要修改字符串的内容时,String类的方法都会返回一个新的String对象,同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已。

    好处:安全,

      不可变性支持线程安全,

      不可变性支持字符串常量池

     参考:https://blog.csdn.net/u013905744/article/details/52414111

    5.String做形参的传递是怎么的?

    对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。

    示例:

    public static void main(String[] args) {
    ​
            String q = "abc";
            System.out.println(q);  //abc
            String qq = upcase(q);
            System.out.println(qq);  //ABC
            System.out.println(q);  //abc
    ​
        }
    ​
        public static String upcase(String s){
            return s.toUpperCase();
        }

    解读:

    当把q传给upcase()方法时,实际传递的时引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过

     

     

    6.String,与StringBuffer,StringBuilder?

     String是final修饰的,不可变对象,每次修改都会重新生成一个新的String对象并返回新对象的引用。

    StringBuffer 可变,线程安全,加了synchronized

    StringBuilder 可变,线程不安全,

    String str = "mango";
    
      String s = "abc"+str+"def"+22;

    //编译器自动引入了StringBuilder类
    //编译器创建了一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder的append()方法,共三次,最后调用toString()生成结果。
  • 相关阅读:
    第一节:理解垃圾回收平台的基本工作原理
    回想笔记 瞎比比 域名注册 解析绑定ip 下载证书 设置证书 重定向http到https请求
    flask 设置https请求 访问flask服务器
    关于 服务器ip和域名进行一个绑定
    ubuntu 安装flask+nginx+gunicorn 待定
    使用flask-dropzone 上传图片文件
    flask 对于用户登录保持状态 flask_login
    flask 对于邮件url进行一个加密防止爆破
    flask 密码加密 视频资料
    flask 多线程邮件异步发送 视频资料
  • 原文地址:https://www.cnblogs.com/tingtingzhou/p/10909198.html
Copyright © 2011-2022 走看看