Java语言基础----常用API03(Object,String)

Object类

  • toString();

 默认实现:打印对象属性的 地址值  [对象类型@十六进制的哈希码值]

重写后:打印 对象的类型{+属性名+属性值+属性名+属性值.....}
  •  equals();& hashcode();

 hashcode();

作用:可以根据哈希码值区分不同的对象

Object默认实现: hashCode()的哈希码值 根据地址值生成
重写后:hashCode()的哈希码值根据 重写后传入的对象的属性生成
 equals()默认实现:==比较,
                                如果是 基本类型,比较的就是字面值
                                如果是 引用类型,比较的是引用类型变量保存的地址值
 equals()重写后:equals()与hashCode()重写以后, 比较的是对象的类型+属性+属性值


 String:字符串类型

  • java.lang.String使用的final修饰,不能被继承

  • 字符串底层封装了字符数组以及针对字符数组的操作算法

  • Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的编码

  • 字符串一旦创建,对象内容永远无法改变,但字符串引用可以重新赋值

String s1 = "123abc";
String s2 = "123abc";
System.out.println(s1==s2); //true,s1与s2地址相同

s1 = s1+"!"; //创建新对象并把地址赋值给s1
System.out.println(s1==s2); //false,s1为新的对象的地址,与s2不同了

  • 常量池:

    • java对字符串有一个优化措施:字符串常量池(堆中)

    • java推荐我们使用字面量/直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再次创建字符串时会重用对象以减少内存开销,避免内存中堆积大量内容相同的字符串对象

/*
  使用字面量创建字符串时:
  1.JVM会检查常量池中是否有该对象:
    1)若没有,则创建该字符串对象并存入常量池
    2)若有,则直接将该对象返回而不再创建一个新的字符串对象
 */
String s1 = "123abc"; //常量池还没有,因此创建该字符串对象,并存入常量池
String s2 = "123abc"; //常量池已有了,直接重用对象
String s3 = "123abc"; //常量池已有了,直接重用对象
//引用类型==,比较地址是否相同
System.out.println(s1==s2); //true
System.out.println(s1==s3); //true
System.out.println(s2==s3); //true

 常见面试题:

String s = new String("hello");
    问:创建了几个对象?
    答:2个
      第一个:字面量"hello"
            ---java会创建一个String对象表示字面量"hello",并将其存入常量池
      第二个:new String()
            ---new String()时会再创建一个字符串,并引用hello字符串的内容

String s1 = new String("hello"); //s1装的是new String()对象的地址
String s2 = "hello"; //s2装的是字面量"hello"的地址
System.out.println("s1:"+s1); //hello
System.out.println("s2:"+s2); //hello
System.out.println(s1==s2); //false,因为s1与s2的地址不同

//字符串实际开发中比较相等的需求都是比较字符串的内容
//因此我们应该使用字符串提供的equals()方法来比较两个字符串的内容
System.out.println(s1.equals(s2)); //true,因为s1与s2的内容相同

编译器编译特点

编译器在编译时,若发现一个计算表达式可以在编译期间确定结果,则直接运算好并将结果保存到表达式中


//如下代码:常量池中会有3个存储,一个是123abc的地址,一个是123的地址,一个是abc的地址
//一个新的对象,它的值也是123abc
String s1 = "123abc";
//编译器在编译时,若发现一个计算表达式可以在编译期间确定结果,
//则直接运算好并将结果保存到表达式中 相当于String s2 = "123abc";
String s2 = "123"+"abc";
System.out.println(s1==s2); //true,s1与s2共用常量池中的

