问题一、String,StringBuffer,StringBuilder的区别?
String:字符串常量;
StringBuffer:字符串变量(线程安全)
StringBuilder:字符串变量(非线程安全)
速度一般情况下:StringBuilder > StringBuffer > String
速度区别的主要原因是由于String是不可变的对象,每次针对的String对象的改变都是生成新的String对象,然后将指针指向新生成的对象。这样系统中无引用的String实例越来越多,增加GC的次数,系统自然会慢。
StringBuffer和StringBuilder的主要区别是StringBuffer是线程安全的,而StringBuilder是非线程安全的,针对它们的字符串操作是在原String对象基础上改变而不是生成新的String对象。因此真对单线程下的String缓冲操作可以使用StringBuilder获得最好的性能,需要注意线程安全的情况下可使用StringBuffer保证线程安全。
1,特殊情况
String s1 = “This is only a” + “ simple” + “ test”; StringBuilder sb1 = new StringBuilder(This is only a).append(" simple").append(" test");
生成是s1的速度快的多,那是由于在JVM编译时针对Constant Pool中的常量"+"操作符进行了优化,实际上是
String s1 = "This is only a simple test"
这样速度当然更快了。当然如果有个String 的引用不是来自Constant Pool,那么JVM就没有优化了,sb1的效率更高。
2,值得注意的是,下面创建了几个String对象?
String s1 = new String("s1"); String s2 = new String("s1");
答案:3个,编译期Constant Pool中创建了一个“s1”,运行期heap中创建了两个(new)
问题二、加了static的synchronized方法和不加static的synchronized方法有啥区别?
针对这个问题我们可以联想加了static的方法和不加static的方法有什么区别,static方法,类的方法,该类的实例和该类均可以调用,非static方法,只有类的实例可以调用,那么很容易知道加了static的synchronized方法和是针对类上了锁,只要有一个类正在访问该方法段,其它实例均需要等待(针对不同实例,锁均有效),而非static的synchronized的方法只是针对实例级别上锁,同一实例不同线程访问,锁有效,针对不同的实例,无锁。
问题三、Java底层是如何操作文件的?
可以看JDK里面FileInputStream的实现
/** * Opens the specified file for reading. * @param name the name of the file */ private native void open(String name) throws FileNotFoundException; /** * Reads a byte of data from this input stream. This method blocks * if no input is yet available. * * @return the next byte of data, or <code>-1</code> if the end of the * file is reached. * @exception IOException if an I/O error occurs. */ public native int read() throws IOException;
都是native方法,因此是依赖操作系统,在windows上调用DLL实现。
我们可以联想tomcat的bio,nio,apr三种Connector模式,tomcat为了提高吞吐量获得更高的性能可以使用apr,即直接调用native方法进行IO操作发送静态资源,而不是使用Java封装的IO。默认情况下tomcat发送大于48k的静态资源,使用sendFile。sendFile能够避免静态资源在用户态和内核之间的四次copy,直接在内核态将资源写入TCP栈。tomcat设定了一个threshold为48K,48K一下的文件使用缓存的方式性能会更好。
相关推荐
考试前三五天要全面检查一次复习内容,集中把学科的重点、难点弄懂。 秘籍五:忌急忌躁,始终保持好心态。自考是一个持久战,要培养一个好的学习习惯和自主思考的能力,要学会去分析这个题是在考哪个知识点,每个题...
提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。 纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 ...
预习需要看、做、思三个方面结合。看是指学生阅读新课,勾划出书上重要的内容,并查清需要查的部分。做是指学生在看的过程中需要动手做的准备工作,以及做做本课后的练习题。思是指学生在看的时候要想,做到低头看书...
在工作中,不要放过任何一个小异常细节,不做任何一次小违章,精益求精地学习和参加培训,对每天工作中碰到的平安问题务必要弄懂,才能在整改后日清日高。只有我们注重细节,才能更好地预防和避免隐患的发生。 三、...
如何自学计算机专业课程是一个非常重要的问题。 首先,需要明确为什么要学习计算机专业。如果没有明确的目标,是很难坚持下去的。这个目标就会因人而异了,而我学习的目标是因为现在的工作太无聊,为了提升自己的核...
我观察了一下,一般来说有这个问题的同学有一个共性,就是在草稿纸上演算时,比较潦草,纸上经常是乱七八糟,想回过头查找一下某道题的计算过程,是很难的一件事。还有就是演算的时候不认真。建议这种同学在使用草稿...
提交代码的前提是弄懂代码的逻辑,知道语法意义,能手撕伪代码 (手撕代码更佳)。 members content LeetCode题库代码(Java&&Python) 关于题目发布,每天发布题目的人负责题目的描述,注明难度,输入输出,参考官网 ...
- 解析:“三懂”指的是懂消防基本常识、懂消防设施器材使用方法、懂逃生自救技能,而“懂补救初期火灾”是属于“组织补救初期火灾能力”的一部分。 5. **单位应通过消防宣传教育培训,使员工普遍达到“三会”。...
如果一个城市只有为数不多的咖啡馆,那么这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法...