分享

JAVA学习笔记之String类型和字符串常量区

 爱可乐的小咖 2016-08-30

String,StringBuilder和StringBuffer类

String类是不可改变的类,一旦String对象创建以后,包括在这个对象内的字符串序列都不可更改,直至这个对象被销毁。String的对象一旦实例生成就不可以改变。

StringBuffer对象则代表的是一个字符串序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的库函数等放法可以改变这个字符串对象的序列。 一旦想通过StringBuffer生成最终想要的字符串,就可以调用它的toString()方法将其转化为String对象。

StringBuffer和StringBuilder功能基本相似,这两个类的构造器和方法基本相同。不同的是StringBuilder线程比较安全,而StringBuffer没有实现线程安全功能,所以性能StringBuilder要略高。

注:在通常情况下,要创建一个内容可变的字符串对象,应该优先考略StringBuilder。

String的赋值方式:

第一种: 直接赋值 String str = “aaa”;

第二种: 通过创建对象 String str = new String(“aaa”); //aaa叫做字面值

String 创建的对象是字符串常量 一旦赋值 就不可以再改变 所谓不可改变的是在堆里创建string字符串。

字符串常量区

假如一个字符串字面值为aaa,在程序运行时被创建啦N遍,这样很浪费内存,为了节约内存(高效使用内存),java就为同一个字面值的aaa在内存中创建一份,就节约啦内存。这一份“aaa”对象就放着字符串常量区。

面试题0: Java程序中判断两个变量是否相等有两种方式?

答:一种是通过符号==来完成,还有一种是通过equals()方法。

符号==的实质:

对于基本类型来说,其二进制位是数值,比较的是数值,

对于引用类型来说,其二进制位是地址,其实比较的是不是同一个引用对象。

equals()的实质:

比较的是字符串的字面值是否相等。 String s1 = “aaa”; //字面值即aaa

面试题1:

String str = “aaa”; //入门知识: 左边的是引用变量是可以改变的右边的是创建的对象不可以改变

JAVA学习笔记之String类型和字符串常量区

面试题2:

String s1 = 'aaa';

s1.concat('bbb');

System.out.println(s1);

以上代码执行结果是什么?

答: aaa 因为“bbb”的出现,就在堆里创建啦一个String “bbb”的对象,这个对象是字符串常量,s1.concat(“bbb”)语句,又创建啦一个对象“aaabbb”,这个对象也是字符串常量。在这个过程中s1引用变量没有发生改变,所以其地址指向还是aaa. 如果语句变为s1 = s1.concat(“bbb”); 则 s1引用变量就发生啦改变,指向“aaabbb”.则输出aaabbb.

JAVA学习笔记之String类型和字符串常量区

String对象的缺点:

如果想频繁的修改字符串的字面值,就会频繁创建新的 字符串对象出来,一旦被创建就永远不会改变,如果字符串连接底层就会创建,容易浪费内存,而内存的分配与回收都是需要耗费时间的,这样会影响代码的执行效率。

如果要频繁的修改字符串的值,就可以把它定义为StringBuffer和StrinBuilder.这两个对象是可以改变的。

面试题3;

简述一下final?

Final 最终变量修饰基本类型时,表示常量,只能初始化一次。

在引用变量前时,就是最终引用变量,就其引用变量只能赋值一次;只能指向开始时初始化的那个地址。

修饰的这个变量就不再是放在栈中了,而是放到堆中。

面试题4:String的赋值方式有哪些?

第一种:直接赋值 String str = “aaa”;

第二种:通过创建对象 String str = new String(“aaa”); //aaa叫做字面值

以上两种方式的区别?第一种创建啦几个对象?第二种又创建啦几个对象

答:第一种创建啦一个对象,在字符串常量池中创建,

String s1 = “aaa”; //创建啦一个对象

String s2 = “aaa”; //创建啦0个对象对于常量池有着返回,不创建,无则创建

System.out.print(s1 == s2); //结果? true

System.out.print(s1.equals(s2)); //结果? True 比较的是字面值

第二种创建啦两个对象,一个在堆里,一个在字符串常量池中创建

String s1 = new String(“aaa”);

String s2 = new String(“aaa”);

System.out.print(s1 == s2); //结果? False

System.put.print(s1.equals(s2)); //结果? True

System.put.print(s1.inter n() == s2.intern()); //结果? True

s1.intern() 的意思是:s1引用的堆里的对象,所对应的常量池中的字面值为aaa的地址。

解析:String s1 = new String(“aaa”);

首相“aaa”在字符串常量池中建立一个字面值aaa的对象,其实质是一个字符数组,new String(“aaa”)则是在堆中创建一个对象,对象里面的内容实质是字符数组的地址。String s1 = new String(“aaa”),则是将堆中对象地址赋值给引用变量s1.

JAVA学习笔记之String类型和字符串常量区

顺带说一下如何使用MyEclipse基本操作?

1.建立一个工作空间

其实就是先在硬盘上建一个文件夹gsWorkSpace

2.切换工作空间

File--Switch WorkSpace-other

3. 新建一个java 工程

右键--new ---java project

一个工作空间下可以有多个工程

例:gsWorkSpace(工作空间)

-工程1

-工程2

-GongShang

-src(放java源程序 .java)

-bin(放字节码文件 .class)

如果想把字节码放到其他文件夹

可以 工程右键--build path--configure build path-source---把下面的 默认输出文件夹改了就可以了

一般不要改 默认就可以了

4. 新建一个 包 package (实质也是一个文件夹)

包的起名 包的名都是小写 一般都是域名 反过来 保证唯一

例:com.chapter5

5. 在包里新建 class 类

右键--new--class

main alt + / 自动提示

Sysout alt + / 帮你实现System.out.println();

配置快捷键

window--preferences--general---keys

(1)Content Assitent 内容助手

改成alt + /

(2) Word Completion

把以前的alt + /去掉window--preferences--general---keys

多行注释 control + shift + /的使用:

选选中你简要注释一些语句,按下control + shift + /

断点的作用是调试程序

如何打断点?

在行号左边 双击 一下 就出来 一个圆点 这个叫断点,断点那一行不会执行。

打了断点以后 想调试 debug as----------java application

Step into 单步进入 逐语句 碰到方法 就进入方法 一句一句的执行

Step over 单步跳过 逐过程(方法) 以方法为单位 如果方法里面有多条语句 就一起执行

MyEclipse写HelloWorld

1. 编译

保存的时候 已经编译了 javac

MyEclipse默认使用 自己 自带的jdk

如果想更改jdk

windows-preferences--java--Installed JREs

点add 选想要使用的jdk 安装路径就可以了

2.运行

代码-右键- Run as- Java Application

在控制台查看 运行结果

切换透视图 MyEclipse Java Enterprise

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多