String系列简介
2015-08-16 20:44
507 查看
一、概述
查看Java源码可以发现String类是final类型,也就是说String是不可以被继承的。字符串是一种特殊的对象,一旦被初始化就不可以被改变,程序中"abc"这种形式其实就是在内存中创建了一个字符串对象,可以使用
String s = "abc";的方式创建一个字符串对象。也可以是用
String s = new String("abc");的方式创建一个字符串对象,但是两者之间的不同之处在于前者在内存中只创建了一个对象,而后者在内存创建了两个对象,通常使用前者来创建字符串对象。还有一点值得说明的是
String s = new String();字符串的默认构造函数其实是创建了一个空的字符串,也就是说和
String s = "";效果等同。
下面通过一个简单的例子,说明一下
String对象在内存的存储情况。
String s1 = "abc"; String s2 = new String("abc"); String s3 = "abc"; System.out.print((s1==s2)+"/"+(s1==s3));
上面的程序段的输出结果是:
false/true
程序在执行创建
s1时,会在内存中建立一块区域存放
"abc",并将
s1指向这块区域的地址;在创建
s2时,会在内存中创建两个区域,但是
"abc"区域已经存在,不会再次创建了;在创建
s3时,
“abc”已经在内存中存在,也不会再次创建。
java中
String对象其实使用的是设计模式中的享元模式,对相同的字符串内容进行共享。
二、String的常见功能
获取功能
1、int length()获取字符串的长度。
2、
char charAt(int index)获取字符index下标位置的字符。
3、
int indexOf(int ch)获取字符串中第一次出现ch的位置,没有找到返回-1。
4、
int indexOf(int ch, int fromIndex)从fromIndex位置开始获取ch的位置(这时的位置还是从头开始算的),没有找到返回-1。
5、
int indexOf(String str)获取字符串中第一次出现str的位置,没有找到返回-1。
6、
int lastIndexOf(int ch)获取最后一次出现ch的位置,没有找到返回-1。
7、
int lastIndexOf(int ch, int fromIndex)从fromIndex位置开始获取ch最后一次出现的位置(这时的位置还是从头开始算的),没有找到返回-1。
8、
int lastIndexOf(String str)获取字符串中最后一次出现str的位置,没有找到返回-1。
判断
1、boolean contains(CharSequence chs)判断chs(可以是字符串)是否在字符串中出现过。
2、
boolean isEmpty()是否为空,和
length() == 0等效。
3、
boolean startsWith(String str)是否以
str开头。
4、
boolean endsWith(String str)是否以
str结尾。
5、
boolean equals(String str)是否和str内容相同。
6、
boolean equalsIgnoreCase(String str)忽略大小写判断是否内容相同。
转换
1、new String(char[] chs)构造函数,将
char数组
chs装换为字符串。
2、
new String(char[] chs, int offset, int count)构造函数,将
char数组
chs中从下标
offset开始的
count个字符转换为字符串。
3、
static String copyValueOf(char[] chs)功能是根据
char数组
chs返回转换后的字符串。
4、
static String copyValueOf(char[] chs, int offset, int count)功能是根据
char数组
chs中从下标
offset开始的
count个字符转换为字符串。
5、
static String valueOf(char[] chs)和
copyValueOf(char[] chs)功能一样。
6、
static String valueOf(int v)/static String valueOf(long v)/...将其他类型变量转换为字符串类型。
7、
char[] toCharArray()是字符串转换为字符数组。
8、
byte[] getBytes()将字符串转换为字节数组。
其他常用函数
1、String replace(char oldChar, char newChar)将
oldChar替换为
newChar然后返回替换过的字符串。
2、
String replace(CharSequence target, CharSequence replacement)将
target替换为
replacement并返回替换过的字符串。
3、
String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。
4、
String substring(int begin)获取
begin位置开始到末尾的字符串子串。
5、
String substring(int begin, int end)获取
[begin, end)端的字符串子串。
6、
String toUpperCase()转换为大写字符串。
7、
String toLowerCase()转换为小写字符串。
8、
String trim()去除首尾多余空格。
9、
int compareTo(String str)和
str比较,如果小于返回负数,如果等于返回0,如果大于返回正数。字符串的大小是按照字典序为准。
三、String应用示例
1、模拟trim()功能,功能很简单,就是去除首尾的连续空格即可,注意没有空格和全是空格以及空串的情况,示例代码如下:
public String myTrim(String str) { int start = 0, end = str.length()-1; while(start <= end && str.charAt(start) == ' ') start ++; while(start <= end && str.charAt(end) == ' ') end --; return str.substring(start, end+1); }
2、将字符串反转,即将
"abcde"变为
"edcba",具体步骤是首先将字符串转为字符数组,然后将字符数组翻转,最后将字符数组构造出字符串。示例代码如下:
public String myReverse(String str) { char[] chs = str.toCharArray(); for(int start=0, end=chs.length-1; start < end; start++, end--) { char temp = chs[start]; chs[start] = chs[end]; chs[end] = temp; } return new String(chs); }
3、计算
"abkkcdkkefkkskk"其中
kk出现的次数?利用
indexOf(String, int)方法,即可完成查找字串出现次数的功能。示例代码如下:
public int myCount(String str, String substr) { int count = 0, index = 0; while((index=str.indexOf(substr, index))!=-1) { index += substr.length(); count ++; } return count; }
4、取两个字符串的最长公共子串。
public String myMaxSubstring(String s1, String s2) { for(int i=0; i<s2.length(); i++) { for(int j=0,k=s2.length()-i; k!=s2.length()+1; j++,k++) { String temp = s2.substring(j, k); if(s1.contains(temp)) { return temp; } } } return ""; }
四、StringBuffer
使用介绍
为解决String的不可改变的弊端,出现了
StringBuffer类,
StringBuffer的特点是:长度可变,可以操纵多个数据类型,如使用
append功能添加整数型,浮点型,字符型,布尔型等数据,最终可使用
toString()方法返回
String类型。
StringBuffer也是
final类型的类。
添加功能
1、StringBuffer append(对象),这里可以添加一般类型的对象,如整数型、浮点型、布尔型等。最后返回
StringBuffer本身,也就是
this指针,这种方式称为方法调用链。
2、
StringBuffer insert(int offset, 对象)可以在指定位置插入数据对象,该位置之后的数据顺延。
修改功能
1、StringBuffer replace(int start, int end, String str)将
[start, end)段替换为
str。
2、
void setCharAt(int index, char ch)将
index位置的字符修改为
ch。
3、
StringBuffer reverse()将字符串反转。
删除功能
1、StringBuffer delete(int start, int end)删除
[start, end)段的字符内容。
2、
StingBuffer deleteCharAt(int index, char ch)删除
index位置的字符。
3、
delete(0, str.length())可以用于清空缓冲区。
其他功能
1、void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将
StringBuffer中
[srcBegin, srcEnd)段内容存放在
dst的
dstBegin可是的位置内。
五、StringBuilder
StringBuilder和
StringBuffer有兼容的API。出现在JDK1.5版本中。与
StringBuffer最大的不同之处在于
StringBuilder是非线程同步,而
StringBuffer是线程同步的。
所以在单线程中一般都是用
StringBuilder,因为其速度快。多线程时也可以使用
StringBuilder,但是需要加锁。
六、基本数据类型对象包装类
基本数据类型 | 类 | 基本数据类型 | 类 |
---|---|---|---|
byte | Byte | float | Float |
short | Short | double | Double |
int | Integer | char | Character |
long | Long | boolean | Boolean |
基本数据类转字符串
基本数据类型转字符串有一下方式:基本数据类型+""; 或者 String.valueOf(); 或者 Integer.toString();等
字符串转为基本数据类型有如下示例:
Integer.parseInt("123"); // "123"转为123 Long.parseLong("111"); // "111"转为111的长整型 Boolean.parseBoolean("true"); // "true"转为true Integer.parseInt("3c", 16); //按照16进制将"3c"转为整数,也就是60
Character没有
parseCharacter方法。
七、基本数据类型对象包装类的新特性
JDK1.5版本出现的新特性,即对象可以和数值之间直接运算。如下:Integer x = 4; // 直接将4赋值给整型对象x,称为自动装箱,等同new Integer(4) x = x + 2; //直接运算,x + 2自动拆箱,然后再将和自动装箱,并赋值给x x = new Integer(x.intValue() + 2); //x = x + 2的具体过程。
Integer会比
int多一个值便是
null。还有些如下特点:
Integer m = 128, n = 128; Integer a = 127, b = 127; System.out.println(m == n); System.out.println(a == b);
结果如下,原因是当Integer的值的范围在byte类型范围内时,如果内存中已经存在了值,便不会再创建Integer对象,而是直接指向已存在的区域。
false true
相关文章推荐
- 浅析Spring事务传播行为和隔离级别
- poj 3683 2-sat
- TCP/IP详解 卷I:协议 のFAQ
- 不用js实现背景图片的切换
- getline(),cin.getline(),cin.get()区别
- Python 初学(2)
- [leetcode]Merge k Sorted Lists
- LIS-Program E
- Java操作Oracle数据库自建工具库
- 使用css保持一定宽高比例
- leetcode - String to Integer (atoi)
- 动态规划——B 最大高度问题
- 贪心+模拟 ZOJ 3829 Known Notation
- 剑指offer 算法(栈和队列 查找和排序)
- oracle10g安装时报"无法确定主机的IP地址时产生异常错误"
- 【LeetCode]1.Two Sum
- iOS UI 视图移动及缩放
- SQL中常用的数据类型及简介
- HW--自守数
- linux下进程的最大线程数、进程最大数、进程打开的文件数