java学习之字符串

java中字符串的有三种

String           ---称为静态字符串,一经定义就长度和内容不在改变,一旦改变就会生成新的字符串,在频繁进行字符串拼接的时候后会产生大量零散内存单元,家中jvm内存回收压力,如果字符串内容不发生改变,则没有问题

StringBuffer       ---动态字符串,长度和内容都可以改变的字符串,但因为stringbuffer中大量方法都是线程同步的,该类一般用于多线程编程,在非线程环境下应用该类需要额外维持线程开销,性能不佳。

StringBuilder      ---从java5开始,对于非线程环境的动态数组, 是stringbuffer的替代类,取消了线程同步开销的问题

三种类型  针对不同环境使用。

string str=“123”  ;string str2=str+“456”; +号是字符串拼接  相当于又生成了一个新的内存叫str2来存储str和“456”这两部分的内容

stringbuffer  和stringbuilder 用于sql语句拼接

//定义sql
            StringBuilder sql=new StringBuilder()
                    .append("SELECT A.AAB102,A.AAB103,A.AAB104,A.AAB105,TO_CHAR(A.AAB106,'YYYY-MM-DD') AAB106 ") 
                    .append("  FROM AB01 A")
                    .append(" WHERE A.AAB101=?")
                    ;
stringbuffer举例

字符串string比较方法 equals  比较的是地址 引用 但是字符串string重写了equals方法 比较的是内容,equals不是final修饰 可以被重写

private static void stringTest1()
    {
        String str1="1223";
        String str3="1223";
        StringBuffer sbf1=new StringBuffer()
                .append("1223")
                ;
        boolean tag=str1.equals(sbf1);
        System.out.println(tag);
        tag=str1.equals(str3);
        System.out.println(tag);
        System.out.println(str1.hashCode()+"str3: "+str3.hashCode());
    }
equal 与 ==

equals是Object 定义的一个比较方法  而==叫做比较晕算法;

依据object原始定义 equals和== 并无区别都是比较两个变量是否引用了同一个地址

代码最后用了 hashcode方法 是hash码,生成此码有两种方式,

一是 根据内存地址  默认方式

 另一个根据内容生成散列码在string中

tostring 方法  打印出 

该对象所属类的完整路径+”@”+该对象的内存地址

java5以后具有 自动装箱拆箱   针对八大基本类型的基本类

 

注意 八大基本类型与其封装类都属于传值

在封装类中定义了一些静态方法可以实现类型的转换

//手动装箱
        int i=1;
        Integer i1=new Integer(i);
        //手动拆箱
        i=i1.intValue();
        //自动拆箱
        int c=i1;
        Integer d=c;
封装类 基本类 自动装箱

字符串转换成数值类型

String str="123456789";
        int ival=Integer.parseInt(str);
字符串转换整形

注意字符串中有别的字符会抛出异常,有小数也不行,因为转换成int,字符串不能是null 都会会抛出java.lang.NumberFormatException 异常

相应的字符串可以转换成 double类型

String str="1233.22";
        Double dval=Double.parseDouble(str);
        System.out.println(dval);
字符串转换成double

基本类型也可以转换成字符串

int a=100;
        String str=a+"";
        String sval=String.valueOf(a);
        System.out.println(str+" "+sval);
int 转换成 字符串

同样的其余基本类型 也可以 调用相应方法就行啦 valueof(参数)  参数包括各种基本类型

对象类型转换成字符串  封装类

Integer i=100;
        String str=i.toString();
        String str2=String.valueOf(i);
        String str3=i+"";
        System.out.println(str.hashCode()+"str2: "+str2.hashCode()+"str3 :"+str3.hashCode());
封装类 转换成 字符串 三种方法

特别注意 当封装类是 null是 第一种方法 tostring是空指针异常   java.lang.NullPointerException  因为 null。方法 是无法找到的

比如一个很有意思的小问题 integer a=null; int b=a+20;  打印输出b  结果是什么 

是空指针异常   就是 a是封装类 与整型20相加  需要转换成 整型 会先拆箱  但是拆箱的时候 a是null、就相当于null。intvalue方法 就引发异常啦

基本类型与其封装类的共同父类是 java.lang.number 

还是回归主题 字符串 

字符串是比较忽略大小写问题 可以自己写方法实现(根据其ASCII码特点,将其转换成统一大写或小写 在比较),也可以用其提供的方法equalsIgnoreCase()方法;

字符串比较大小 ,其提供的方法是从字符串左边开始比较 返回第一个大的字符的字符串。比如123就比1204大 因为第三个字符比较时第一个字符串大

字符串检索 : indexOf()方法 ,括号里是检索的目的串 返回目的串出现的首地址下标

String str="adsdasdsa";
                   //下标012345678
            System.out.println(str.indexOf("sd"));
检索字符串

代码执行结果打印2  若没有检索到目的串 就返回-1;

字符串截取:方法1 substring(参数1,参数2);该方法可以从参数1开始截取到参数2  ;参数1下标 <= 目的串<参数2 下标   

      方法2 substring(参数1);从参数1 下标可是截取到最后  ;

方法1中如果参数2超出字符串最大下标会抛出异常 : java.lang.StringIndexOutOfBoundsException

字符串替换方法: replace(“原”,“目的”);把原替换成目的 返回一个新串 ,原串不改变

    String str="adsdasdsa";
                   //下标012345678
            System.out.println(str.substring(2, 6));
截取下标2-6

 

 

 

 

posted @ 2017-08-29 21:04  窦光大大存大大凯  阅读(193)  评论(0编辑  收藏  举报