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 |
|