java学习之字符串
java中字符串的有三种
String ---称为静态字符串,一经定义就长度和内容不在改变,一旦改变就会生成新的字符串,在频繁进行字符串拼接的时候后会产生大量零散内存单元,家中jvm内存回收压力,如果字符串内容不发生改变,则没有问题
StringBuffer ---动态字符串,长度和内容都可以改变的字符串,但因为stringbuffer中大量方法都是线程同步的,该类一般用于多线程编程,在非线程环境下应用该类需要额外维持线程开销,性能不佳。
StringBuilder ---从java5开始,对于非线程环境的动态数组, 是stringbuffer的替代类,取消了线程同步开销的问题
三种类型 针对不同环境使用。
string str=“123” ;string str2=str+“456”; +号是字符串拼接 相当于又生成了一个新的内存叫str2来存储str和“456”这两部分的内容
stringbuffer 和stringbuilder 用于sql语句拼接
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//定义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=?") ;
字符串string比较方法 equals 比较的是地址 引用 但是字符串string重写了equals方法 比较的是内容,equals不是final修饰 可以被重写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()); }
equals是Object 定义的一个比较方法 而==叫做比较晕算法;
依据object原始定义 equals和== 并无区别都是比较两个变量是否引用了同一个地址
代码最后用了 hashcode方法 是hash码,生成此码有两种方式,
一是 根据内存地址 默认方式
另一个根据内容生成散列码在string中
tostring 方法 打印出
该对象所属类的完整路径+”@”+该对象的内存地址
java5以后具有 自动装箱拆箱 针对八大基本类型的基本类
注意 八大基本类型与其封装类都属于传值
在封装类中定义了一些静态方法可以实现类型的转换
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//手动装箱 int i=1; Integer i1=new Integer(i); //手动拆箱 i=i1.intValue(); //自动拆箱 int c=i1; Integer d=c;
字符串转换成数值类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String str="123456789"; int ival=Integer.parseInt(str);
注意字符串中有别的字符会抛出异常,有小数也不行,因为转换成int,字符串不能是null 都会会抛出java.lang.NumberFormatException 异常
相应的字符串可以转换成 double类型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String str="1233.22"; Double dval=Double.parseDouble(str); System.out.println(dval);
基本类型也可以转换成字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
int a=100; String str=a+""; String sval=String.valueOf(a); System.out.println(str+" "+sval);
同样的其余基本类型 也可以 调用相应方法就行啦 valueof(参数) 参数包括各种基本类型
对象类型转换成字符串 封装类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()方法 ,括号里是检索的目的串 返回目的串出现的首地址下标
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(“原”,“目的”);把原替换成目的 返回一个新串 ,原串不改变
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
String str="adsdasdsa"; //下标012345678 System.out.println(str.substring(2, 6));