A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

点点点点

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 点点点点 初级黑马   /  2018-6-12 16:44  /  511 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
* java当中的数据类型只有两种:基本类型、引用类型。
* 基本类型8个关键字,不是这八者之一,那么剩下的全都叫引用类型,
* 则字符串就是一种引用类型。
*
* 注意字符串就是一个对象。
*
*/
public class Demo01String {
   
    public static void main(String[] args)
    {
        //动态初始化一个数组,就是创建了一个对象。数组就是一个对象。
        
        int[] array1 = new int[5];//等号右边的为进入堆中赋予内存的 需要进行实例化的对象。
        
        //静态化一个数组,数组{10,20,30},也同样是对象。
        
        int[] array2 = {10,20,30};
        
        //字符串直接写上双引号,就是一个String类型的对象!String就是类名称。
        
        String str = "Hello";
        System.out.println(str);
        
        //直接使用的字符串常量,也照样是一个字符串的对象。
        System.out.println("world");
        
    }
}
* 既然说字符串就是一个对象,则有两个问题:
*
* 1.对象肯定有一个类与之对应,那么字符串对应的类————String
*
* .String这个类,为什么不需要导包就能使用?
*
* 解释1:所有的类都需要导包才能使用,除了两种情况:
*
* A.要使用的目标类,和当前类位于同一个包下。
* B.要使用的目标类,位于java.lang包下。(但不包含子包)
*
* 2.既然字符串是对象,那么为什么可以直接打印出来。
* 打印println方法逻辑:
* 1.如果是字符串类型,那么直接显示内容。
* 2.如果不是字符串类型,那么久想办法内部转换成字符串,然后再显示。
* 一般的对象都是使用“类型信息+@+地址值”作为字符串内容。
*/
public class Demo02StringQuestion {
   
   public static void main(String[] args)
   {
      Stringstr = "Hello";
      System.out.println(str);//hello
   }
}
字符串对象相应的问题
* 既然说字符串就是一个对象,则有两个问题:
*
* 1.对象肯定有一个类与之对应,那么字符串对应的类————String
*
* .String这个类,为什么不需要导包就能使用?
*
* 解释1:所有的类都需要导包才能使用,除了两种情况:
*
* A.要使用的目标类,和当前类位于同一个包下。
* B.要使用的目标类,位于java.lang包下。(但不包含子包)
*
* 2.既然字符串是对象,那么为什么可以直接打印出来。
* 打印println方法逻辑:
* 1.如果是字符串类型,那么直接显示内容。
* 2.如果不是字符串类型,那么久想办法内部转换成字符串,然后再显示。
* 一般的对象都是使用“类型信息+@+地址值”作为字符串内容。
字符串创建的常见2+1种方式(两种构造方法,一种直接赋值)
*
* 常见的两个构造方法:
* public String(char[] array),参数是一个字符数组,
* 根据字符数组的内容来创建一个字符串。
*
* public String(char[] array int offset , intcount):
* 根据字符数组的一部分内容老创建字符串。
* 参数 offser 代表一个数组当中的其实索引,从0开始。
* 参数count代表取用多少个字符。
字符串池
* 字符串是最为常用的对象,所以在程序当中往往会出现很多歌重复的字符串。
* 为节省内存,所以引入“字符串池”的设计,可以重复利用字符串。
*
* 关于字符串池的几点描述:
* 1.字符串池是位于堆(head)内存当中的一小块空间,用来保存若干字符串的地址值。
* 2.字符串池当中绝对不能出现重复的字符串对应的地址,保证字符串不重复。
* 3.凡是直接双引号的字符串默认都在池中,而new出来的字符串默认不在池中。
*
* 对于基本类型来说,==是进行数据内容的比较,
* 但对于引用类型来说,==是进行地址值的相同比较。
* 如果是两个对象,那么地址值必然不同,如果地址值相同,那么必然是同一个对象。
*/
public class Demo04StringPool {
   
    public static void main(String[] args)
    {
        Stringstr1 = "Hello";
        Stringstr2 = "Hello";
        System.out.println(str1==str2);/*true 由于是直接“=”号赋值, 字符串的地址值存放于字符串池中,字符串池为了节省内存,省
                                        去相同的字符串地址值,对原有的字符串地址值进行多次利用。*/
        char[] array = {'H','e','l','l','o'};
        Stringstr3 = new String(array);
        Stringstr4 = new String(array);
        System.out.println(str3==str4);//false.
        System.out.println(str1==str3);//false.

    }
图解:

字符串内容创建后不改变
package cn.itcase.day07.demo01;
/*
* 字符串对象在内存当中一旦被创建,则内容不可改变。
*/
public class Demo05StringEnternal {
    public static void main(String[] args)
    {
        Stringstr = "Hello";
        System.out.println(str);//输出Hello。
        
        str = "World";
        System.out.println(str);//输出World。
        
        /*
         * 1."Hello"字符串与其地址值没有发生改变。
         * 2."World"先创建的常量与地址值进入字符串池
         *    又重新赋了一个地址值给str
         */
        
    }

}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马