java学习(三)-String+数组+枚举

String

毫无疑问,字符串操作是java程序设计中最常见的行为。写过c代码的程序员都知道,字符串操作时最烦的事情之一 ,C++中字符串操作有所改观,但是c++兼容c代码,所以经常会让人产生疑惑,特别是进行诸如MFC这类GUI编程的时 候,光是字符串之间的转换就足以让你头疼了,在java中字符串会让你摆脱这些本部必要的困惑。

首先需要声明的是:String对象是不可变的,所有对于String类库的调用都是创建了一个全新的字符串对象,而最 初的字符串根本不会改变,当把一个对象传递给一个方法的时候,实际传递的都是这个String引用的拷贝。也就是 说字符串对象具有只读特性,而且String是个final类,不能被继承。

  • 如果你足够细心就会发现,如果使用循环来构建String对象,那么在JVM中就出现很多String的对象,这势必会 影响效率,java中提供了一个类:StringBuilder来解决这个问题。StringBuilder就是一个String的构造器,在生 成String对象之前它不会无限拷贝,所以我们在遇到上述问题的时候,可以这样来做:

      StringBuilder result=new StringBuilder();
        for(;;) result.append();
        return result.toString;
    
    • 在java类库中也提供了StringBuffer这个类,如果不太清楚java就会在使用他们时产生困惑。StringBuffer是 个可变对象,它也只能通过构造器来构造,实际上在java引入StringBuilder之前,使用的就是StringBuffer,也可 以通过toString()方法将其转化为String。StringBuffer不会像String那样去执行拷贝,所以是线程安全的。

    • 如果你想打印出对象的内存地址,这样做会引起递归:

      public String toString(){
        return ""+this+"\n";
      }
      

      因为碰到了+重载符,会去找this的toString方法,就会继续调用这个函数,这么时候应该用super.toString来 避免递归,因为toString方法也是object根类的方法。

    • java的格式化输出也可以写成像c语言那样: System.out.format("Row 1: [%d %f]\n",x,y); 这些格式化功能由java.util.Formatter这个类来统一处理,上面的格式化方法几乎和c没有区别。String类也有 String.format()方法,它接收参数和Formatter.format()方法一样,但返回类型是String。

    • 在所有高级语言对字符串处理中都不会缺少正则表达式,java中正则表达式与unix的不同,在unix中“\”中表 示我要插入一个反斜线,但是java中“\d”表示的恰恰是一个数字,就是说java中“\”与unix中的'\'效果是相同的 ,但是java的如\n\t之类的还是单斜线。在构建正则表达式的时候,可以这样使用:

      import java.util.regex
      Pattern p = Pattern.compile(arg)
      Matcher m = p.matcher(arg[0])
      

      程序中Pattern是一个正则表达式对象,然后把你需要检索的字符串传入Pattern对象的matcher()方法,生成一个 Matcher类,这个类中就记录了匹配信息。我们使用正则表达式的很大一部分原因就是需要去替换匹配的部分,使用 String与Matcher配合使用replaceFirst,replaceAll等方法就可以方便地进行替换了。

数组

在java中数组显然没有像c,c++里面那么受宠信,大多数写程序我们都用容器来实现了,用数组的唯一好处就是它 的效率比容器好。

  • 数组对象可以访问的字段实际上只有一个length,表示数组可以存储多少个元素(注意可不是数组的实际大小) ,但是基本类型数组和对象数组有一定的区别,就是基本类型数组存放的就是基本类型的值,而对象数组存放的是 引用。

  • 与c++不同的是,java的数组可以返回,java的多维数组使用起来也是相当地方便: int[][][] a = new int[5][][]; a[i] = new int[6][]; a[i][j] =new int[7]; 也就是说数组的维数可以逐级指定,这使得java数组用起来很灵活。

  • 数组中最有用的类就数java.util.Arrays了,它提供了一套static的API: equals(a1,a2) 比较两个数组是否相等 fill() 将一个对象引用或值填充至数组中 sort() 对一个数组排序,不过得基于对象的compareTo()方法,当前对象小于参数值返回负值,等于返回0,大于返回正值,实现这种方法只需继承java.lang.Comparable接口就可以了。 binarySearch() 在已排序的数组中查找元素,通常是返回一个插入点(第一个大于查找对象的位置) asList() 接收任意的序列或数组作为参数,并将其转化为List

  • 在数组的复制过程中,我们有很好的方法:

    System.arraycopy(i,0,j,0,i.length) i:源数组,j:目标数组,0:表示两者的起始位置,最后是复制的长度
    
  • java中针对字符串的排序一般是基于字典序的: Arrays.sort(a) 将a按字典序排序 Arrays.sort(a,String.CASE_INSENSITIVE_ORDER) 忽略大小写排序

枚举

枚举类型的定义很简单:

    enum Shrubbery {GROUND,CRAWLING,HANGING}

他有一些很有用的API: Shrubbery.values() 枚举常量数组 ordinal() 常量定义的序号 equals()或者== 判等于 getDeclaringClass()得到枚举类 name() 常量名

enum最大的用处就是在switch中的使用,因为switch中要求必须是整型的,这就为枚举类型的使用提供了空间。 枚举类继承自Enum类,所以不能够在给它指定基类了,因为java不支持多继承,当时除了这个,完全可以把它当作 一个普通的类,故可以在其中添加方法和字段,甚至是main方法。但是定义其构造器的时候,得注意不能是public 的。



Previous     Next
zhing /
Published under (CC) BY-NC-SA in categories java  tagged with java