第七章 动力节点-java常用类.docVIP

  • 3
  • 0
  • 约8.64千字
  • 约 17页
  • 2017-06-19 发布于湖北
  • 举报
纲要 String StringBuffer 基础类型对应的8个包装类 日期相关类 数字相关类 Random Enum 内容 2.1、String 2.1.1、String类是不可变类,也就是说String对象声明后,将不可修改 public class StringTest01 { public static void main(String[] args) { String s1 = a; String s2 = b; s1=s1 + s2; //ab //new String(“a”); System.out.println(s1); } } 从以上内存图,大家可以看到,String对象赋值后不能再修改,这就是不可变对象,如果对字符串修改,那么将会创建新的对象 注意:只要采用双引号赋值字符串,那么在编译期将会放到方法区中的字符串的常量池里,如果是运行时对字符串相加或相减会放到堆中(放之前会先验证方法区中是否含有相同的字符串常量,如果存在,把地址返回,如果不存在,先将字符串常量放到池中,然后再返回该对象的地址) 2.1.2、String s1 = “abc”和 String s2 = new String(“abc”) public class StringTest02 { public static void main(String[] args) { String s1 = abc; String s2 = abc; String s3 = new String(abc); System.out.println(s1==s2, + (s1==s2)); System.out.println(s2==s3, + (s2==s3)); System.out.println(s2 equlas s3, + (s2.equals(s3))); } } 如果是采用双引号引起来的字符串常量,首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了,所以s1和s2都指向常量池中的同一个字符串“abc” 关于s3,s3采用的是new的方式,在new的时候存在双引号,所以他会到常量区中查找“abc”,而常量区中存在“abc”,所以常量区中将不再放置字符串,而new关键子会在堆中分配内存,所以在堆中会创建一个对象abc,s3会指向abc 如果比较s2和s3的值必须采用equals,String已经对eqauls方法进行了覆盖 2.1.3、String面试题分析 String s1 = new String(hello) ; String s2 = new String(hello) ; 以上代码创建了几个对象? 通过以上分析,大家会看到创建了5个对象,堆区中2个,常量池中1一个,栈区2个 通过以上分析,使用String时,不建议使用new关键字,因为使用new会创建两个对象 记住:堆区中是运行期分配的,常量池中是编译器分配的 2.1.4、String常用方法简介 endsWith:判断字符串是否以指定的后缀结束 startsWith,判断字符串是否以指定的前缀开始 equals,字符串相等比较,不忽略大小写 equalsIgnoreCase,字符串相等比较,忽略大小写 indexOf,取得指定字符在字符串的位置 lastIndexOf,返回最后一次字符串出现的位置 length,取得字符串的长度 replaceAll,替换字符串中指定的内容 split,根据指定的表达式拆分字符串 substring,截子串 trim,去前尾空格 valueOf,将其他类型转换成字符串 2.1.5、使用String时的注意事项 因为String是不可变对象,如果多个字符串进行拼接,将会形成多个对象,这样可能会造成内存溢出,会给垃圾回收带来工作量,如下面的应用最好不要用String 【代码示例】 public class StringTest04 { public static void main(String[] args) { String s = ; for (int i=0; i100; i++) { //以下语句会生成大量的对象 //因为String是不可变对象 //存在大量的对象相加或相减一般不建议使用String //建议使用StringBuffer或StringBuilder s+=i;// s = s+i; } } } 2.1.5、正则表达式初步 正则表达式,主要可以用来做字符串处理

文档评论(0)

1亿VIP精品文档

相关文档