我是张哲,一位在互联网上不愿透露姓名的小学员,接下来大家看到的所有内容都是我背写的知识点,这里的知识点和你所学习到的不同,我中和了我的一些书籍和网上刷的面试笔记,相信这里能让你接触到更深入的知识点,我会慢慢的把我对某个知识点的理解写进去。
注:Java中有两个包不用导入,一个是本包,一个是java.lang包,前者是package关键字后的包,无需导入,后者是JVM在类加载时给我们导入的包,也无需导入,当然也可以选择去手动导入java.lang包。
原因是我们在创建String类空间的时候它的构造方法会将String字符串写到自己
本类的char类型的数组中,由于这个数组是 private final char[] value类型的数组
数组的长度不可变,final修饰的内存地址不可变,private修饰的外类不可访问
所以这就有了String的不可变特性,但其实可以通过反射的方式改变。
由于String类是final修饰的所以不允许继承String类
引用类型中String创建的最频繁,所以String类可以通过字面量赋值的方式创建空间
比如:String str=“张哲”; 会在字符串常量池中开辟空间,如果字符串常量池中有了
“张哲” 这个字符串则不需要开辟空间。
这里重点讨论下字符串常量池存放在哪里?
String str1="abc,def";
String str2="abc"+",def";
String str3="abc";
str3+=",def";
System.out.println(str1==str2);
System.out.println(str1==str3);
最终的结果返回:true false
原因:判断str1和str2的结果答案在上面,而str3在执行+=的时候地址会改变
这个问题很细节很细节,首先要看 + 有哪些作用
String str1="";
String str2="";
long data1=System.currentTimeMillis();
for(Integer i=1;i<=50000;i++){
str1=str1+i.toString();
}
data1=System.currentTimeMillis()-data1;
System.out.println(data1);
long data2=System.currentTimeMillis();
for(Integer i=1;i<=50000;i++){
str2=str2.concat(i.toString());
}
data2=System.currentTimeMillis()-data2;
System.out.println(data2);
最终返回的结果为 5532 2474
发现:concat方法在拼接字符串时效率明显优于 + ,原因是字符串有着它的不可变特性,我们每次拼接字符串都会新建一个字符串对象,而字符串对象空间产生会起码在里面产生char类型的数组,这里会很消耗性能,而concat方法拼接的时候会频繁的操作小数组,在去拼接,这样的效率要比 + 好很多。因此我们在拼接字符串的时候建议使用concat方法,如果拼接很频繁的话建议使用可变性字符串(StringBuffer和StringBuilder)。
不是说 + 在拼接的时候没有concat方法好,只不过 + 在拼接字符串的时候确实没有concat方法效率高,但是 + 还可以拼接数值、null、boolean等等。
前者在字符串常量池中并没有去创建空间,只不过在栈内存开辟了存放str1的空间,后者是空串,在字符串常量池中创建了个空间,只不过空间的内容为空,所以这里要特别注意的是前者不允许访问任何的属性和方法,否则发生空指针异常。
首先我们要先闹明白为什么有了StringBuffer后还要有StringBuilder,因为很多时候我是单线程,或者我即便是多线程也不一定要去抢共享的资源,所以这些情况下我没有必要担心线程安全,反而还影响我的运行效率,于是StringBuilder就诞生了。
可是我又想使用StringBuilder,有在调用它某个方法时必须保证线程安全,我该怎么办呢???
别急,阿哲同学给你提供两种结局方案:
首先看到这个问题,你可能感到我在开玩笑,有病啊写这么个题目,可变和不可变呗。。。之前我的想法也是这样,但是我们不妨深入想想:面试官肯定知道一个是可变的一个是不可变的,当然几乎是个技术人就知道,但是这个题中隐藏了一个细节——Comparable接口,没错就是这里,String实现了Comparable接口,而可变字符串没有实现Comparable接口,从而可变字符串没有 compareTo方法。而可变字符串有自己的append方法来拼接字符串,这是不可变字符串里没有的。
看到这里我想说:你真能坚持啊!!!这个问题吧建议学完JavaSE内容在回来看,首先这个问题大家一想,应该也就两种吧,嘿!!!