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”; //入门知识: 左边的是引用变量是可以改变的右边的是创建的对象不可以改变
面试题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.
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.
顺带说一下如何使用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