`

每天弄懂三个问题(一)

阅读更多

问题一、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
分享到:
评论

相关推荐

    必须弄懂的495个C语言问题.pdf )

    ### 必须弄懂的495个C语言问题 #### 1. 声明和初始化 **1.1 如何决定使用哪种整数类型?** 在C语言中选择整数类型时,应考虑所需的范围和存储空间。常见的整数类型包括`char`、`short`、`int`、`long`以及`long ...

    很不错的CSS学习资料,让你彻底轻松弄懂CSS

    【标题】:“很不错的CSS学习资料,让你彻底轻松弄懂CSS” 这是一份精心整理的CSS学习资源,旨在帮助学习者全面理解并掌握CSS(层叠样式表)这一重要的前端技术。CSS是网页设计和开发不可或缺的部分,它负责定义...

    彻底弄懂CSS盒模型

    【彻底弄懂CSS盒模型】 CSS盒模型是前端开发中至关重要的概念,它定义了网页元素如何占据空间和相互布局。CSS盒模型由四个部分组成:内容(content)、内边距(padding)、边框(border)和外边距(margin)。理解盒模型...

    一篇文章弄懂ios证书神马的

    标题《一篇文章弄懂iOS证书神马的》所涉及的知识点主要包括了iOS开发中与证书、配置文件、应用ID等相关的概念以及它们之间的关系,下面详细解释这些知识点: 首先,我们来理解什么是Code Signing。代码签名(Code ...

    学习Java必须弄懂的几个问题

    以下是我从"学习Java必须弄懂的几个问题"这个主题中提炼出的一些重要知识点: 1. **Java基础语法**:Java是一种面向对象的语言,理解其基本语法结构至关重要。包括数据类型(如整型、浮点型、字符型和布尔型)、...

    一天弄懂深度学习-李宏毅(PPT+PDF)(超级高清)

    李宏毅教授的课程ppt以及转换后的pdf文档,《一天弄懂深度学习》,希望对你有所帮助。 李宏毅教授的课程ppt以及转换后的pdf文档,《一天弄懂深度学习》,希望对你有所帮助。 李宏毅教授的课程ppt以及转换后的pdf文档...

    每一个JAVA初学者都应该弄懂的问题.pdf

    第三个问题是关于String类的不可变性。在Java中,String是不可变的,这意味着一旦创建,其内容就不能更改。例如: ```java String s = "Hello"; s = s + " world!"; ``` 在这个例子中,`s`最初指向的"Hello"对象并未...

    画图带你彻底弄懂三级缓存和循环依赖的问题.doc

    \n\nSpring 通过三级缓存机制解决了这个问题。这三级缓存分别是 singletonObjects、earlySingletonObjects 和 singletonFactories,它们针对的是单例(Singleton)Bean。\n\n1. **singletonObjects**:这是第一级...

    一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系

    本文将自上而下地阐述这三个概念,以帮助初学者更好地掌握PyTorch的数据读取机制。 首先,`DataLoader`是与用户交互的主要接口,它负责从数据集中批量加载样本。在`DataLoader`的`__next__`方法中,当`num_workers`...

    让你彻底弄懂3D设计对电脑配置的一系列影响.pdf

    "让你彻底弄懂3D设计对电脑配置的一系列影响" 在本文中,我们将讨论3D设计对电脑配置的一系列影响,并解释为什么3D设计对电脑配置的影响如此重要。 首先,我们需要了解3D设计的三个阶段:建立模型、光源材质和渲染...

    一文弄懂UFS协议,快速入门

    一文弄懂UFS协议,快速入门

    考试类精品--️每天花5分钟的时间,弄懂一道面试题 or Js小知识 来鞭策自己学习思考,每天进步一点,流年笑掷,未.zip

    "每天花5分钟的时间,弄懂一道面试题 or Js小知识"揭示了这份资源的目的,即通过每日的学习和思考,帮助用户逐步提升技能,每天进步一点点。"流年笑掷,未来可期"可能是这个学习计划的口号,鼓励持续努力,期待未来...

Global site tag (gtag.js) - Google Analytics