JAVA面试笔试题之字符串篇【亲手实践】
2018-01-19 17:39
281 查看
package ai; public class DemoString { //类变量 final static String name = "zhangSanFeng"; final static String firstName = "zhang"; final static String lastName = "SanFeng"; /** * static:何为静态,goal变量(引用)存放在方法区中(方法区是常量池的一部分) * 对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态变量的空间(内存空间), * 即编译时就为这些成员变量的实例分配了空间 * 而“ab”存在引用goal指向的堆内存中 */ private static String goal = new String("ab"); public static void main(String[] args) { //字符串比较 以及引用类型变量比较 //strTest1(); //secondTest(); //finalTestDemo(); checkIt(); } private static void checkIt() { String s1 = "a"; String s2 = "b"; String s = s1 + s2; System.out.println(s == goal); //false s的位置是常量池,goal位于方法区 System.out.println(s.intern() == goal); System.out.println(s.intern() == goal.intern()); } /** * final修饰变量 1、修饰的变量必须是基本数据类型:告知编译器这一块数据是不变的,这样可以在执行计算时,减少一些运行时的负担。 2、无论什么情况,final修饰的变量必须初始化。 */ private static void finalTestDemo() { //System.out.println(name == (firstName + lastName)); byte a = 1; byte b = 3; //byte c = a + b; //直接加会出错,因为运算时Java虚拟机进行了转换,导致把一个int赋值给byte //----------------------------------------------------------------------------------- final byte num1 = 1; final byte num2 = 3; byte num = num1 + num2; //加上final就不会出错。 //System.out.println(num);//一个问题:byte如何转int? //========================================================================================================= final String f1 = "abc"; final String f2 = "ab"; final String f3 = "c"; //final s = null; /** * 该处花了很多时间来搜索、理解,final修饰的变量,编译器会把它当做编译期常量使用?【答案:Final变量 编译时期就确定具体值】 */ System.out.println(f1 == (f2+f3));//该处等同于【f1=="ab"+"c"】 } private static void strTest1() { /** * 你或许听说过“字符串常量池”这个概念,究竟什么是字符串常量池?有人说是一个字符串对象容器。答案很接近了,但是不完全正确。 事实上他是一用来保存字符串对象引用的容器。 即使字符串是不可变的,它仍然和Java中的其他对象一样。对象都是创建在堆中,字符串也不例外。 所以字符串常量池仍然依靠堆,他们存储的只是堆中字符串的引用。 */ String s1 = "abc";//在字符串常量池中开辟一段内存空间 String s2 = new String("abc");//在堆中开辟一段内存空间 String s3 = new String("abc");//在堆中开辟一段内存空间 System.out.println(s1 == s2);//false System.out.println(s2 == s3);//false System.out.println(s2 == s3);//false System.out.println("-----------------"); System.out.println(s1.equals(s3)); System.out.println(s1.equals(s2)); System.out.println(s3.equals(s2)); System.out.println("-----------------"); String start = "Hello"; String end = start.concat(" World!"); System.out.println(end+"|"+start); String one = "someString"; String two = "someString"; System.out.println("-----------字符串常量池------"); System.out.println(one.equals(two)); System.out.println(one == two); //在这个例子中,实在没有必要为一个相同的字符串对象创建两个实例。如果字符串像StringBuffer一样是可变的, //那么我们会被迫创建两个对象(如果不这样做的话,通过一个引用改变它的值,将会导致其他引用的值也同样改变,从而可能发生错误)。 //但是,我们知道字符串对象是不能被改变的,我们可以安全地通过两个引用one和two来使用一个字符串对象。 System.out.println("----test StringBuffer----"); StringBuffer sb1 = new StringBuffer("123"); StringBuffer sb2 = new StringBuffer("123"); System.out.println(sb1 == sb2); System.out.println(sb1.equals(sb2)); System.out.println("-------test Object对象测试-----"); Tickets t1 = new Tickets(); Tickets t2 = new Tickets(); System.out.println(t1 == t2); System.out.println(t1.equals(t2)); } private static String a = new String("ab"); //堆内存(地址 ) private static void secondTest() { String s1 = "a"; String s2 = "b"; String s = s1 + s2; System.out.println(s == a); //地址不同,一个位于 静常,另一个位于运常,故false //对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 System.out.println(s.intern() == a); System.out.println(s.intern() == a.intern()); //true System.out.println(s.equals(a)); //true System.out.println("=========="); Test2 t1 = new Test2(); Test2 test2 = new Test2(); System.out.println(t1.equals(test2)); System.out.println("================================"); String hello = "hello"; String hel = "hel"; String lo = "lo"; //false 该题我做错了,因为没有认识到:对于那些在编译时就能确定的字面量都会存放在运行时常量池中。正确答案是:true System.out.println(hello == "hel" + "lo"); System.out.println(hello == "hel" + lo); //false【其中lo是变量,在编译时不能确定值】 } }
附上几张图,方便大伙理解。以上是个人笔记,不喜勿喷。
相关文章推荐
- String面试笔试大放送【亲手实践】
- java 笔试面试易错题
- Java常见笔试面试题目解析(一):final与static final变量(原生类型)的初始化方式
- 125条常见的java面试笔试题大汇总
- java 面试 笔试题 大全 (五)
- java面试笔试题大汇总 及c/c++面试试题转载
- Java程序猿笔试面试之String1
- Java面试笔试知识点之基础部分2
- java面试笔试题大汇总
- Java面试笔试指南(五)---异常处理、输入输出流、内存管理
- 125条常见的java面试笔试题大汇总之五
- 算法--06谷歌面试:字符串中第一个只出现一次的字符(Java实现)
- SJCP试题--JAVA继承时候的构造方法笔试面试总结
- java面试和笔试大全
- 上海复深蓝JAVA面试笔试题
- Java常见笔试及面试考点总结
- 笔试面试算法经典--矩阵的最短路径和(Java)
- java笔试+面试总结——java基础篇
- 125条常见的java面试笔试题汇总(一)
- java面试编程题(字符相关)