API介绍及String类基本知识小结

什么是JDK API?

    API(applicationProgramming Interface,应用程序编程接口)就是一些已写好、可供直接调用的功能(在java语言中,这些功能以类的形式封装)

    经常使用的有:字符串操作、集合操作、文件操作、输入输出操作、网络操作、多线程等等。

字符串

  1. String是不可变对象
  2. Java.lang.String使用了final修饰,不能被继承
  3.  字符串底层封装了字符数组及针对字符数组的操作算法
  4. 字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值
  5. Java字符串中任何一个字符对应16位(两个字节)的定长Unicode编码

String常量池

    Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串.

对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象.

    String在内存中采用Unicode编码,每个字符16位占用两个字节;任何一个字符(无论中文还是英文)都算1个char字符长度,占用两个字节.

    StringBuilder封装可变的字符数组,对象创建后可以通过调用方法改变其封装的字符序列.

    StringBuilder的很多方法的返回值均为StringBuilder类型,这些方法的返回语句均为:return this.

    由于改变封装的字符序列后又返回了该对象的引用,所有可以连写。

    StringBuilder是可变字符串。字符串的内容计算,建议采用StringBuilder实现,这样性能会好一些;

    Java的字符串连接的过程是利用StringBuilder实现的

    Strings=”AB” String s1=s+”DE” +1;

    Strings1=new StringBuilder(s).append(“DE”).append(1).toString();

StringBuffer和StringBuilder

    StringBuffer是线程安全的,同步处理的,性能稍慢

    StringBuilder是非线程安全的,并发处理的,性能稍快

 String常用API代码

                String str1 = "Hello";
// 不会创建新的String对象,而是使用常量池中已有的"Hello".
String str2 = "Hello";
System.out.println(str1 == str2); // 输出:true
// 使用new关键字会创建新的String对象
String str3 = new String("Hello");
System.out.println(str1 == str3); // 输出:false
// 获取String对象的长度
System.out.println(str3.length()); // 输出:5
// 在一个字符串中检索另一个字符串
String str4 = "I can because i think i can";
int index = str4.indexOf("can");
System.out.println(index);// 输出:2
index = str4.lastIndexOf("can");
System.out.println(index); // 输出:24
index = str4.indexOf("can", 6);
System.out.println(index); // 输出:24
index = str4.indexOf("Can");
System.out.println(index);// 找不到返回 -1
// 在一个字符串中截取指定的字符串
String str5 = "http://www.oracle.com";
String subStr = str5.substring(11, 17);
System.out.println(subStr);// 返回:oracle
subStr = str5.substring(7);
System.out.println(subStr); // www.oracle.com
// 去掉两端unicode前32位的空白:空格、回车、换行、tab等
String str6 = " good man  \n\r";
System.out.println(str6.trim()); // goodman
//返回指定位置的字符
String str7="hello world";
System.out.println(str7.charAt(1)); //e
//检测一个字符串是否以指定字符串开头或结尾
String str8="Thinking in Java";
System.out.println(str8.endsWith("Java"));//true
System.out.println(str8.startsWith("T")); //true
System.out.println(str8.startsWith("thinking"));//false
//测试StringBuilder的append方法
StringBuilder buf=new StringBuilder("Programming Language");
buf.append(" java").append(" php");
System.out.println(buf.toString()); //Programming Language java php
//测试StringBuilder的insert方法
StringBuilder buf1=new StringBuilder("javacppc#objective-c");
buf1.insert(9, "php");
System.out.println(buf1.toString());//javacppc#phpobjective-c
//测试StringBuilder的delete方法
StringBuilder buf2=new StringBuilder("javaoraclecppc#php");
buf2.delete(4, 4+6);
System.out.println(buf2.toString());//javacppc#php
//测试StringBuilder的replace方法
StringBuilder buf3=new StringBuilder("javaphp");
buf3.replace(0, 4, "ios");

System.out.println(buf3.toString());//[0,4)替换包头不包尾 iosphp 

                //测试StringBuilder的reverse方法
StringBuilder buf4=new StringBuilder("12345");
System.out.println(buf4.reverse().toString());//54321

//Stringbuilder里有char[] 16 不够每次会新建对象 长度增加为一倍+2 length()返回有效字符个数 eg:18
//capacity()容量,返回value数组的大小 16+18

StringBuilder buf5=new StringBuilder("123456789012345678");
System.out.println(buf5.length()); //18

System.out.println(buf5.capacity()); //16+18=34

String常见判断

              String s0="abcd";
      String s1="ab";
      String s2="cd";
      String s3=s1+s2;
      String s4="ab"+"cd";
      System.out.println(s0==s3);//false

      System.out.println(s0==s4); //true

---------------------------------------------------------------------------------------------------------

   /*
    * String.intern():从池中取对象,有则返回无,无则有
    * JDK1.7之前:将对象放入池中然后返回
    * JDK1.7开始:定义引用指向堆中的对象然后返回引用

    */

                String s1 = new String("A") + new String("A");
// 在堆中创建A与A对象,常量池A,堆中还有对象AA AA不在常量池中
System.out.println(s1);
String s2 = s1.intern();// 常量池里没有AA,创建AA放进常量池中,如果常量池有AA了,那么大家一起引用它
String s3 = "AA"; // 把s2的引用给s3
String s4 = "AA";
System.out.println(s2 == s3);// true
System.out.println(s1 == s4);// true

System.out.println(s1 == "AA");// true

----------------------------------------------------------------------------------------------------------

                String s1="ABCD";
//在堆中创建了一个ABCD对象并把ABCD对象放进了常量池中;共2个对象
String s2=new String("AB")+new String("CD");
//在堆中创建了对象AB与CD及ABCD对象  但常量池只有AB与CD;共5个对象
String s3=s2.intern();//常量池有ABCD对象 把s1的引用给s3
System.out.println(s2==s3);//false

System.out.println(s3==s1); //true

-----------------------------------------------------------------------------------------------------------

                        String s1=new String("xy");
String sl1=s1.intern();//把s1常量池的引用给sl1
String s2="xy";//把s1常量池的引用给s2
System.out.println(s1==s2);//false;对象的引用和常量池的引用不一样
System.out.println(sl1==s2); //true

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值