关于字符串构建,连接,查找

Java中关于字符串的构建、连接、查找问题

1、字符串的构建有哪些方法呢,下面将提供几种字符串的构建方法:1、String str=“abc” 2、String str=new String(“abc”);

3、StringBuffer bf=new StringBuffer(“abc”);

Buf=bf.toString;

4、StringBuilder bu=new StringBuilder(“abc”);

Bu=bu.toString;

2、关于字符串的连接方式又有哪些呢?什么样的方法才更加高效?

首先先分析一下我们最常用的字符串连接方法:

1、String str=“abc”; str+=“def”;

使用“+”符号进行连接,java中已经将这个符号重载好给我们使用,所以我们一般经常使用这个方法连接字符串。这个方法是很方便的,但是从效率方面来探讨一下这个方法又会如何呢?这里在提供一种方法作为比较. 使用String中的concat()方法连接字符串

2、str1.concat("abc");

这两个方法都可以连接字符串,那个效率更高呢?我们来看一下

在一百次连接时,时间相差不大。

在连接次数达到10万次的时候,效率相差就非常明显了。

现在再来探讨一下这两种连接方法的实现方法,先来说第一种,使用符号“+”连接。当我们使用这个方法是就会写到一下代码,

String a=“abc”;string b=“def”; a+=b;

这里开辟了多少个对象呢?不要觉得只有两个对象,其实这里开辟了三个对象,也就开辟了三个内存区域。

a内存区       b内存区                c内存区

连接的方式为将a、b内存区的数据一份一份的复制到c内存区。所以这种方法就是不断开辟内存来储存新连接成的字符串,时间复杂度为:Nx

第二种方法呢,是怎样的呢,使用String类的concat方法通常需要这样写:

String a=“abc”;string b=“def”;a=a.concat(b);

这里只开辟了两个对象,也就是开辟了两个内存,

a内存区       b内存区

这里只需要将a内存区的尾部指向b内存区的头部就可以实现两个字符串的连接,所以时间复杂度为:N  是个常数级的复杂度。所以这两种方法的效率孰高孰低就简单明了了。

下面在介绍两个不常见的字符串连接方法:

1、使用StringBuffer类

2、使用StringBuilder类

使用这两个类的字符串连接也是非常高效的,

使用StringBuffer时可以这样写,

StringBuffer bf=new StringBuffer("abc");

bf.append("abc");

String stringbf=bf.toString();

使用StringBuilder时类似的写法:

StringBuilder bu=new StringBuilder("abc");

bu.append("abc");

String stringbf=bu.toString();

StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高。关于原理这里不过多介绍。

关于字符串查找问题,话句话说就是在a字符串中判断出是否有b字符串的问题。在java中封装有几个方法供用户使用:
  1、int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的位置整数(第一个位置为0)。 
  2、int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的位置整数(第一个位置为0)。 
  3、int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的位置整数(第一个位置为0)。 
  4、int lastIndexOf(String str, int startIndex) :从指定的索引处开始向后搜索,返回在此字符串中最后一次出现的指定子字符串的位置整数(第一个位置为0)。

关于更高效的字符串查找算法可以参考一下博客:http://www.nowamagic.net/algorithm/algorithm_KmpFastStringSearch.php

时间: 2024-11-08 21:43:19

关于字符串构建,连接,查找的相关文章

C# 根据ADO.NET数据库连接字符串构建EntityFrame数据库连接字符串

为了保持开发效率,以及保持代码优雅,项目中引用了EntityFrame.但是又因为某些报表功能需要大量计算,所以又要求直接使用ADO.NET,调用存储过程进行计算. 于是乎webconfig文件中就会出现两种数据库连接字符串. <!--EntityFrame--> <connectionStrings> <add name="GpsDBEntities" connectionString="metadata=res://*/Models.DbMo

PHP中字符串的连接和换行

PHP中字符串的连接使用点,不是加号.换行\n需要用双引号括起来,不能用单引号. eg. <?php print_r("hello"."\n"); print_r("world"."\n"); print_r('hello'.'world'."\n"); ?> 结果: hello world hello world

使用strcpy和strcat实现字符串的连接

最为简单的代码方式一 首先是实现字符串的连接然后实现字符串的拷贝 #include <stdio.h> #include <string.h> int main(void) { char s[10]="abc"; char t[]="def"; char r[20]=""; strcat(s,t);         //实现字符串的连接 strcpy(r,s); //实现字符串的拷贝 printf("%s&quo

三个 编程题 :1. 回文 2. 将字符串t连接到字符串s的尾部

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

python字符串方法之查找

str.find() str.rfind() [作用:类似index,查找字符] [英语:r=>right|右边,find=>寻找] [说明:返回一个新的整数,查找到的位置,找不到出现-1,index找不到要报错] In [190]: "The stars are not afraid to appear like fireflies.".find("vition")#不存在返回-1 Out[190]: -1 In [192]: "The st

前端性能优化:字符串的连接操作改进

在web开发中,避免不了字符串连接的操作,但字符串的连接操作性能高吗? 之前有不少文章说使用加号性能低下,建议使用数组的join操作. 测试代码: var length = 300000; /*数组的 join*/ function Test1() { var date1 = new Date().getTime(); var t = []; for (var i = 0; i < length; i++) { t[i] = "name" + i; } arr.join(&quo

变量与字符串的连接 - format、格式化字符串

变量与字符串的连接 先当以如下三个变量: name = 'wwb' age = '17' job = 'study' 方法一:利用+号进行连接 >>> info1 = '''Welcome to ''' + name +''''s code kingdom ... Name:''' + name +''' ... Age:''' + age +''' ... Job:''' + job >>> print(info1) Welcome to wwb's code kin

Python修行之字符串(一):连接、切割、大小写、排版

字符串:1.是由一个个字符组成有序的序列,是字符的集合2.字符串是不可变对象3.使用单引号.双引号.三引号引住的字符序列4.python3中.字符串就是unicode类型.在2中分两种一种unicode一种非unicode字符串元素访问--下标:1.字符串支持使用索引访问2.有序的字符集合,字符序列3.是可迭代的字符串join连接:1.字符串可以拼接起来.如(重复拼接).+(两个拼接成一个新的)2.将可迭代对象连接起来.string作为分隔符3.可迭代对象本身元素应是字符串4.返回一个新字符串5

构建连接:NioSocketChannel 是什么时候激活的

构建连接:NioSocketChannel 是什么时候激活的 目录 构建连接:NioSocketChannel 是什么时候激活的 1. 主线分析 1.1 主线 1.2 知识点 2. 源码分析 2.1 接收连接 3.2 初始化连接 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 在上一节中,我们分析服务器的启动过程,接下来就是开门迎客. 1. 主线分析 1.1 主线 NioEventLoop 不断的轮询,接收 OP_ACC