API
Application Programming Interface,应用程序接口,是一些预先定义的函数。目的是提供应用程序和开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节
Java.util包是java的工具包,包含各种实用工具类、集合类,日期时间工具等
Java.lang包是java的核心,包含了java的基础类。包含Object类,class类,string类,基本数字类等最基本的类,这个包无需导入,默认会自动导入
Object类是所有Java类的祖先,也就是"*父类"
如果想要查看对象的属性值,需要重写toString(),否则打印的是地址值,
return getClass().getName() + "@" + Integer.toHexString(hashCode());
如果要判断两个对象间的所有属性值相同,比较结果为true,就需要重写equals()
// 否则使用的就是Object的默认实现,通过==比较的是两个对象的地址值,不是属性
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用
String
String是一个封装char[]数组的对象,字符串不可变,被finall修饰,是常量
String str="abc" 等效于: char data[]={'a','b','c'},如果是第一次使用字符串,java会在字符串堆中常量池创建一个对象,如果再次使用相同的内容时,会直接访问堆中常量池存在的对象
package cn.tedu.test;
import java.util.Arrays;
public class TestString {
public static void main(String[] args) {
char[] a={'a','b','c'};
String s1=new String(a);
String s11=new String(a);
System.out.println(s1.equals(s11));//true
System.out.println(s1==s11);//false,没有高效的效果
String s2 = "abc";
String s222=new String("abc");
String s22 = "abc";
System.out.println(s22==s222);//false
System.out.println(s2==s22);//true,有高效的效果
//获取指定下标的元素
System.out.println(s2.charAt(0));//a,0开始
//用于拼接指定字符串,但不会改变原来的字符串
System.out.println(s2.concat("我爱你"));//abc我爱你
//判断是否为指定元素开头或结尾
System.out.println(s2.startsWith("a"));//可以判断开头的多个元素
System.out.println(s2.endsWith("c"));//可以判断结尾相邻的多个元素
//判断该字符首次出现的位置
System.out.println(s2.indexOf("d"));//返回下标,未曾含有此字符返回-1
//判断该字符最后一次出现的位置
System.out.println(s2.lastIndexOf("c"));
//按照要求指定分割字符串,返回值类型是String[]
System.out.println(Arrays.toString(s2.split("b")));//[a, c]
//如果指定一个下标,那就从指定位置开始截图,包含指定下标,到结束
//如果指定2个下标,那就截图下标之间的,含头不含尾
System.out.println(s2.substring(1));//bc
System.out.println(s2.substring(0,2));//ab
//把指定字符串转大小写
System.out.println(s2.toUpperCase());//ABC
System.out.println(s2.toLowerCase());//abc
String s3=" a b c ";
System.out.println(s3.trim());//只能去除首尾
//转为String类型
System.out.println("20"+10);
System.out.println(String.valueOf(80)+10);
}
}
StringBuilder/StringBuffer
1封装了char[]
2是可变的字符序列
3提供一组可以对字符内容修改的方法"+"
4常用append()来代替字符串做字符串连接"+"
5内部字符数组默认初始容量是16:super(str.length()+16);
6如果大于16会尝试将扩容,新数组大小变为原来的2倍+2,容量如果还不够,直接扩充到需要的容量大小。
1.在线程安全上:
StringBuffer是旧版本提供的,线程安全的@since JDK1.0
StringBuilder是jdk1.5后产生的,线程不安全的@since JDK1.5
2。执行效率上
StringBuilder>StringBuffer>String
3源码体现:本质都是在调用父类抽象类AbstractStringBuilder来干活,只不过Buffer把代码加了同步关键字,使得程序可以保证线程安全问题
package cn.tedu.test;
import java.util.Arrays;
public class StringBu {
public static void main(String[] args) {
method1();
method2();
method3();
}
//StringBuffer拼接10000000次
public static void method1(){
String str = "abcdefghijklmnopqrstuvwxyzf";
StringBuffer sb = new StringBuffer();
long t1 = System.currentTimeMillis();
for (int i=0; i<10000000;i++){
sb.append(str);
}
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
//StringBuilder拼接10000000次
public static void method2(){
String str = "abcdefghijklmnopqrstuvwxyzf";
StringBuilder stringBuilder = new StringBuilder();
long t1=System.currentTimeMillis();
for (int i = 0; i <10000000 ; i++) {
stringBuilder.append(str);
}
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
//String拼接10000
public static void method3() {
String str = "abcdefghijklmnopqrstuvwxyzf";
String result ="";
long t1=System.currentTimeMillis();
for (int i = 0; i <10000 ; i++) {
result=result+str;
}
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
}
==和equals的区别
String中equals方法被重写,当物理地址不同时,会进一步比较值
==比较的是值,
==如果比较的是基本数据类型,比较的则是变量值
==如果比较的是引用数据类型,比较的则是地址值
equals比较的是引用数据类型
如果没有重写hashCode和equals方法,比较的是地址值,因为Object的equals方法中使用是==
如果重写hashcode和equals方法,则比较的是内容
例如;两个String字符串进行比较时,比较的是内容,因为String底层重写了equals方法进行内容的比较