int转string代码(mysql int转string)

从概念上讲,Java字符串就是Unicode字符序列。例如,串"JavaTM"由5个Unicode字符J、a、v、a和?。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例:

String e="";// an empty string
String greeting = "Hello";

3.6.1 子串

String类的substring方法可以从一个较大的字符串提取出一个子串。例如:

String greeting = "Hello";
String s = greeting.substring(0,3);

创建了一个由字符"Hel"组成的字符串。

substring方法的第二个参数是不想复制的第一个位置。这里要复制的位置0、1和2(从0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但不包含3。

substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a,b)的长度 为b-a。例如,子串"Hel"的长度为3-0=3

3.6.2 拼接

与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。

String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;

上述代码将"Expletivedeleted"赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)。

当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串(在第5章可以看到,任何一个Java对象都可以转换成字符串)。例如:

int age = 13;
String rating = "PG" + age;

rating设置为"PG13"。

这种特性通常用在输出语句中。例如:

System.out.println("The answer is " + answer);

这是一条合法的语句,并且将会打印出所希望的结果(因为单词is后面加了一个空格,输出时也会加上这个空格)。

3.6.3 不可变字符串

String类没有提供用于修改字符串的方法。如果希望将greeting内容修改为"Help!",不能直接地将greeting的最后两个位置的字符修改为'p'和'!'。这对于C程序员来说,将会感到无从下手。如何修改这个字符串呢?在Java中实现这项操作非常容易。首先提取需要的字符,然后再拼接上替换的字符串:

greeting=greeting.substring(0,3)+"p!";
复制代码

上面这条语句将greeting当前值修改为"Help!"。

由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如图数字3永远是数字3一样,字符串"Hello"永远包含字符H、e、l、l和o的代码单元序列,而不能修改其中任何一个字符。当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。

这样做是否会降低运行效率呢?看起来好像修改一个代码单元要比创建一个新字符串更加简洁。答案是也对,也不对。的确,通过拼接"Hel"和"p!"来创建一个新字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享

为了弄清具体的工作方式,可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同好的字符。

总而言之,Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。查看一下程序会发现:很少需要修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将源自于文件或键盘的单个字符或较短的字符串汇集成字符串。为此,Java提供了一个独立的类,在3.6.9节中详细介绍)。

C++注释:在C程序员第一次接触Java字符串的时候,常常会感到迷惑,因为他们总将字符串认为是字符型数组:

char greeting[] = "Hello";

这种认识是错误的,Java字符串更加像char*指针,

char* greeting = "Hello";

当采用另一个字符串替换greeting的时候,Java代码主要进行下列操作:

char* temp = malloc(6);

strncpy(temp,gretting,3);

strncpy(temp+3,"p!",3);

greeting = temp;

的确,现在greeting指向字符串“Help!”。即使一名最顽固的C程序员也得承认Java语法要比一连串的strncpy调用舒适得多。然而,如果将greeting赋予另外一个值又会怎样呢?

greeting = "Howdy";

这样做会不会产生内存遗漏呢?毕竟,原始字符串放置在堆中。十分幸运,Java将自动地进行垃圾回收。如果一块内存不再使用了,系统最终会将其回收。对于一名使用ANSI C++定义的string类的C++程序员,会感觉使用Java的String类型更为舒适。C++ string对象也自动地进行内存的分配与回收。内存管理是通过构造器、赋值操作和析构器显式执行的。然而,C++字符串是可修改的,也就是说,可以修改字符串中的单个字符。

3.6.4 检测字符串是否相等

可以使用equals方法检测两个字符串是否相等。对于表达式:

s.equal(t)

如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串常量。例如,下列表达式是合法的:

"Hello".equal(greeting);

要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。

"Hello".equalsIgnoreCase("hello");

一定不能使用==运算符检测字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同位置上。

String greeting = "Hello";//initialize greeting to a string
if (greeting == "Hello") ...
    //probably true
if (greeting.substring(0,3) == "Hel") ...
    //probably false
复制代码

如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的。因此,千万不要使用==运算符测试字符串的相等性,以免在程序中出现槽糕的bug。从表面上看,这种bug很像随机产生的间歇性错误 。

C++注释:对于习惯使用C++的string类的人来说,在进行相等性检测的时候一定要特别小心。C++的string类重载了==运算符以便检测字符串内容的相等性。可惜Java没有采用这种方式,它的字符串“看起来、感觉起来”与数值一样,但进行相等性测试时,其操作方式又类似于指针。语言的设计者本应该像对+那样也进行特殊处理,即重定义 == 运算符。当然,每一种语言都会存在一些不太一致的地方。C程序员从不使用 == 对字符串进行比较,而使用strcmp函数。Java的compareTo方法与strcmp完全类似,因此,可以这样使用:

if(greeting.compareTo("Hello") == 0) …

不过,使用equals看起来更为清晰。


3.6.5 空串与Null串

空串""是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:

if(str.length() == 0)

if(str.equals(""))

空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联(关于null的更多信息请参见第4章)。要检查一个字符串是否为null,要使用以下条件:

if(str==null)

有时要检查一个字符串既不是null也不是空串,这种情况下就需要使用以下条件:

if (str != null && str.length() != 0)

首先要检查str不为null。在第4章会看到,如果在一个null值上调用方法,会出现错误。

3.6.6 代码点与代码单元

Java字符串由char序列组成。从3.3.3节"char类型"已经看到,char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如:

String greeting = "Hello";
int n = greeting.length();// is 5

要想得到实际的长度,即代码点的数量,可以调用:

int cpCount = greeting.codePointCount(0,greeting.length());

