java常用类
内部类
(一种特殊类定义,并非常用类)
定义:在类内部定义的完整类
特点:
-
编译之后可生成独立的字节码文件
-
内部类可直接访问外部类私有成员,而不破坏封装,如果内部类有属性与外部类重名,调用内部类属性就直接是属性名,调外部类的就是类名.this.属性名
-
可为外部类提供必要的内部功能组件
//外部类 Class Outer{ //内部类 Class Inner{ //也会生成class文件 } }
成员内部类
-
外部类实例的一部分,成员内部类实例化必须依赖于外部类
-
成员内部类有与外部类重名的方法或变量时,内部类优先访问内部类的
-
成员内部类不能有静态成员,但可以有静态常量
//实例化成员内部类 //法一 Outer outer = new Outer(); Outer.Inner inner1 = outer.new Inner(); //法二 Outer.Inner inner2 = new Outer().new Inner();
静态内部类
与非静态内部类的区别:
-
.在非静态内部类中不可以声明静态成员。
-
静态内部类不能够访问外部类中非静态的变量。
-
创建静态内部类时可以直接通过外部类类名创建。
//创建静态内部类 Outer.Inner inner = new Outer.Inner();
局部内部类
-
定义在外部类方法里面的类,作用范围和创建对象范围仅限于前的方法
-
局部内部类可直接访问外部类该方法的局部变量和外部类的属性
public class Outer{ private int a = 1; public void show(){ class Inner{ private b = 2; public void show(){ System.out.println(a+b); } } Inner inner = new Inner(); inner.show(); } } class Test{ Outer outer = new Outer(); outer.show() } //输出结果为3
匿名内部类
-
莫得名字的局部内部类,跟局部内部类特点差不多
-
需继承一个父类或实现一个接口
-
定义、实现、创建语法合并,且只创建一次
interface Inter{ public abstract void show(); } public class Outer{ public static void main(String[] args){ new Inter{ @Override public void show(){ System.out.println("匿名内部类方法"); } }.show(); /*或者 Inter inter = new Inter{ ... }; //这里不要忘了要有;因为是一个语句 inter.show();*/ } }
Object类
-
java中所有类的始祖,位于继承数的最顶层。
-
所有都是默认继承Object类的
-
Object类中的方法为所有类备用,可以重写
-
Object类型可以接受任何对象
hashCode()
-
根据对象的地址或字符串或数字使用哈希算法返回对象的一个整型的哈希值
-
哈希值相同的对象不一定相等,不同的就一定不等
toString()
-
返回该对象的字符串表示,默认返回运行时类名+@+对象的hashCode的16进制数
-
一般会被子类重写
-
可以直接通过引用名调用,不需要写.toString()
package frequent; public class Demo1 { public static void main(String[] args) { Demo1 object = new Demo1(); System.out.println(object); } } //输出:frequent.Demo1@1b6d3586 //因为没重写所以用了Object的默认toString
clone()
protected native Object clone() throws CloneNotSupportedException;
需要注意的问题:
-
为什么用protected修饰clone()方法?
为了安全考虑。因为clone是浅拷贝,对于对象的引用类型也是直接拷贝,而且Object类做不到深拷贝,因为它不知道你的类里有哪些是引用类型,用protected修饰后就意味着你需要重写clone才能在其他地方调用,重写成public就可以在任何地方调用。
-
为什么用native修饰?
这个一般很少接触到,只要知道用它修饰的比不用它修饰的效率要高,因为native的方法是用c/c++实现的,所以用clone比重新new一个在赋值效率高。
-
要调用clone方法的类要继承CLonable接口,这个不包含任何方法,就是一个标记,不实现会调用Object的clone()会抛出CloneNotSupportedException异常。
-
调用clone()要放在try{}里,因为clone会抛出异常。
getClass()
返回引用中存储的实际对象类型(new的是啥就返回啥)。
通常用于判断两个引用中实际存储对象类型是否一致。
//判断s1,s2两个引用类型是否指向的对象是同一个类的实现
if(s1.getClass() == s2.getClass())
notify()
public final native void notify();
//final修饰,子类不可覆盖
- 激活等待在该对象的监视器上的一个线程
wait()
public final native void wait(long timeout) throws InterruptedException;
- 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
equals()
public boolean equals(Object obj){}//源码
-
比较两个对象是否相等。默认比较的是地址值。
-
一般都会重写,进而比较内容是否相等
Math类
-
Math类中有着各种数学运算的方法,传参类型基本是double和long,即使没有重载,你传的不是这两个类型也会自动转换
-
Math类不能被实例化,因为其构造方法是private的。
-
Math类中的方法都是静态的,所以可以直接调用。
a = Math.floor(a);//向下取整
a = Math.ceil(a);//向上取整
a = Math.round(a);//四舍五入
Math.pow(a,b);//a的b次幂
a = Math.random();//返回double型的0-1的随机数
//还有三角函数运算、弧度角度转换等等
Random类
- 专门用于生成随机数的类。
- 只有生成随机整数方法nextInt()可以有一个整型传参,其他的类型没有(生成随机数组nextByte方法除外)。
- 想要得到范围内浮点型随机数可通过对返回值运算得,一般返回值都是0到1范围的
Random a = new Random();
a.nextInt(m+1-n)+n;//生成n-m之间的随机数
File类
- File类代表一个特定的文件或者目录(文件夹),并提供了若干方法对该文件或目录进行操作。
https://blog.csdn.net/xiao_a_ruo_ya/article/details/99972422
这个博主列举得很好,我就不在一一写了
包装类
- 八大基本类型对应的八个包装类
- 现在基本都是自动装箱(将int变Integer)和拆箱(Integer变int)了
- 用途:
- 集合不允许存放基本数据类型,所以要用包装类
- 包含了每个基本类型的相关属性
- 提供了一系列使用的对象操作,如类型转换,进制转换
- 包装类初始值类都为null,所以哪里字段允许null值,就可以用包装类,不允许就使用基本类型
int a1 = 127;
Integer a2 = 127;//编译时被翻译成:Integer a2 = Integer.valueOf(127);
System.out.println(a2.equals(a1));//true,自动将a1装箱
System.out.println(a1 == a2);//true,自动将a2拆箱
System.out.println("=================================");
Integer a3 = 127;
System.out.println(a2 == a3);//true
//-128到127内的值在常量池中,用Integer.valueOf()创建的Integer对象引用是直接指向常量池中的对应值的
System.out.println("=================================");
Integer a4 = new Integer(127);//new出来的对象是在堆中的,先从常量池拷贝一份到堆中,在返回堆中的引用
System.out.println(a2 == a4);//false,不会自动拆箱
System.out.println("=================================");
Integer a5 = 128;
int a6 = 128;
System.out.println(a5 == a6);//true
System.out.println("=================================");
Integer a7 = 128;
System.out.println(a5 == a7);//false,128常量池没有了,每次创建的引用都是不同的了
总的来说:
- int和Integer不管是不是new的,只要值相等都是true,因为会自动拆箱
- -128到127间不是new的Integer,只要值相等都是true,不在这范围的值相等都是false
- new的除了1的情况,不管怎么样都是false
- equals会自动将int装箱
Date类
- 表特定的瞬间,精确到毫秒值
- 这个瞬间时创建Date对象的瞬间
- getTime(),setTime()
Date date1 = new Date();
System.out.println(date1);//输出date1创建瞬间
Date date1 = new Date(date1.getTime-60*1000);
//有参构造,指定毫秒瞬间,date2是date1的前一分钟
SimpleDateFormat类
以模式的形式格式化得到时间。
构造方法SimpleDateFormat()以默认模式,有有参构造可以传入String类型定义模式。
模式:yyyy MM dd HH:mm:ss
y表年份,M表月份,dd表日,H表小时,m分钟,s秒
SimpleDateFormat time1 = new SimpleDateFormat("yyyy年MM月dd日,HH:mm:ss");
String strTime = "2021年4月7日,16:15:50";
System.out.println(time1.parse(strTime));//根据模式解析字符串,返回date类型
//time1.format()通过传入date格式化返回String类型
Calendar类
- 用于获取或操作日历字段(年月日),抽象类,不可实例化
- 可通过getInstance()方法的返回值得到Calendar类对象,该方法是以默认时区和语言创建日历的
- 可通过get/set方法得到和设置日历指定字段,也可以通过getTime()/setTime()获取和设置日历,不过传参和返回值是Date类对象
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int day = calendar.get(Calendar.DAY_OF_MONTH);
//...根据Calendar里的属性get就是了
calendar.set(Calendar.DAY_OF_MONTH, 4);
//...跟get一个意思
//getTime和setTIme跟上面也一个意思,不过就是传入和接收的是Date的对象
String类
-
适用于少量的字符串操作的情况
-
字符串常量池:为了提升字符串的访问效率,Java使用了缓存技术,所有用字符串都会在字符串常量池中创建一份,字符串常量池在方法区被存储
-
执行过程中,如果程序用到某个字符串,会先在字符串常量池中去搜索该字符串,如果没有找到,则在常量池中创建一份,如果找到就直接拿来用
-
String s1="abc"只会在字符串常量池中创建一个"abc"字符串对象
-
String s2=new String(“abc”) 会在常量池中创建一个“abc字符串对象”,还会在堆内存中创建一个对象,第二种方式比较浪费内存,不推荐使用
-
尽量不要做字符串频繁的拼接操作,因为字符串一旦创建不可改变,只要频繁的拼接,就会在常量池中创建大量的字符串对象,给垃圾回收带来负担
-
若做字符串的拼接,建议采用StringBuffer,因为直接调用append方法,不会创建大量字符串对象
作者:尼禄祭
链接:https://www.jianshu.com/p/78907ac0527e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
常用的方法很多,基本看看方法名或源码就懂了,所以这里就不写了
StringBuffer和StringBuilder
-
StringBuffer:可变长字符串,运行效率慢,线程安全,同步,适用于多线程下在字符缓冲区进行大量操作的情况。
-
StringBuilder:可变长字符串,运行快,线程不安全,不同步,适用于单线程下在字符缓冲区进行大量操作的情况。
-
效率都比String高且节省内存
-
基本方法:append(str), insert(index, str), delete(start, end)
replace(start, end , str), reverse()等等,基本都是看一下源码就是知道怎么用的了