问题一、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一下的文件使用缓存的方式性能会更好。
相关推荐
### 必须弄懂的495个C语言问题 #### 1. 声明和初始化 **1.1 如何决定使用哪种整数类型?** 在C语言中选择整数类型时,应考虑所需的范围和存储空间。常见的整数类型包括`char`、`short`、`int`、`long`以及`long ...
【标题】:“很不错的CSS学习资料,让你彻底轻松弄懂CSS” 这是一份精心整理的CSS学习资源,旨在帮助学习者全面理解并掌握CSS(层叠样式表)这一重要的前端技术。CSS是网页设计和开发不可或缺的部分,它负责定义...
【彻底弄懂CSS盒模型】 CSS盒模型是前端开发中至关重要的概念,它定义了网页元素如何占据空间和相互布局。CSS盒模型由四个部分组成:内容(content)、内边距(padding)、边框(border)和外边距(margin)。理解盒模型...
标题《一篇文章弄懂iOS证书神马的》所涉及的知识点主要包括了iOS开发中与证书、配置文件、应用ID等相关的概念以及它们之间的关系,下面详细解释这些知识点: 首先,我们来理解什么是Code Signing。代码签名(Code ...
以下是我从"学习Java必须弄懂的几个问题"这个主题中提炼出的一些重要知识点: 1. **Java基础语法**:Java是一种面向对象的语言,理解其基本语法结构至关重要。包括数据类型(如整型、浮点型、字符型和布尔型)、...
李宏毅教授的课程ppt以及转换后的pdf文档,《一天弄懂深度学习》,希望对你有所帮助。 李宏毅教授的课程ppt以及转换后的pdf文档,《一天弄懂深度学习》,希望对你有所帮助。 李宏毅教授的课程ppt以及转换后的pdf文档...
第三个问题是关于String类的不可变性。在Java中,String是不可变的,这意味着一旦创建,其内容就不能更改。例如: ```java String s = "Hello"; s = s + " world!"; ``` 在这个例子中,`s`最初指向的"Hello"对象并未...
\n\nSpring 通过三级缓存机制解决了这个问题。这三级缓存分别是 singletonObjects、earlySingletonObjects 和 singletonFactories,它们针对的是单例(Singleton)Bean。\n\n1. **singletonObjects**:这是第一级...
本文将自上而下地阐述这三个概念,以帮助初学者更好地掌握PyTorch的数据读取机制。 首先,`DataLoader`是与用户交互的主要接口,它负责从数据集中批量加载样本。在`DataLoader`的`__next__`方法中,当`num_workers`...
"让你彻底弄懂3D设计对电脑配置的一系列影响" 在本文中,我们将讨论3D设计对电脑配置的一系列影响,并解释为什么3D设计对电脑配置的影响如此重要。 首先,我们需要了解3D设计的三个阶段:建立模型、光源材质和渲染...
一文弄懂UFS协议,快速入门
"每天花5分钟的时间,弄懂一道面试题 or Js小知识"揭示了这份资源的目的,即通过每日的学习和思考,帮助用户逐步提升技能,每天进步一点点。"流年笑掷,未来可期"可能是这个学习计划的口号,鼓励持续努力,期待未来...