IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java学习之路(二十七)| String类(二) -> 正文阅读

[Java知识库]Java学习之路(二十七)| String类(二)

各自努力,最高处见!加油!

一、String类的理解和创建对象

  1. String对象用于保存字符串。
  2. 字符串常量对象是用双引号阔气的字符序列。例如“你好”、“12.97”、“boy”
  3. 字符串的字符使用Unicode字符编码,一个字符(不区分字母或汉字)占两个字节。
  4. String类常用的构造器:
String s1=new String();
String s2=new String(String original);
String s3=new String(char[] a);
String s4=new String(char[] a,int startIndex,int count);
  1. String 类实现了接口Serializable :表面String可以串行化(可以在网络传输)
  2. String 类实现了接口Comparable :String对象可以比较大小
  3. String 是final类,不能被其他类继承
  4. String 有属性private final char value[ ];用于存放字符串内容
  5. String的底层还是一个字符数组。一定要注意value是一个final类型,不可以修改地址 (value不能指向新的地址),但是数组中的内容可以修改。

二、两种创建String对象的区别

方式一:直接赋值:String s="hsp";

先从常量池查看是否有“hsp”数据空间,如果有,直接指向;如果没有则直接创建,然后指向。s最终指向的是常量池的空间地址。

方式二:调用构造器String s2=new String("hsp");

先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有“hsp”,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。

在这里插入图片描述

练习题一

String a="hsp";//a存的是常量池的地址
String b=new String("hsp");//b存的是堆中的地址,堆中的变量再指向常量池
System.out.println(a.equals(b));//T
System.out.println(a==b);//F
System.out.println(a==b.intern());//T
System.out.println(b==b.intern());//F,b指向堆,b.intern()返回的是常量池该字符串的地址

知识点:
当调用intern()方法时,如果池已经包含了一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回String对象的引用。
人话:池中有这个变量就返回它的地址(对象),没有就新建一个。

练习题二

Person p1=new Person();
p1.name="hspedu";
Person p2=new Person();
p2.name="hspedu";

System.out.println(p1.name.equals(p2.name));//True
System.out.println(p1.name==p2.name);//p1.name和p2.name指向的都是常量池中的地址
System.out.println(p1.name=="hspedu");//T

String s1=new String("bcde");
String s2=new String("bcde");
System.out.println(s1==s2);//False

面试题

题一:

String a="hello"+"abc";

解读:编译器优化==>String a=“helloabc”;

题二:

String a="hello";
String b="abc";
String c=a+b;
//创建了几个对象?答案:3,可能不同版本的java不一样

在这里插入图片描述解读:
第一步:StringBuilder sb=new StringBuilder();
第二步:sb.append(a);
第三步:sb.append(b);

题三:

String s1="hspedu";//s1指向常量池的"hspedu"
String s2="java";//s2指向常量池的"java"
String s5="hspedujava";//s5指向常量池的"hspedujava"
String s6=(s1+s2).intern();//s1+s2表示新的"hspedujava"字符串,intern方法是指在常量池中寻找这个"hspedujava"字符串,所以s6指向的是常量池里的"hspedujava"字符串。

System.out.println(s5==s6);//T
System.out.println(s5.equals(s6));//T

题四:
【易错题】

public class Test1 {
    String str=new String("hsp");//str指向堆中的value,value指向常量池中的“hsp”地址
    final char[] ch={'j','a','v','a'};//ch指向堆中的区域
    public void change(String str,char ch[]){
        str="java";
        ch[0]='h';
    }

    public static void main(String[] args){
        Test1 ex=new Test1();
        ex.change(ex.str,ex.ch);
        System.out.println(ex.str+"and");
        System.out.println(ex.ch);
    }
}

在这里插入图片描述内存图解:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 10:43:56  更:2021-09-10 10:45:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:09:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码