StringStringBuilderStringBuffer的四大区别解析
Posted 极品小學生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringStringBuilderStringBuffer的四大区别解析相关的知识,希望对你有一定的参考价值。
面试官问:String、StringBuilder、StringBuffer有什么区别么?
这个问题是个高频问题,所以今天从源码上进行深度刨析他们的区别。
如何回答:
从四个点出发:
1、可变/不可变类
String是不可变类。他被被final修饰,所以每一次的创建修改删除都要重新分配内存创建新的对象。
StringBuilder和StringBuffer是可变类,修改以及追加都不会创建新的对象。
2、线程安全性
String被final修饰是线程安全的
StringBuffer使用了同步锁是线程安全的
StringBuilder是线程不安全的
3、存储位置
String存储在字符串常量池中
StringBuilder和StringBuffer存放在堆中。
4、效率上
String < StringBuffer < StringBuilder
区别:
String | StringBuilder | StringBuffer | |
执行速度 | 最差 | 最高 | 其次 |
线程安全 | 线程安全 | 线程不安全 | 线程安全 |
使用场景 | 少量字符串操作 | 多线程环境下的大量操作 | 单线程环境下的大量操作 |
从上面表格可以得出的三者区别结论,下面我们分别分析下:
String
String是把数据存放在了字符串常量池中,所有的String都是常量的方式来保存的,并且它是被final修饰的所以是线程安全的。每一个String对象在被创建好后就不会再发生任何改变,如果进行值的重新指向,会在池中寻找或者创建一个新的对象。
他是支持查找不支持修改的,所以执行效率最低。
适合使用在少量字符串操作的情况下。
StringBuilder
StringBuilder是执行效率最高的,底层和StringBuffer一样通过char[]数组来实现,支持查询修改操作,效率高但是不安全
不安全:
在进行多线程处理的时候,多个线程对同一个变量进行修改查询操作的时候会出现数据的混乱,执行错误逻辑,它没有对线程安全进行考虑,是线程不安全的。
适合使用在单线程大象字符串操作情况下。
StringBuffer
StringBuffer效率虽然没有StringBuilder高,但是比String效率高的多。
效率低的原因:
在考虑线程安全的情况下,在进行字符串操作的时候使用了 synchronized 关键字的进行加锁操作来保证线程的安全性。
适合使用在多线程对多字符串操作的情况下。
在回答这个问题的适合从总结出发,重心放在线程安全的角度出发,如果要继续深入的话要从加锁往下深入。
关于Linux主流框架运维工作剖析
LINUX是开源的,这也是最主要的原因,想学Windows,Unix对不起,没有源代码。也正是因为这样,LINUX才能够像雪球一样越滚越大,发展到现在这种规模。今天将为大家带来关于Linux主流框架运维工作剖析,大家一定要认真阅读哦~
随着IT运维的不断发展,尤其的Linux的飞速发展,越来越多的企业开始使用Linux操作系统平台,例如CentOS、RedHat、Ubuntu、Fedora等等,成千上亿个网站涌现在当今互联网,互联网已经成为必不可少的工具,那今天我们跟大家一起来分享讨论目前用的最多的Linux下主流网站架构:
LVS+KEEPALIVED(heartbeat)+Squid+Nginx/Apache+java/php
+MySQL/MariaDB等,分享一个简单的拓扑图,供各位同学实验参考
一般网站总体分为四层,依次为前端负载均衡、中间代理、后端服务、数据库层。
当然除了这个整体的流程,不同的公司扩展的东西也非常多,各种系统不断的往这个架构里面添加,形成一个非常庞大、复杂的系统。那接下来我们对每个层级运维人员需要注意的细节:
1) LVS负载均衡层如下:
LVS负载均衡层主要用来抵御大流量及转发数据功能,一般基于TCP/IP 四层协议进行转发,根据不同的内部环境使用的转发方式也不一样,通常DR模式效率比较高,LVS+keepalived结合,可以使用keepalived去管理我们整个配置文件,让负责均衡变得简单实用,可以各种策划来检查后端Nginx或者Squid服务是否正常。
LVS简单工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户,对于用户来说,看不到WEB后端具体的应用。
运维人员在维护LVS中,需要密切关注LVS当前转发连接数及系统LVS日志。通过监控平台监控VIP、真实IP的情况、连接数的情况。
2) Nginx反向代理层如下:
Nginx是目前主流的高性能WEB服务器,Nginx因为非常不错的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗等优点,目前发展势头非常火爆。
Nginx主要基于7层应用,能够实现各种规则转发,反向代理我们后端的JAVA、PHP动态服务器,同时Nginx本身处理静态页面的能力官方理论并发5w/s,同时Nginx还可以作为缓存服务器存储我们静态页面缓存,性能跟squid不相上下。
作为IT运维人员在日常运维中,需要长期的关注网站的整体运行情况,分析网站瓶颈,不断优化Nginx的相关参数,并确保Nginx跟后端服务连接是否有异常等。
3) 后端服务层如下:
后端存放我们真正的网站和后台服务,通过前端Nnginx调用,后端常见的服务解析软件,如果是jsp语言的话,容器为Tomcat、Resin、Weblogic等等。
如果是PHP程序,我们就需要安装PHP环境来解析php代码,然后通过前端Nginx反向代理提供给用户访问。
在日常的运维中,需要注意后端服务层的监控,及连接数的问题,要实时关注并监控后端服务的正常,配置多实例,冗余案例。
4) 数据库层如下:
目前互联网主流数据库有Mysql、Mariadb、mongodb、Oracle等等,对于数据库是整个架构的核心层,而且数据是企业生存之本,所以数据库的架构和维护也是至关重要的。中大型的互联网公司都有自己专职的DBA人员负责Mysql的运行和维护。
对于IT运维人员在维护数据库时需要密切关注数据库并发数、连接池等变化,关注数据库主从、读写分离状态及日志的变化情况,并制定完整的备份机制完成数据库的备份,有问题及时处理。
课外知识分享:
日常生活中,我们似乎与Windows打交道更多,实际上我们也在无声无息中与Linux打交道。
Android把Linux交到全球无数移动设备消费者手中,大概这也是迄今为止Linux在主流界取得的最大成功。
Linux之所以能成为操作系统届的重要一员并日益扮演越来越重要的角色与其众多优点是分不开的。
首先,Linux是一款免费的操作系统,这一点上Linux与Windows形成鲜明对比。
Linux用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。
这是其他的操作系统所做不到的。
正是由于这一点,来自全世界的无数程序员参与了Linux的修改、
编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。
这让Linux吸收了无数程序员的精华,不断壮大。
其次,Linux可以完全兼容POSIX 1.0标准,这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。
以上是关于StringStringBuilderStringBuffer的四大区别解析的主要内容,如果未能解决你的问题,请参考以下文章