`

每天弄懂三个问题(一)

阅读更多

问题一、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一下的文件使用缓存的方式性能会更好。

 

 

  

 

 

0
0
分享到:
评论

相关推荐

    10月自考本科临时抱佛脚秘籍.docx

    考试前三五天要全面检查一次复习内容,集中把学科的重点、难点弄懂。 秘籍五:忌急忌躁,始终保持好心态。自考是一个持久战,要培养一个好的学习习惯和自主思考的能力,要学会去分析这个题是在考哪个知识点,每个题...

    JAVA自学之路

    提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。 纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 ...

    高中知识的预习方法.doc

    预习需要看、做、思三个方面结合。看是指学生阅读新课,勾划出书上重要的内容,并查清需要查的部分。做是指学生在看的过程中需要动手做的准备工作,以及做做本课后的练习题。思是指学生在看的时候要想,做到低头看书...

    隐患排查心得体会.doc

    在工作中,不要放过任何一个小异常细节,不做任何一次小违章,精益求精地学习和参加培训,对每天工作中碰到的平安问题务必要弄懂,才能在整改后日清日高。只有我们注重细节,才能更好地预防和避免隐患的发生。 三、...

    计算机专业如何自学.pdf

    如何自学计算机专业课程是一个非常重要的问题。 首先,需要明确为什么要学习计算机专业。如果没有明确的目标,是很难坚持下去的。这个目标就会因人而异了,而我学习的目标是因为现在的工作太无聊,为了提升自己的核...

    考研数学150分是这样练成的

    我观察了一下,一般来说有这个问题的同学有一个共性,就是在草稿纸上演算时,比较潦草,纸上经常是乱七八糟,想回过头查找一下某道题的计算过程,是很难的一件事。还有就是演算的时候不认真。建议这种同学在使用草稿...

    leetcode题库-construct_elephant:力扣(Java&&Python)

    提交代码的前提是弄懂代码的逻辑,知道语法意义,能手撕伪代码 (手撕代码更佳)。 members content LeetCode题库代码(Java&&Python) 关于题目发布,每天发布题目的人负责题目的描述,注明难度,输入输出,参考官网 ...

    消防安全“四个能力”知识测试-安全教育-安全试题-消防.docx

    - 解析:“三懂”指的是懂消防基本常识、懂消防设施器材使用方法、懂逃生自救技能,而“懂补救初期火灾”是属于“组织补救初期火灾能力”的一部分。 5. **单位应通过消防宣传教育培训,使员工普遍达到“三会”。...

    算法的力量 李开复

    如果一个城市只有为数不多的咖啡馆,那么这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法...

Global site tag (gtag.js) - Google Analytics