Java字符串篇-1-字符串的概述

       对我个人来说,终于走到了这一步。相信很多人在大学多多少少都学习过编程和Java语言,同样,我也是虽然学习了,测试大部分工作都没有使用编程,造成什么也不会。但是,找工作,找一个自动化测试或者测试开发,很多面试题基本上都是集中在面向对象,字符串操作,排序算法,和集合类这几大范围里,特别是一个手写编程题目。

 

       我很早就意识到面试中编程能力不行,很大原因是上面这些范围自己没有学好,没有准备好。有些概念甚至都没有听说,更别说具体代码实现和里面的原理。个人总结之后,决定要认真学习一遍JAVA基础部分(现在才发现JAVA基础部分远远超过我所认识的基础范围)。断断续续,最近把OOP给学完了,虽然还是很多不懂,但是还是要继续前行,继续学习。所以,我打算写一个关于学习JAVA字符串操作和排序算法和集合框架的系列文章,用来帮助自己整理学习进度和以后回过头的复习资料。有兴趣的可以一起来学习和讨论,视频的学习资料是传智播客的JAVA基础(前18天)。

 

       因为集合、算法相关的面试题很多代码都需要字符串相关操作和基础,String部分应该是最基础和简单学习的部分,所以,我们先从字符串学起。

 

1.前提条件

1)准备一个JDK API 1.6中文版

2)任何一个JAVA IDE工具,Eclipse或者IntellijIDEA

 

       网上百度一下JDK API 1.6中文版,很容易下载到,虽然现在Java到1.9版本,但是还没有最新的中文版API出现。

 

2.知识点

 

       打开JDK API 1.6中文版,点击左上角的“显示”菜单,然后在文本输入框输入“String”,回车。观察以下红圈的地方,这些是String类的知识点。

1)String类是在java.lang包下,所以使用的时候不需要导入包

2)String类在定义class的时候使用了final关键字,所以String类不能被继承,没有子类

3)字符串字面值“abc”就是一个字符串对象

4)字符串是常量,一旦被赋值,就不能被改变。

 

3.代码举例

      上面四个知识点,前面两个很好理解。String类是在lang包下,所以不需要导入包就能直接使用,父类是Object,所以String类重写了Object中的toString和equals方法,后面我们会学习到。下面我们用代码来说明后面两个知识点。

 

字符串字面值“abc”就是一个字符串对象

 

       怎么去理解这句话呢?下面我们借助面向对象知识里面学习的对象创建过程来说明字符串字面值就是一个字符串对象。

String st = "abc";

// Person p = new Person();

       在面向对象中,我们知道newPerson()是Person类的一个对象,同理,我们可以这样理解,“abc”是String类的一个对象。而且,我们知道,String并不是Java中的8大基础数据类型,所以,上面语句的st是一个引用,指向了“abc”在内存中的地址。

 

字符串是常量,一旦被赋值,就不能被改变。

 

先在IDE中输入如下代码,然后运行,看看输出结果。

public static void main(String[] args) {

    

     String st = "abc";

     System.out.println(st);

     st = "def";

     System.out.println(st);

    

}

 

      输出结果是  abc 和 def。这个结果就很让我们疑惑,明明是前后输出发生了改变,又为什么说字符串是常量,一旦赋值,不能改变。为了解释清楚这个知识点,我们需要利用内存图来帮助我们理解。

 

 

      下面这个内存图,我们需要有这个知识点作为前提:内存中分为栈和堆和方法区,方法中有一个叫常量池的区域,顾名思义,常量池就是存储常量的地方,供其他对象调用。

 

     下面我们来画一画上面代码的内存图,假设我们当前这个main方法在Demo1_String.java文件里面,编译之后就会生成Demo1_String.class文件,第一个步骤就是Demo1_String.class加载进入方法区,然后Demo1_String.class里面的main方法进栈。

       然后运行到这行代码String st = "abc";,右侧“abc”是一个常量,所以这个会在常量池中创建,main方法中的String st会指向“abc”在常量池的内存地址。

      首先,常量池里面会创建一个“abc”(如果已存在abc,第二次就不会再创建),然后“abc”在常量池中有一个内存地址,假如叫0x0011,在Main方法中st可以根据0x0011这个地址值去访问“abc”。接下来执行打印语句,这个时候st的值打印出来是“abc”,说明在String类中重写了Object类的toString方法,打印出来的是对象本身,而不是对象在内存中的地址。

 

       接下来,执行第三行代码st=”def”,我们来画画这句代码的内存图。

       常量池有这么一个特点,如果常量池已经存在一个常量,那么就不会新建,否则就新建。我们在执行st=”def”的时候,常量池发现“def”不存在,所以,新建一个“def”的对象,并产生一个内存地址(0x0022),这个时候把0x0022这个内存地址赋值给了st,所以st指向了0x0022地址的对象,所以接下里执行打印语句,输出的是”def”。上面关键的部分来了,st指向了新的内存地址,原来的0x0011指向的线条,我在上面画X,由于“abc”这个对象没有被赋值,就变成了垃圾,会被JVM中的垃圾回收处理。整个过程“abc”这个字符串变量的值没有发生改变,最后被当做垃圾回收了。所以,字符串是常量,一旦被赋值就不会发生改变,这个知识点用上面几张内存图就好理解。“def”这个是新建的对象,有自己的内存地址,并没有对“abc”产生变化,更没有修改“abc”这个对象里面保存的值。

 

4.总结

 

      本篇就掌握两个知识点,String赋值语句右边双引号里面的就是一个对象,String对象可以通过对象名加上点号进行调用String类相关方法。第二个就是字符串是常量,一旦赋值就不能被修改,这个需要通过画内存图来理解。这个知识点很重要,也很基础,是我们后面做一些面试练习题的前提,有了这个知识点,才更好理解后面的面试题。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值