api:Application Program Interface,应用程序编程接口,可看做使用说明书
JavaAPI:指的是JDK中提供的各种功能的java类
第一步:查看类的描述信息(类的关系体系+所在包、特征、特性、常用方法、特殊说明、操作实例)
第二步:在程序当中引入该类,查看(类的属性、构造方法、静态方法、抽象方法、成员方法、弃用方法);
第三步:使用具体的某个属性和某个API方法;
第四步:程序测试功能;
(查看源码,ctrl+鼠标左键或者光标置于方法名,ctrl+b等)
所有类的直接或间接父类,位于继承树的最顶层;
任何类,如没有写extends显示继承某个类,都默认直接继承Object类,否则为间接继承;
Object类中定义的方法,是所有对象都具备的方法;
Object类型可以存储任何对象:
作为参数,可接受任何对象;
作为返回值,可返回任何对象;
public boolean equals (Object obj){}
object方法中的equals方法默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等;
==与equals的对比:
==是一个比较运算符,既可以判断基本类型,比较值是否相等;又可以判断引用类型:比较地址,即比较是不是同一个对象;
equals只能判断引用类型,比较地址,等同于“==”判断引用类型;
String类重写equals方法过程:this.equals(obj);(this为String类型的字符串)判断内容是否相等
比较两个引用是否指向同一个对象;是,返回true;
判断obj
是否String类或者String的子类;不是,返回false;
将obj
转换为String类型,比较this.length == obj.length,相等进入下一步,不等,结束返回false;
将this和obj转换为两个字符数组,遍历两个字符数组,利用==对每个字符元素进行比较,任一不同,返回false;全部相等,返回true;
Integer重写equals方法:this.equals(obj);(this为Integer类型)判断值是否相等
判断obj
是否Integer类或者Integer的子类;不是,返回false;
判断this == ((Integer)obj).intValue();相等返回true;不等返回false;
public int hashCode(){}
返回该对象的哈希码值;
提高具有哈希结构容器的效率;
两个引用,如果指向同一个对象,则哈希值相同;
两个引用,如果指向不同对象,则哈希值不一样;
哈希值主要根据地址号来的,不能完全将哈希值等价于地址;(根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值;)
在集合中hashCode如果需要的话,也会重写;
public String toString(){}
默认返回:全类名+@+哈希值的十六进制;字符串类型;(分析源码)
子类往往重写toString方法,一般返回对象的属性信息,也可以自行修改重写的方法;
当直接输出一个对象时,toString方法会被默认调用;sout(a);默认输出a.toString
返回引用中存储的实际对象类型,返回值是Class;
应用:通常用于判断两个引用中实际存储对象类型是否一致;
Class c1 = 对象1名.getClass(); Class c2 = 对象2名.getClass(); c1 == c2 ;
与instanceof区别:
getClass判断两个引用中实际存储对象类型是否一致;
x instanceof y;判断x是否为y类或y子类的实例对象;
创建并返回此对象的副本;克隆的对象和原对象的内存地址完全独立;
此对象的类必须实现接口Cloneable
,否则抛出CloneNotSupportedException
深克隆:
浅克隆:
Java原型模式(prototype)波波烤鸭的博客-CSDN博客java原型
当垃圾收集确定不再有对该对象的引用时,对象被判定为垃圾对象,由JVM自动调用该对象的finalize方法,进入回收队列;
程序员可以重写该对象的finalize方法,写自己的业务逻辑代码;不重写就默认调用object类的finalize;
垃圾对象:没有有效引用指向此对象时,为垃圾对象;
垃圾回收:由GC销毁垃圾对象,释放数据存储空间;
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象;由系统(即有自己的GC算法)决定什么时候回收
手动回收机制:使用System.gc();
主动触发垃圾回收机制;
-实际开发几乎不会运用finalize
面试题:介绍一下final 、 finally 和 finalize三者的区别
final:最终的,不能被修改
finally:
finalize:垃圾回收方法
在JDK7版本,java引入了java.util.objects
工具类,用于封装一些平时使用拼读很高或者容易出错的操作;
Objects()构造方法
private Objects() { throw new AssertionError("No java.util.Objects instances for you!"); }
该方法为私有方法,其实现为抛出一个异常;目的是为了避免对象的构造,即使通过反射机制也做不到!
equals()
有别于object.equals(),这个方法可以避免空指针异常。
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
deepEquals()
object.equals()
用于比较两个对象的引用是否相同,而deepEquals()
扩展成了可以支持数组。
public static boolean deepEquals(Object a, Object b) { if (a == b) return true; else if (a == null || b == null) return false; else return Arrays.deepEquals0(a, b); }
hashCode(Object o)
同object.hashCode()
,只是对象为null时,返回的哈希值为0;
public static int hashCode(Object o) { return o != null ? o.hashCode() : 0; }
hash()
生成对象的哈希值,包括数组;
public static int hash(Object... values) { return Arrays.hashCode(values); }
toString()
额外多了空指针判断
public static String toString(Object o) { return String.valueOf(o); } public static String toString(Object o, String nullDefault) { return (o != null) ? o.toString() : nullDefault; }
compare()
用于比较两个对象
public static <T> int compare(T a, T b, Comparator<? super T> c) { return (a == b) ? 0 : c.compare(a, b); }
requireNonNull()
在对象为空指针时,抛出特定message的空指针异常。
public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } public static <T> T requireNonNull(T obj, String message) { if (obj == null) throw new NullPointerException(message); return obj; } public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) { if (obj == null) throw new NullPointerException(messageSupplier.get()); return obj; }
isNull()和nonNull()
这两个方法用于判断对象为null和对象不为null。通常情况下,我们不会之间使用者两个方法,而是使用比较操作符==和!=。这两个方法主要用在jdk8开始支持的流计算里面。
public static boolean isNull(Object obj) { return obj == null; } public static boolean nonNull(Object obj) { return obj != null; }
public final class String String类型有final修饰,不允许再有子类
String类代表字符串,Java程序中的所有字符串字面值都被实现为此类的实例;
字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享;
如果发现在方法区中没有对应字符串,会自动开辟空间存储新的字符串
字符串一旦创建,不能被修改;
字符串虽然不能被修改,但可以共享;
如果字符串频繁拼接,都会在方法区开辟空间,内存空间消耗极大,所以频繁拼接字符串不建议使用String类,改用StringBuffer
或者StringBuilder
main{ String name = "张三" ; name += "666" ; sout("name:"+name) ; }
main{ String name = "张三" ; name += "666" ; sout("name:"+name) ; String name2 = "张三" ; }
String类型是引用类型,必然对应构造方法,String类型有相当多
String name2 = new String();//空字符 String name3 = new String("san");//字符串构造方法 char [] c1 = {'s','a','n'}; String name4 = new String(c1);//字符串数组构造方法 byte [] b1 = "san".getBytetes(); //使用平台的默认字符集将字符串编码为byte序列,并存储到一个新的byte数组中 String name5 = new String(b1);//字符串数组构造 String name6 = new String(c1,1,2);//从c1数组中的第一个元素开始取两个;数组元素下标从0开始;注意取元素个数避免下标越界;name = am;
通过构造器获取的String类型和通过字符串字面值获取的String类型的区别:
main{ String name1 = new String("zhang"); String name2 = "zhang" ; sout(name1 == name2);//false sout(name1.equals(name2));//true }
常用的基础操作方法
char charAt(int index);//返回指定索引处的char值
int length();//返回此字符串的长度
返回索引值,(字符、字符串不存在返回-1)
int .intdexof(int ch);//返回ch字符在此字符串中第一次出现处的索引
int .intdexof(String str);//返回str字符串第一次出现在字符串内的索引
int .intdexof(int ch , int fromIndex);//返回指定字符(ch)第一次出现的字符串内的索引,从指定的索引(fromIndex)开始搜索
int intdexof(String str , int fromIndex);//返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
int lastdexof(int ch);//返回指定字符在此字符串中最后一次出现的索引
int lastdexof(String str);//返回指定子串在字符串中最后一次出现的索引
int lastIndexof(int ch , int fromIndex);//返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
int lastIndexof(String str , int fromIndex);//返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。
返回字符串
String substring(int beginIndex);//返回一个子字符串,从beginIndex处开始截取
String substring(int beginIndex, int endIndex);//返回一个子字符串,从beginIndex处开始截取到endIndex;注意:不包括第endIndex个
String toLowerCase();//将此String的所有字符都转换为小写;
String toUpperCase();//将此String的所有字符都转换为大写;
String concat();将指定字符串连接到此字符串的结尾;同str+"";
static String valueOf(char[] chs);返回char数组参数的字符串表示形式;
static String valueOf(int i);返回i参数的字符串标识形式;
byte[] getBytes();将字符串转化为字节数组;
char[] toCharArray();将字符串转化为字符数组;
面试题:length、length()、size()的区别:
length:是数组的属性;
length():是字符串或其他类的一个方法;
size():是集合或者其他类的一个长度;
返回值为boolean
boolea isEmpty();//当且仅当str.length()为0时,返回true;str.length()不为0,返回false;str为null,报错空指针;
boolea equals();//将此字符串与指定对象进行比较内容相同返回true。不同返回false;null也可进行比较;
boolea equalsIgnoreCase();作用同equals();忽略大小写比较;null也可进行比较;
boolea contains();此字符串包含指定的字符串,返回true;否则返回false;其一为空,报错空指针;
boolea startsWith();测试此字符串是否以指定的前缀开头;
boolea endWith();测试此字符串是否以指定的后缀结尾;
其他方法
String replace(char old , char new);字符替换;
String replaceString old , String new);字符串替换;
String trim();返回一个字符串,删除此字符串的任何前导和尾随空格;
int compareTo(str1 str2);按字典顺序比较两个字符串,返回的值为str1-str2第一个不同字符的Unicode差值
int compareToIgnoreCase(str1 str2);按字典顺序比较两个字符串,忽略大小写,返回的值为str1-str2第一个不同字符的Unicode差值
String [] split(str);将此字符串以str为界限分割,str消除,返回String类型数组;
String [] split(str , int);将此字符串以str为界限分割为int部分,str消除,返回String类型数组;
String在频繁拼接字符串时,会不断开辟空间,造成内存浪费,这种情况下使用StringBuffer和StringBuilder来解决问题
StringBuffer
线程安全的可变序列,一个类似于String的字符串缓冲区,但不能修改;是一个容器,在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
构造方法
StringBuffer sb = new StringBuffer();创建一个默认容量为16的空字符数组;
StringBuffer sb = new StringBuffer(char);创建一个容量为char的unicode值的空字符数组;
StringBuffer sb = new StringBuffer(str);创建一个字符串长度+16的字符数组,含有str字符串;
StringBuffer sb = new StringBuffer(int);创建一个长度为int的空字符数组;
StringBuffer方法
sb.appe(a);将a附加到sb字符序列尾部;
sb.inser(int , a);在sb字符序列的int处插入a;
sb.verse();返回sb字符序列倒序的一个字符序列
sb.delete(int);删除sb字符序列中的下标int元素;
sb.delete(1, 4);删除sb字符序列的下标1-9的元素(不包括9);
sb.replac(2,5,str);将sb字符序列中的下标2-5(不包括5)元素替换为str字符串;
sb.substring(3);截取sb序列下标3至结尾的元素,返回为一个新字符串
sb.substring(3,8);截取sb序列下标3-8(不包括5)元素,返回为一个新字符串
StringBuilder
一个可变的字符序列,此api同StringBuffer,但不保证同步(线程不安全);该类被用作简易替换StringBuffer
在使用由单个线程字符串缓冲区的地方;即:效率更高,但不安全;
面试题:String、StringBuffer、StringBuilder的区别
String:线程不安全,一旦在方法全创建就不会被更改,可以给多个引用共享,但频繁拼接时,浪费资源,效率低
StringBuffer、StringBuilder可以改变字符串的长度和内容,是一个字符串缓冲区,频繁拼接时不会开辟新空间
StringBuffer:线程安全,效率较低
StringBuilder:线程不安全,效率高