java基础 ---字符和字符串
来源:互联网 发布:画晶体结构的软件 编辑:程序博客网 时间:2024/05/21 22:43
java基础 ---字符和字符串
一、char(字符)
在java中,有基本字符类型char和他的封装类型Character。在java中,所有的基本类型数据都有其相应的封装类型。比如说,整型int的封装类型是Integer、双精度浮点数double的封装类型是Double等等。
ASCII(American Standard Code for Information Interchange)
是美国对于信息交换的标准代码,这个种字符码我们以前在C语言也接触到过,不过由于它最多只有255个字符集,而在我们亚洲这种使用的是双字节字符语言的国家来说,显然是不够的,因此Unicode(Unicode Worldwide Character Standard)出现了。
Unicode
Unicode(联合码)是一个大字符集,ASCII字符集是它的一个子集。在JAVA中字符都是使用的这种16位的字符集。
在不同的系统或者软件中也可能采用了不同的编码字符集,并没有形成统一,因此在不同的字符编码环境中使用软件就会出现乱码。比较常见的字符集还有:
GBK:大简体中文字符集
GB2312:简体中文字符集
Big5:繁体中文字符集
ISO8859_1:微软浏览器中所使用的编码
UTF-8:这个就是我们的Java中所使用的编码字符集。
二、String(字符串)
在java中,有两种字符串类可以使用。String 和 StringBuffer。这两者的区别在于String类的字符串对象一旦创建了之后就不能再对他进行改变。而当你试图改变他时,其实只是在堆里重新又创建了个对象而已,而原来的对象则被遗弃了。(也许他会被垃圾回收器回收,也许永远也不会,那么就一直停留在内存里,占据内存空间。)比如:
String s = new String("java");
s = s + "language";
看起来好像是将"language"加在原来s所指向字符串的后面,但是其实是又创建了个新的字符串对象,然后s重新指向它。
创建字符串对象除了上面的方式外,还有一种使用字符串常量。
String s = "java";
这种方式建立的字符串对象是程序在被编译时,编译器在内存的静态常量区建立了一个"java"字符串常量。然后定义了一个String类的引用变量指向它。
字符串的比较
== 比较
==比较的是引用变量中的内存地址,比如
String s1 = new String("java");
String s2 = new String("java");
s1 == s2 则返回的结果为false。因为此时s1和s2所指向的是不同的地址,因此他们二者是不相等的。这个与对象内具体的值无关。下面我们在看看使用常量字符串时的比较结果:
String s1 = "java";
String s2 = "java";
我们可以看到此时的s1 == s2返回的结果就是true了。这是因为当第一次"java"这个字符串在内存常量池中建立后,如果在后面又定义了与它相同的字符串常量的话,那么编译器会自动将引用都指向同一个常量字符串,这样可以节省内存空间。现在s1和s2是指向同一个地址,因此他们是相等的。
equals比较
equals能够比较两个对象中具体的值是否相等。比如上面的s1和s2就可以用s1.equals(s2)来比较他们里面的字符串是否相等了,为true则相等,false不相等。
compareTo比较
s1.compareTo(s2)
用这个方法比较有3种返回值,当s1小于s2时返回负数,如果s1等于s2时,返回0,s1大于s2时,返回正数。
StringBuffer类
刚才提到,String 类建立的字符串对象中途是不能被改变的,只会不断的重新创建新的String对象,如果当程序中需要大量操作字符串时,显然使用String类就会对程序的性能造成很大的影响。因此java又提供了个StringBuffer类,使用它就可以改变其中的字符串而不会重新再创建新的对象。这个类的使用方法基本上和String类很相似。
并且他们之间也可以通过构造器进行相互转化。他比String 类多了apend()和insert()方法,用于将新的字符串增加或者插入到原来那个字符串中,相当于我们之使用的+号。但是在StringBuffer的对象里,是不允许使用+号来连接字符串的。只能使用apend()或者insert()方法来添加字符串,其他的还有delete()删除指定索引号的字符串。
StringBuilder类
这个类和StringBuffer用法是一样的,只是当使用单线程的时候建议使用StringBuilder,因为他的执行速度比StringBuffer快。而多线程使用它是不安全的,这时就需要使用StringBuffer。
字符串的分割
今天课堂上,老师给我们布置了个小练习。据说其他部的一个同学在一次面试时遇到的一个题目。这个题的原型是将一个文件中连续的字符串读出,然后将他们写在一个只有2个字段的数据库中,并且按照第一个字段存储3个字节,第二个字段存储5个字节,这样的规律直到将文件中的字符串全部存储完。其实这个题最核心的算法就是如何分割字符串这一部分。我们就是只需要将分割这块通过代码来完成。下面是代码的具体实现。
String str = "123456789abcdefghijklmnopqrstuvwxyz";
//循环控制标记。当为false循环3次,为true时循环5次,这样就能够先分割3个字符,然后分割5个字符。又继续分割3个字符,依次这样循环下去。
boolean flag = false;
//当字符串引用变量中没有字符串,再使用charAt和substring这个方法就会包抛出StringIndexOutOfBoundsException异常,因此需要对他进行异常捕获。这个也可作为我们循环结束的条件。
try{
while(true){
if(!flag)
{
for(int i = 0;i < 3;i++)
{
System.out.print(str.charAt(i));
}
System.out.print(" ");
flag = true;
//将提取出来的字符串从原字符串中去掉。
str = str.substring(3);
}
if(flag)
{
for(int i = 0;i < 5;i++)
{
System.out.print(str.charAt(i));
}
System.out.print(" ");
flag = false;
str = str.substring(5);
}
}
}
catch(StringIndexOutOfBoundsException e){}
我们还可以用StringBuffer来做。
boolean flag = false;
try{
while(true){
if(!flag)
{
for(int i = 0;i < 3;i++)
{
System.out.print(str.charAt(i));
}
System.out.print(" ");
flag = true;
//这里稍微有点不同,因为我们不使用String所以就不能用subString()方法,它返回的是个新的String对象。这里我们可以使用StringBuffer类的delete()方法,也可以达到同样的目的,并且这种方式更加高效。
str.delete(0, 3);
}
if(flag)
{
for(int i = 0;i < 5;i++)
{
System.out.print(str.charAt(i));
}
System.out.print(" ");
flag = false;
str.delete(0, 5);
}
}
}
catch(StringIndexOutOfBoundsException e){}
三、正则表达式
正则表达式也是我们非常常用的。当正则表达式用的很熟练的时候,能够减轻我们的代码量。比如检验用户输入的有效性,用正则表达式就非常适用。我用正则表达式的时候还是很多的。无论在什么地方,只要涉及到对字符串的检验,我首先都会考虑到正则表达式,如果实在不行才考虑到if-else。比如在寒假的那个作业中,查询功能我就是全部用正则表达式来做的,可以很容易的实现数据的模糊查找,这个是if-else很难办到的,即使能够那也是要付出相当高的代价。还有比如电子邮件等等,用正则表达式也是非常轻松就可以实现的。
正则表达式常用的有两种写法。一个是通过String类中的matches()方法,第二个通过util包中Pattern这个类来建立正则表达式对象,两个方法效果是一样的。比如:
//下面正则表达式是检查电子邮件的有效性
private static final String PATTERN = "//S*//w+@[0-9A-Za-z]+//.//w+[//w//.]*[0-9a-zA-Z]+"
str.matches(PATTERN);
//第二种用法
Pattern pat = Pattern.compile(PATTERN);
Matcher mat = pat.matcher(str);
boolean b = mat.matches();
//我们还可以写成
boolean b = Pattern.matches(PATTERN,str);
在java中要使用双斜杠来代表转义符。
- java基础 ---字符和字符串
- Java基础:字符、字符串
- Java字符与字符串(基础)
- Java语言基础字符和字符串参与运算
- Java字符串、转义字符和字符统计
- Java--字符和字符串运算
- Java基础(一):字符、字符串
- C++基础之字符数组和字符串
- 【c基础】字符串、字符和字节
- Swift 语言基础(2)-字符和字符串
- swift基础(二):字符串和字符
- C++基础之字符数组和字符串
- 基础备忘:字符数组、字符串和字符串处理基本函数
- C Java 字符串和字符数组区别
- Java 统计字符个数和分离字符串
- 对照Java学习Swift--字符串和字符
- Java String字符串处理和字符处理
- java字符数组和字符串,StringBuilder和字符串转换
- C++中的引用
- C#读写注册表
- 正在学习hibernate
- style.display问题
- MAP和马达分子携手调控微管结构的形成
- java基础 ---字符和字符串
- 企业网站服务器负载均衡技术
- C#只读字段和常量的区别
- Lucene学习笔记(应用)
- Socket编程
- .net下读写系统日志
- 雨天
- API拦截教程
- test