深入源码剖析String,StringBuilder,StringBuffer

【String,StringBuffer,StringBulider】


 

深入源码剖析String,StringBuilder,StringBuffer

 

【作者:高瑞林】

【博客地址】http://www.cnblogs.com/grl214 

 

写给读者的话

 

 ------亲爱的读者感谢您对小编的支持,当我正值青春的年纪里,很高兴能结识了一群花样年华的你们。当幸福像花儿一样盛开,请允许我记住在花季里始终如一关注我的你谢谢您一直在路上!让我们一起带着欢乐走进Java的世界!

目录

 

  • 概述
  • 从实际出发谈论String,StringBuffer,StringBuilder诞生背景
  • 深入源码进行分析
  • 总结
一.概述

   首先聊一下String,String表示的是字符串,在String的源码中存在如下:

1 public final class String
2     implements java.io.Serializable, Comparable<String>, CharSequence {
3     /** The value is used for character storage. */
4     private final char value[];

  由于字符串是由若干个字符线性组成,在java中所有的字符串都可以用数组的形式来存储,由于所声明的数组类型加了final,以至于String成为了一个不可变的字符序列,而在实际的问题中都存在需要字符串变动的情况,针对这一情况,引入了StringBuilder,和StringBuffer,其中StringBuilder是在jdk1.5之后增加的.

二.从实际出发谈论String,StringBuffer,StringBuilder诞生背景

   在实际的编程应用,我们经常会涉及到对字符串的一个操作,例如:(增加,删除,截取,替换...),jdk1.0诞生那时String类是一个封装字符串不可变的,所以在那时只能通过建立临时字符串变量,来对字符串进行增加,删除,截取,替换...,这样的做法使得我们操作的只是临时字符串,而真正的字符串却没有任何变动。既然String是封装不可变数组,那么也得有封装可变数组,就这样StringBuffer诞生了,而且还是线程安全的,由于这种线程安全的StringBuffer在非线程下效率很低,所有jdk1.5之后StringBuilder诞生了,StringBuilder是非线程安全可变字符串类,相比StringBuffer效率很高!

三.深入源码进行分析

  1、StringBuilder和StringBuffer类的关键源码分析:

1 public final class StringBuilder
2     extends AbstractStringBuilder
3     implements java.io.Serializable, CharSequence
4 {
 
 
1 abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
2 char[] value;

 从中可以看出StringBuilder和StringBuffer都继承抽象类AbstractStringBuilder ,所以AbstractStringBuilder 也是它俩共同的父类,并且在父类中声明的数组也是可变的。

2.StringBuilder和StringBuffer默认值问题

 1 public final class StringBuilder
 2     extends AbstractStringBuilder
 3     implements java.io.Serializable, CharSequence
 4 {
 5 
 6     /** use serialVersionUID for interoperability */
 7     static final long serialVersionUID = 4383685877147921099L;
 8 
 9     /**
10      * Constructs a string builder with no characters in it and an
11      * initial capacity of 16 characters.
12      */
13     public StringBuilder() {
14         super(16);
15     }
16 
17     /**
18      * Constructs a string builder with no characters in it and an
19      * initial capacity specified by the <code>capacity</code> argument.
20      *
21      * @param      capacity  the initial capacity.
22      * @throws     NegativeArraySizeException  if the <code>capacity</code>
23      *               argument is less than <code>0</code>.
24      */
25     public StringBuilder(int capacity) {
26         super(capacity);
27     }

从中可以看出,可变数组的长度大小默认是16,所以如果当长度的大小超过默认值,又会发生什么呢?请看下面代码: 

 1 private void ensureCapacityInternal(int minimumCapacity) {
 2         // overflow-conscious code
 3         if (minimumCapacity - value.length > 0)
 4            //调用下面的expandCapacity方法实现“扩容”特性
 5             expandCapacity(minimumCapacity);
 6     }
 7 
 8    /**
 9      * This implements the expansion semantics of ensureCapacity with no
10      * size check or synchronization.
11      */
12     void expandCapacity(int minimumCapacity) {
13        //“扩展”的数组长度是按“扩展”前数组长度的2倍再加上2 byte的规则来扩展
14         int newCapacity = value.length * 2 + 2;
15         if (newCapacity - minimumCapacity < 0)
16             newCapacity = minimumCapacity;
17         if (newCapacity < 0) {
18             if (minimumCapacity < 0) // overflow
19                 throw new OutOfMemoryError();
20             newCapacity = Integer.MAX_VALUE;
21         }
22         //将value变量指向Arrays返回的新的char[]对象,从而达到“扩容”的特性
23         value = Arrays.copyOf(value, newCapacity);
24     }

从上述代码中可以看出当实际数组长度超过默认值时会自动进行扩容,具体是原有数组长度的两倍加2,再不够,再进行扩容!

四.总结

1.并不是任何情况下StringBuilder都一定比String效率高,例如:

  效率:String>StringBuffer

 String str="my"+"name"+"is"; 
 StringBuffer Sb = new StringBuilder(“my”).append(“ name”).append(“ is”);

  效率:StringBuffer>String

 String S2 = “my name is”;
  String S3 = “ gaoruilin”;
  String S4 = “ test”;
  String S1 = S2 +S3 + S4;

。。。。。。希望这次分享能给读者带来技术上的巩固,谢谢观看!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值