String s3 = "123";
//当字符串拼接产生的内容与常量池是某内容相同时,也不会重用常量池的对象
String s4 = s3+"abc"; //创建一个新的对象存储123abc
System.out.println(s4==s1); //false
  • String常用方法:
    1. length():获取字符串的长度(字符个数)
      String str = "我爱Java!";
      int len = str.length(); //获取str的长度
      System.out.println(len); //String底层数组长度7
    2. trim():去除当前字符串两边的空白字符
      String str = "  hello world            ";
      System.out.println(str); //  hello world
      str = str.trim(); //去除当前字符串两边的空白字符
      System.out.println(str); //hello world

    3. indexOf(String str):检索给定字符串在当前字符串的开始位置

      lastIndexOf(String str): 检索给定字符串在当前字符串中最后一次出现的位置

      String str = "thinking in java";
      int index = str.indexOf("in"); //检索in在字符串str中出现的开始位置
      System.out.println(index); //2
      
      index = str.indexOf("IN"); //当前字符串不包含给定内容IN,所以返回-1
      System.out.println(index); //-1
      
      index = str.indexOf("in",3); //从第4个字符开始找in第一次出现的位置
      System.out.println(index); //5
      
      index = str.lastIndexOf("in"); //找in最后一次出现的位置
      System.out.println(index); //9
    4. substring(int start,int end):截取当前字符串中指定范围内的字符串(含头不含尾--包含start,但不包含end)

      String str = "www.baidu.cn";
      String name = str.substring(4,9); //截取第4个到第7个----下标
      System.out.println(name); //baidu
      name = str.substring(4); //从第4个一直截取到字符串末尾----下标
      System.out.println(name); //baidu.cn
    5. charAt():返回当前字符串指定位置上的字符

      String str = "thinking in java";
      char c = str.charAt(9); //获取位置9所对应的字符
      System.out.println(c); //i
    6. startsWith(String str)endsWith(String str):判断当前字符串是否是以给定的字符串开始/结尾的

      String str = "thinking in java";
      boolean starts = str.startsWith("think"); //判断str是否是以think开头的
      System.out.println("starts:"+starts); //true
      
      boolean ends = str.endsWith(".png"); //判断str是否是以.png结尾的
      System.out.println("ends:"+ends); //false
    7. toUpperCase()和toLowerCase():将当前字符串中的英文部分转为全大写/全小写

      String str = "我爱Java!";
      String upper = str.toUpperCase(); //将str中英文部分转为全大写
      System.out.println(upper); //我爱JAVA!
      
      String lower = str.toLowerCase(); //将str中英文部分转为全小写
      System.out.println(lower); //我爱java!
    8. byte[] data = str.getBytes(StandardCharsets.UTF_8);//将字符串转换为一组字节的方法

    9.  //String的构造方法支持将给定的字节数组按照指定的字符集还原为字符串
              String str = new String(data, StandardCharsets.UTF_8);

    10. str.contains("A");//返回布尔值,判断str字符串中是否含有“A”

    11. 忽略大小写比较字符串内容的方法:"exit".equalsIgnoreCase(line)

    12. str.isEmpty()//若读取的字符串为空串,返回布尔值true

  •  正则表达式

经常用于检测字符串是否符合特定的规则,在网站上经常用于检测用户输入数据是否符合规范

boolean matchs(正则) 检测当前字符串是否符合正则规则

//定义正则规则
//String reg = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
String reg = "\\d{1,3}(\\.\\d{1,3})(\\.\\d{1,3})(\\.\\d{1,3})";
//String reg = "(\\d{1,3}\\.){3}\\d{1,3}"; //测试分组
//定义被检查的字符串
String ip1 = "192.168.2.70";
String ip2 = "10.0.0.20";
String ip3 = "8.8.8.8";
//定义错误的被检查字符串
String ip4 = "192点168点2点70";
String ip5 = "192-168-2-70";
//检查
System.out.println(ip1.matches(reg));
System.out.println(ip2.matches(reg));
System.out.println(ip3.matches(reg));
System.out.println(ip4.matches(reg));
System.out.println(ip5.matches(reg));

replaceAll(正则,子串) : 替换子串

String str = "AAAAAAA.AAAA.AAA";
String s = str.replaceAll("\\.", "A");
System.out.println(s);

split(正则) : 拆分字符串,不包括结尾空字符串,有重载的方法可以保留结尾空字符串

String ip1 = "192.168.2.70";
String[] arr = str.split("\\.");
for(int i=0; i<arr.length; i++){
    System.out.println(arr[i]);
}

X{n}  规定左侧X出现n次
X{n,m} 规定左侧X出现最少n次, 最多m次
X{0,n} 规定左侧X出现0到n次 
X{n,}  规定左侧X出现最少n次
X?   和 X{0,1} 等价,X可以没有或者有一个
X+   和 X{1,} 等价,X至少有一个,多了随意
X*   和 X{0,} 等价,X至少有0个,多了随意 

单个\在Java中有特殊的含义,表示转义符号,不认为是一个斜杠,所以如果想要表示斜杠,需要在它的前面加一个用来转义的\,也就是 \\ 才表示成一个单纯的斜杠, \t 制表符  \r回车符 \n换行符

分组:讲一组规则作为整体进行处理,下列3者等效

  • \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

  • (\d{1,3}\.)(\d{1,3}\.)(\d{1,3}\.)\d{1,3}

  • (\d{1,3}\.){3}\d{1,3}


StringBuilder

StringBuilder 用于提升String字符串的连接性

  • StringBuilder称为可变字符串

  • StringBuilder内部也是字符数组, 其API可以直接修改其内部数组的内容

  • 当数组容量不足时候, 会自动扩容

  • 运算期间会尽力减少创建数组的数量。

  • append() 追加, 在StringBuilder的后面添加字符,当容量满了,会自动扩容, 扩容规则 1倍+2;

  • insert(位置,字符) 插入字符;

  • delete(开始位置, 结束位置): 删除一定范围的字符,包括开始,不包括结束

  • StringBuilder的API返回的大多是当前对象,可以连续使用.调用方法。

  • toString() 方法可以将StringBuilder转换为String

buf-> char[]{A, C, B, 0, 0, 0, 0, 0, 0, 0, 0...0}
//           0  1  2  3  4  5
StringBuilder buf = new StringBuilder();
buf.append("A") 
   .append("A") 
   .append("A")
   .append("B") 
   .insert(1,"C")
   .delete(2,4);
Stirng str = buf.toString();

System.currentTimelillis() 

/*1970年元旦开始到现在的毫秒数*/
long now = System.currentTimelillis();
system.out.println(now);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值