字符串入门
来源:互联网 发布:unity3d按轨迹运动 编辑:程序博客网 时间:2024/05/28 11:49
前言
字符串的操作是非常基础的东西,之前做的一些程序Demo也都频繁的使用到了字符串,发现了很多自身不足的地方,所以这个整理是有必要的。这里摘录了很多《Java语言程序设计》上的语句,主要供自己记忆混乱时可以随时查看。
先放一张说明Java数据类型的图
Java基本数据类型
这是一篇介绍Java数据类型的博文,下面开始整理String
String类型
String类型属于引用类型(reference type)。任何Java类都可以将变量表示为引用类型。使用引用类型声明的变量称为引用变量,它引用一个对象。
String sentence="Hello World!";
这里的sentence就是一个引用变量,它引用一个内容为Hello World的字符串对象。
下面列出一些String对象的简单方法,这些方法只能从一个特定的字符串实例(这里设为s)来调用:
length():返回字符串中的字符数
charAt(index):返回字符串s中指定位置的字符
contact(s1):将本字符串和字符串s1连接,返回一个新字符串
toUpperCase():返回一个新字符串,其中所有的字母大写
toLowerCase():返回一个新字符串,其中所有的字母小写
trim():返回一个新字符串,去掉了两边的空白字符
由于这些方法只能从一个特定的字符串实例来调用,这些方法称为实例方法,而非实例方法我们成为静态方法。静态方法可以不使用对象来调用。比如定义在Math类中的所有方法都是静态方法。它们没有绑定到一个特定的对象实例上。
调用一个实例方法的语法是:
reference-Variable.methodName(arguments)
一个方法可以有一个或多个参数,或者也可以无参。
调用一个静态方法的语法是:
ClassName.methodName(arguments)
String类
String对象是不可改变的。字符串一旦创建,内容不能再改变。
构造字符串
可以用字符串直接量或字符数组创建一个字符串对象。
使用如下语法,用字符串直接量创建一个字符串:
String newString=new String(stringLiteral);
参数StringLiteral是一个括在双引号内的字符序列。
由于Java将字符串直接量看作String对象,所以下面两种写法都是合法的:
String sentence=new String("Hello World!");
String sentence="Hello World!";
现在来用字符数组创建字符串。下面的语句可以构造一个字符串”Hello World!”:
char [] charArray={'H','e','l','l','o',' ','W','o','r','l','d','!'};String sentence=new String(charArray);
注:String变量存储的是对String对象的引用,String对象里存储的才是字符串值。严格来说的话,术语String变量、String对象和字符串值是不同的。但在大多数情况下会忽略它们之间的区别。
不可变字符串与限定字符串
String对象是不可变的,它的内容不能改变。比如:
String a="Apple";a="Google";
第一条语句创建了一个内容为”Apple”的String对象,并将其引用赋值给了a。
第二条语句创建了一个内容为”Google”的新String对象,并将其引用赋值给a。
但是赋值后,第一个String对象是仍然存在的,只是不能再通过a来访问它罢了,因为变量a现在指向了新的对象。
由于字符串在程序设计中是不可变的,但同时又会频繁地使用到它,所以Java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串直接量使用同一个实例。这样的实例称为限定的(interned)字符串。
举个栗子:
String s1="Hello World!";String s2=new String("Hello World!");String s3="Hello World";System.out.println("s1==s2 is "+(s1==s2));System.out.println("s1==s3 is "+(s1==s3));
运行结果会显示:
s1==s2 is falses1==s3 is true
这是因为s1和s3指向相同的限定字符串”Hello World!”,而s1和s2尽管内容相同但它们是不同的字符串对象。
字符串的替换和隔离
字符串一旦创建,它的内容就不能改变。但是String类提供了替换和分隔字符串的方法(方法replace、replaceFirst和replaceAll会返回一个源自原始字符串的新字符串,但并未改变原始字符串。):
replace(oldChar,newChar):将字符串中所有匹配的字符替换成新的字符,然后返回新的字符串。
replaceFirst(oldString,newString):将字符串中第一个匹配的子字符串替换成新的子字符串,然后返回新的字符串。
replaceAll(oldString,newString):将字符串中所有匹配的子字符串替换成新的子字符串,然后返回新的字符串。
split(String):返回一个字符串数组,其中包含被分隔符分隔的子字符串集。
例:
"Welcome".replace('e','A') //返回一个新的字符串,WAlcomA"Welcome".replaceFirst("e","AB") //返回一个新的字符串,WABlcome"Welcome".replaceAll("e","AB") //返回一个新的字符串,WABlcomAB"Welcome".replace("el","AB") //返回一个新的字符串,WABcome
split方法可以从一个指定分隔符的字符串中提取标识。例:
String[] tokens="Facebook#Linkedin#Apple#Google".split("#");for(int i=0;i<tokens.length;i++) Sytem.out.print(tokens[i]+" ");
结果为:
Facebook Linkedin Apple Google
正则表达式
直接贴教程不废话,正则表达式是世界上最帅的东西之一~
正则表达式30分钟入门教程
正则表达式语法
字符串与数组之间的转换
字符串不是数组,但是字符串可以转换成数组,反之亦然。
将字符串转换成一个字符数组可以使用toCharArray方法。
char[] chars="Java".toCharArray();
则,chars[0]是’J’,chars[1]是’a’,chars[2]是’v’,chars[3]是’a’。
还可以使用方法getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)将下标从srcBegin到srcEnd-1的子串复制到字符数组dst中下标从dstBegin开始的位置。
例如:
char [] dst={'J','A','V','A','c','u','t'};"HiBoy".getChars(2,5,dst,4);
于是dst就变成了{‘J’,’A’,’V’,’A’,’B’,’o’,’y’}
若要将一个字符数组转换成一个字符串,应该使用构造方法String(char[])或者方法valueOf(char[]):
String str=new String(new char[]{'J','a','v','a'});String str=String.valueOf(new char[]{'J','a','v','a'})
将字符和数值转换成字符串
通过Integer.parseInt(str)可以将一个字符串转换为一个int值,那么反过来也可以使用字符串的连接操作符(+)来将字符或者数字转换为字符串。
使用重载的静态valueOf方法也可以将字符和数值转换成字符串。
例如要将double值1.25转换成字符串,可以使用String.valueOf(1.25)。返回值是由字符‘1’、’.’、’2’和’5’构成的字符串。
StringBuilder和StringBuffer类
StringBuilder和StringBuffer类似于String类,区别在于String类是不可改变的。
StringBuilder/StringBuffer类比String类更灵活。我们可以给StringBuilder或StringBuffer中添加、插入或追加新的内容,但String对象一旦创建,它的值就确定了。
StringBuffer类和StringBulider类最大的区别在于StringBuffer中修改缓冲区的方法是同步的,这意味着只有一个任务被允许执行方法。
如果是多任务并发访问,就使用StringBuffer,因为这种情况下需要同步以防止StringBuffer崩溃。而如果是单任务访问,则使用StringBuilder会更有效。
参考书籍:《Java语言程序设计》| 梁勇.著 | 戴开宇.译
- 字符串入门
- 字符串入门
- PHP字符串操作入门
- 【搜索入门】搜索字符串
- python3入门之字符串
- C语言入门----字符串
- Swift入门 04字符串
- Python入门:字符串处理
- 字符串 KMP入门,讲解
- 【DP入门】回文字符串
- C++入门⑥:字符串
- Python字符串初入门
- 字符串替换(语言入门)
- python入门-字符串转换
- JNI入门二:字符串和字符串数组
- 数据结构入门小结之字符串
- Qt入门-字符串类QString
- swift入门基础知识3字符串
- centos7 配置多个Tomcat
- android自定义之 5.0 风格progressBar
- .net之gridview表中数据操作
- python中多继承的问题(比较C++的多继承)
- 各种线性筛法
- 字符串入门
- [前端] centos下搭建nodejs
- “多线程”简介及其C代码实现框架
- PhoneGap的学习第二讲-PhoneGap生命周期中的事件
- 【技巧】一些开发时能够提高开发效率的技巧
- 源码安装lua
- iOS UIScrollView简介 —— HERO博客
- linux进程间的通信机制--信号量互斥
- hihocoder算法复习之 线段树单点更新