调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length()-1之间。例如:

char first = greeting.charAt(0);// first is 'H'
char last = greeting.charAt(4);// last is 'o'

要想得到第i个代码点,应该使用下列语句

int index = name.offsetByCodePoints(0, i);
int cp = name.codePointAt(index);

注释:类似C与C++,Java对字符串中的代码单元和代码点从0开始计数。

为什么会对代码单元如此大惊小怪?请考虑下列语句:

int转string代码(mysql int转string)

使用Utf-16编码表示?需要两个代码单元。调用

char ch = sentence.charAt(1)

返回的不是空格,而是第二个代码单元?,?为了避免这种情况的发生,请不要使用char类型。这太低级了。

如果想要遍历一个字符串,并且依次查看每一个代码点,可以使用下列语句:

int cp = sentence.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp)) i+=2;
else i++;

可以使用下列语句实现回退操作:

i--;
if (Character.isSurrogate(name.charAt(i))) i--;
int cp = sentence.codePointAt(i);

3.6.7 字符串API

Java中的String类包含了50多个方法。令人惊讶的是绝大多数都很有用,可以设想使用的频繁非常高。下面的API注释汇总了一部分最常用的方法。

注释:可以发现,本书中给出的API注释会有助于理解Java应用程序编程接口(API)。每一个API的注释都以形如java.lang.String的类名开始。java.lang包的重要性将在第4章给予解释。类名之后是一个或多个方法的名字、解释和参数描述。在这里,一般不列出某个类的所有方法,而是选择一些使用最频繁的方法,并以简洁的方式给予描述。完整的方法列表请参看联机文档(请参看Reading the On-Line API Documentation)。这里还列出了所给类的版本号。如果某个方法是在这个版本之后添加的,就会给出一个单独的版本号。

API java.lang.string 1.0

? char charAt (int index)

返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要调用这个方法。

? int codePointAt(int index) 5.0

返回从给定位置开始或结束的代码点。

? int offsetByCodePoints(int startIndex, int cpCount) 5.0

返回从startIndex代码点开始,位移cpCount后的代码点索引。

? int compareTo(String other)

按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,

返回一个正数;如果两个字符串相等,返回0。

? boolean endsWith(String suffix)

如果字符串以suffix结尾,返回true。

? boolean equals(Object other)

如果字符串与other相等,返回true。

? boolean equalsIgnoreCase(String other)

如果字符串与other相等(忽略大小写),返回true。

? int index0f(String str)

? int index0f(String str, int fromIndex)

? int index0f(int cp)

? int index0f(int cp, int fromIndex)

返回与字符串str或代码点cp匹配的的第一个子串的开始位置。这个位置从索引0或

fromIndex开始计算。如果在原始串中不存在str,返回-1。

? int lastIndex0f(String str)

? int lastIndex0f(String str, int fromIndex)

? int lastindex0f(int cp)

? int lastindex0f(int cp, int fromIndex)

返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或

fromIndex开始计算。

? int length( )

返回字符串的长度。

? int codePointCount(int startIndex, int endIndex) 5.0

返回startIndex和endIndex-1之间的代码点数量。没有配成对的代用字符将计入代码点。

? String replace(CharSequence oldString,CharSequence newString)

返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用

String或StringBuilder对象作为CharSequence参数。

? boolean startsWith(String prefix)

如果字符串以preffix字符串开始,返回true。

? String substring(int beginIndex)

? String substring(int beginIndex, int endIndex)

返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所

有代码单元。

? String toLowerCase( )

返回一个新字符串。这个字符串将原始字符串中的所有大写字母改成了小写字母。

? String toUpperCase( )

返回一个新字符串。这个字符串将原始字符串中的所有小写字母改成了大写字母。

? String trim( )

返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。

3.6.8 阅读联机API文档

省略

3.6.9 构建字符串

有些时候,需要由较短的字符串构建字符串,例如。按键或来自文件中的单词。采用字符串连接的方式达到此目的的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空。使用StringBuilder类就可以避免这个问题的发生。

如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:

StringBuilder builder = new StringBuilder();

(有关构造器和new操作符的内容将在第4章详细介绍。)

当每次需要添加一部分内容时,就调用append方法。

builder.append(ch);// appends a single character
builder.append(str);// appends a string

在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。

String completedString = builder.toString();

注释:在JDK5.0中引入 StringBuilder类。这个类的前身是StringBuffer,其效率略微有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中(通常都是这样)编辑,则应该用StringBuilder替代它。这两个类的API是相同的。

下面的API注解包含了StringBuilder类中的重要方法。

API java.lang.StringBuilder 5.0

  • StringBuilder()

构建一个空的字符串构建器。

  • int length()

返回构建器或缓冲器中的代码单元数量。

  • StringBuilder append(String str)

追加一个字符串并返回this。

  • StringBuilder append(char c)

追加一个代码单元并返回this。

  • StringBuilder appendCodePoint(int cp)

追加一个代码点,并将其转换为一个或两个代码单元并返回this。

  • void setCharAt(int i,char c)

将第i个代码单元设置为c。

  • StringBuilder insert(int offset, String str)

在offset位置插入一个字符串并返回this。

  • StringBuilder insert(int offset, char c)

在offset位置插入一个代码单元并返回this。

  • StringBuilder delete(int startIndex,int endIndex)

删除偏移量从startIndex到-endIndex-1的代码单元并返回this。

  • String toString()

返回一个与构建器或缓冲器内容相同的字符串。

关注

作者:争渡一生
链接:https://juejin.cn/post/7098648789476458503
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

多获客
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 792114587@qq.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.dhuoke.com/8074.html