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来做。

StringBuffer str = new StringBuffer(new String("123456789abcdefghijklmnopqrstuvwxyz"));
 
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(03);
   }
   
if(flag)
   {
    
for(int i = 0;i < 5;i++)
    {
     System.out.print(str.charAt(i));
    }
    System.out.print(
" ");
    flag 
= false;
    str.delete(
05);
   }
  }
 }
 
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中要使用双斜杠来代表转义符。

原创粉丝点击