Java字符串
来源:互联网 发布:ios java 编辑:程序博客网 时间:2024/06/05 06:52
一 概念
字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。String类适用于描述字符事物,那么它就提供了多个方法对字符串进行操作。那么常见的操作有哪些?字符串常见操作:
1 String类构造函数
String(byte[ ] bytes)//通过byte数组构造字符串对象。
String(char[ ] value)//通过char数组构造字符串对象。
String(String str)//构造一个str的副本。即:拷贝一个str。
String(StringBuffer buffer)//通过StringBuffer数组构造字符串对象。
例如:
byte[] b = {'a','b','c','d','e','f','g','h','i','j'};
char[] c = {'0','1','2','3','4','5','6','7','8','9'};
String s1 = new String(b);//abcdefghij
String s2 = new String(b,3,2);//de
String s3 = new String(c);//0123456789
String s4 = new String(c,3,2);//34
String s5 = new String(sb);//abcdefghij
System.out.println("s1:"+s1);
System.out.println("s2:"+s2);
System.out.println("s3:"+s3);
System.out.println("s4:"+s4);
System.out.println("s5:"+s5);
输出结果:s1:abcdefghij
s2_sub:de
s3:0123456789
s4_sub:34
s5_copy:abcdefghij
1)字符串中的包含的字符数,也就是字符串的长度
2)根据位置获取位置上某个字符Char charAt(int index)
3)根据字符获取该字符在字符串中的位置:
int indexOf(int ch,int fromIndex);//从fromIndex指定位置开始,获取ch在字符串中出现的位置int indexOf(String str);//返回的是str在字符串中第一次出现的位置int indexOf(String str,int fromIndex)//从fromIndex指定的位置开始,获取str在字符串中出现的位置int lastIndexOf(int ch);获取ch在字符串中最后出现的位置
3 判断
1)字符串中是否包含某一个子串。boolean contains(String str)
另外一种判断方法:indexOf(String str);可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在,所以也可以用于对指定判断是否包含。
例: if(str.indexOf("a")!=-1);//而且该方法既可以判断,又可以获取出现的位置。
2)字符中是否有内容:
boolean isEmpty();//其实就是判断长度是否为0
3)字符串是否已指定内容开头
boolean startsWith(String str)
4)字符串是否以指定内容结尾。
boolean endsWith(String str);
5)判断字符串内容是否相同。复写了Object类中的equals方法。
boolean equals(String str);
6)判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
4 转换:
1)将字符数组转换成字符串。构造函数:
String(Char[ ] value)String(Char[ ] value,int offset,int count)//将字符数组中的一部分转成字符串
注意:字符串和字节数组在转换过程中,是可以指定编码表的。
5 替换
Stirng replace(Char oldchar)
6 切割
split(regex)
7 子串
获取字符串中的一部分String subString(int begin)
String subString(int begin,int end)
8 转换,去除空格 比较
1)将字符串转换成大写或者小写String toUpperCase()
String toLowerCase()
2)将字符串两端的多个空格去除
String trim()
3)对字符串进行自然顺序比较
int compareTo()
提示:功能尽量独立出来(写成一个方法)变成一个小的函数,它被调用就可以被其他很多的方法调用。
9 返回一个字符数组或字节数组
toCharArray()//是String类都有的toString方法
getBytes()//该方法返回一个用某字符集将此String解码为byte数组
10 String类中的toString()方法与ByteArrayStream类中的toString()方法的区别
String类与ByteArrayStream类都有toString()方法,它们之间的区别:
String类的toString()方法是返回对象本身。
ByteArrayStream类的toString()方法是使用某编码表,通过解码字节返回一个字符串。
练习:将字符串反转
思路:1.将字符串变成数组
2.对数组反转
3.将数组变成字符串
public class Test {public static void main(String args[]){System.out.println(reverseString("一二三四五六七"));}public static String reverseString(String s) {char[] chs = s.toCharArray();reverse(chs);return new String(chs);}private static void reverse(char[] arr) {// TODO Auto-generated method stubfor (int start = 0, end = arr.length - 1; start < end; start++, end--) {swap(arr, start, end);}}private static void swap(char[] arr, int start, int end) {// TODO Auto-generated method stubchar tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;}}打印结果为:
七六五四三二一
二 字符串在内存中的对象个数
String s1="abc"
String s2=new String("abc");
问:s1和s2之间有什么区别
答:s1在内存中有一个对象,s1是一个类型变量,"abc"是一个对象,字符串最大的特点:一旦被初始化就不可以被改变(不是指s1不可以被改变)。s2在内存中有两个对象(new是一个,”abc”是一个)。
1 基本类型转化成字符串有三种方法
1) 使用String的valueOf方法2) 将基本数据类型封装为对象,再调用对象的toString方法
3) 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串。
2 字符串转换成基本类型有两个方法
1) 调用基本类型封装类的parseXxx静态方法。2) 用字符串构造基本类型的封装对象,再调用封装对象的xxxValue方法。
例子程序如下:
package com.kid.string;public class BasicTypeToString {public String int2str(int n) { //3种转换方法实现转换 //第一种 //return new Integer(n).toString(); //第二种,注意""中间没有空格 //return "" + n; //第三种 return String.valueOf(n); } public int str2int(String str) { //2种方法实现转换 //第一种 //return new Integer(str).intValue(); //第二种 return Integer.parseInt(str); } public String double2str(double d) { //return new Double(d).toString(); //return "" + d; return String.valueOf(d); } public double str2double(String str) { //return new Double(str).doubleValue(); return Double.parseDouble(str); } //其他基本类型与字符串相互转化这里不一一列出,方法都类似 public static void main(String[] args) { BasicTypeToString test = new BasicTypeToString(); int n = 123; String str1 = test.int2str(n); System.out.println("test.int2str(n) = " + str1); System.out.println("test.str2int(str) = " + test.str2int(str1)); double d = 12.345; String str2 = test.double2str(d); System.out.println("test.double2str(d) = " + str2); System.out.println("test.str2double(str) = " + test.str2double(str2)); }}打印结果为:
test.int2str(n) = 123test.str2int(str) = 123test.double2str(d) = 12.345test.str2double(str) = 12.345
四 StringBuffer与StringBuilder类
1.StringBuffer:
是一个容器,特点:
1)长度是可以变化的
2)可以字节操作多个数据类型
3)最终会通过toString方法变成字符串
存储:
StringBuffer append();//将指定数据作为参数添加到已有数据结尾处StringBuffer insert(intdex,数据)//可以将数据插入待指定index位置。
删除:
StringBuffer delete(int start,int end)//删除缓冲区中的数据,包含start,不包含endStringBuffer deleteCharAt( int index)//删除指定位置的字符
获取:
Char charAt(int index)int indexOf(String str)int lastIndexOf(String str)int length()String subString(int start,int end)
修改:
StringBuffer replace(int start,int end,String)void setCharAt(int index,char ch)
反转:
StringBuffer reverse(String str)
将缓冲区中指定数据存储到指定字符数组:
void getChars(int srcBegin,int srcEnd,char[] dest,int destBegin)
2.StringBuilder
JDK1.5版本之后出现了StringBuilder
StringBuffer是线程同步的
StringBuilder是线程不同步的
以后开发建议使用StringBuidder
StringBuilder的方法基本和StringBuffer一样。
JDK升级的三个主要因素:
1.提高效率 2.简化书写 3.提高安全性
五 字符编码集
主要的字符编码集 ASCII utf-8 Unicode(UTF-16) gbk gb2312 ISO8859-1之间的区别和特点:ASCII: 美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值。
UTF-8:是基于unicode的 国际化的场合适合使用,为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
Unicode(UTF-16):如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
gb2312:是国标码 出现的较早 主要用于编解码常用汉字
gbk:gb2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
ISO8859-1:ISO/IEC8859-1,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用变音符号的拉丁字母语言使用。(印象中tomcat使用的是此字符集编码和解码)。
六 关于字符编码集的经典“联通问题”
“联通”问题:记事本中输入“联通”二字默认使用ANSI(GB系列)编码GB中联通对应的字节为:联:1100000110101010 ;通:1100110110101000.
当保存再打开时,记事本读到:110x xxxx 10xxxxxx 会以为“联”与“通”都是用UTF-8编码故用UTF-8译码再将其译为对应的unicode 联:0000 0000 0110 1010 对应0x006A 通:0000 001101 10 1000对应0f0368
0x006A这个Unicode编码值位于\u0001-\u007E之间,若要转换为UTF-8编码,显然只能用于一个字节进行编码(实际上“联”用了两个字节编码),因此“联”的GBK编码“C1AA”虽然特征上貌似UTF-8编码,但它却不对应任何一个UTF-8编码。接着0x0386这个Unicode编码值,这个值对应了一个乱码字符,这也是在记事本上看到的内容。
- java字符串--修改字符串
- java 字符串,字符串缓冲区
- java 字符串,字符串缓冲区
- java字符串
- Java字符串
- Java字符串
- Java字符串
- java字符串
- JAVA 字符串
- Java 字符串
- java-字符串
- Java - 字符串
- java 字符串
- java字符串
- java字符串
- java字符串
- java---字符串
- java字符串
- 日本票房:《浪客》四连冠《蜩之记》居亚
- 码分多址(CDMA)的本质-正交之美
- 织梦DedeCMS网站源代码分析详解
- STL 概述
- Python基础06 循环
- Java字符串
- distcp导致个别datanode节点数据存储严重不均衡分析
- MyEclipse开发andriod环境搭建
- <string>头文件
- 大话数据结构
- Python基础07 函数
- Oracle中dual表的用途介绍
- 牛顿插值法 C语言版算法
- 第七周项目三—正差值的输出