Java常用类
内部类
在一个类的内部在定义一个完整的类
特点:1.编译之后可以产生独立的字节码文件
2.可以调用外部类的私有属性,不破坏类的封装性
3.可以为外部类提供必要的内部组件
成员内部类
public class Main{
public static void main(String[] args){
A.B s = new A().new B();
s.in(); //内部类最重要特点,可以调用外部类的私有属性
}
}
public class A{
private int id = 10;
public void say(){
System.out.println("hi");
}
class B{
public void in(){
System.out.println("in");
System.out.println(id);
}
}
}
静态内部类
不依赖外部类,使用与外部类无异,可以直接使用
特点:1.仍然可以调用外部类的私有属性,但需要将外部类实例化再调用
2.在调用时,实例化与正常内部类不同
- 正常:A.B s =new A().new B();
- 静态内部类: A.B s = new A.B(); 表示包含关系
public class Main{
public static void main(String[] args){
A.B s = new A.B();
s.in(); //内部类最重要特点,可以调用外部类的私有属性
}
}
public class A{
private int id = 10;
public void say(){
System.out.println("hi");
}
static class B{ //与外部类相同
static int s = 100;
public void in(){
System.out.println("in");
A a = new A();
System.out.println(a.id);
}
}
}
局部内部类
1.只能在类中的方法定义和调用
2.调用方法的局部变量时,1.8之后默认会为变量加上final修饰符
3.局部内部类不能有任何修饰符
public class Main{
public static void main(String[] args){
A s = new A();
s.say(); //
}
}
public class A{
private int id = 10;
public void say(){
String name = "chenchenchen"
class B{
public void hehe(){
System.out.println(id); //id == A.this.id
System.out.println(name);
}
}
System.out.println("hi");
B b = new B();
b.hehe();
}
}
匿名内部类
1.没有类名的局部内部类(一切特征与局部内部类相同)
2.必须继承一个父类或者在一个接口中实现
3.定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
public class Main{
public static void main(String[] args){
Usb s = new Test();
s.serive;
Usb usb = new Usb(){
public static void serive(){
System.out.println("123"); //不用重写一个输出123的类
};//正常的接口不能直接实例化,可以使用匿名内部类优化(相当于创建了一个局部内部类)
}
}
}
public interface Usb{
void serive();
}
class Test implements Usb{
String name = "chenchenchen";
int id = 10;
public static void serive(){
System.out.println("Test");
}
}
Object类
1.基类,所有类的父类
2.默认继承object类
3.object中定义的方法全部可以直接使用
4.object作为参数,可以储存任何对象,作为返回值,可以返回任何对象
getClass()方法
返回引用中存储的实际对象类型,通常用于判断两个引用中存储的对象类型是否相同
public class Person {
int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Person p = new Person(1,"zdb");
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
System.out.println(p.getClass().getSimpleName());
System.out.println(p.id);
}
//运行结果
class 基础语法.Person
基础语法.Person
Person
1
hashCode()方法
返回对象的哈希值码
当对象相等时,hashCode返回值也是相同的
class Main {
public static void main(String[] args) {
// Object 使用 hashCode()
Object obj1 = new Object();
System.out.println(obj1.hashCode());
Object obj2 = new Object();
System.out.println(obj2.hashCode());
Object obj3 = new Object();
System.out.println(obj3.hashCode());
}
}
运行结果
225534817
1878246837
929338653
clone
创建并返回一个对象的拷贝
需要重写
public class Main{
String name;
int id;
public static void main(String[] args){
Main a = new Main();
a.name = "陈琛琛";
a.id = 100;
try {
Main b = (Main) a.clone();
System.out.println(b.name+"is "+b.id);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}//报错
equals()
比较对象是否相等,返回值类型为布尔型
xx.equals(xx)
public class Main{
public static void main(String[] args){
String s1 = new String();
String s2 = new String();
System.out.pritln(s1.equals(s2));//true 初始化都为空
}
}
finalize()
程序员一般不调用,当对象被判定为垃圾对象时,由JVM自动调用此方法
垃圾对象:没有有效引用指向此对象
垃圾回收,由GC销毁垃圾对象,释放数据存储空间
自动回收:JVM的内存耗尽,一次性回收所有对象
手动回收:使用System.gc();通知JVM回收,是否回收由JVM判断
public class Main{
public static void main(String[] args){
new Student("aaa");
new Student("bbb");
new Student("ccc");
new Student("ddd");
new Student("eee");
System.gc();
System.out.println("回收成功")
}
}
class Student{
String name;
public Student(String name){
this.name = name;
}
protected void finalize() throws Throwable{
System.out.println(this.name+"对象被回收了")
}
}
toString()
打印输出数组
public class Main{
public static void main(String[] args){
int[] a={1,5,456,12,566,12,3};
System.out.println(a);//得到的是一个哈希数
System.out.println(Arrays.toString(a));//输出数组a
}
public static void printArray(int [] array){//自己写一个与toString相似的方法
for(int i =0;i<array.length;i++){
if(i==0){
System.out.println("["+array[i]+",")
}else if(i==array.length-1){
System.out.println(array[i]+"]")
}else
System.out.println(array[i]+",")
}
}
}
Arrays类
该类包包含用于操作数组的各种方法(如排序和搜索),此外包括一些静态方法,可以直接调用
toString()
打印输出数组
public class Main{
public static void main(String[] args){
int[] a={1,5,456,12,566,12,3};
System.out.println(a);//得到的是一个哈希数
System.out.println(Arrays.toString(a));//输出数组a
}
public static void printArray(int [] array){//自己写一个与toString相似的方法
for(int i =0;i<array.length;i++){
if(i==0){
System.out.println("["+array[i]+",")
}else if(i==array.length-1){
System.out.println(array[i]+"]")
}else
System.out.println(array[i]+",")
}
}
}
sort()
对数组进行排序,默认为升序
public class Main{
public static void main(String[] args){
int[] a={1,5,456,12,566,12,3};
System.out.println(Arrays.sort(a));//输出从小到大的数组
}
}
fill()
填充数组
public class Main{
public static void main(String[] args){
int[] a= new in[10];
Array.fill(a,0); //将数组全部填充为0
Array.fill(a,2,4,0); //将第二到第四个元素填充为0
}
}
剩余可查看jdk文档
包装类
基本数据类型所对应的引用数据类型,默认值为null 博客
特点:基本类型数据存放在栈中,变成引用类型后,栈中存放的是引用,数据存放在堆中
优点:变成引用类型后,可以使用一些方法对其进行处理
装箱:将基本类型转换为引用类型
public class Main{
public static void main(String[] args){
int num = 10;
Integer a = new Integer(num);
Integer b = Integer.valueOf(num)
}
}
拆箱:将引用类型转换为基本类型
public class Main{
public static void main(String[] args){
int num = 10;
Integer a = new Integer(num);
int b = a.intValue();
}
}
s.xxValue()
以xx形式返回指定的数值s
注意点
public class Main{
public static void main(String[] args){
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a==b); //false
//new 是创建新的对象,a和b引用指向堆中不同的地址
Integer c = 100;
Integer d = 100;
System.out.println(c==d); //true
//此时c d引用指向同一个地址,返回的是IntegerCache数组,当超过范围时,返回的是对象地址,则会出错
Integer e = 200;
Integer f = 200;
System.out.println(e==f); //false
//因为堆中存放了一个-128-127的IntegerCache数组,直接赋值则先在里面找
}
}
JDK8以后自动拆箱和装箱
基本类型与字符串之间的转换
- 使用加号
- 使用integer中的toString方法
- 使用integer中的parsexxx转换为字符串
注意点:当布尔型转换为字符串时,非true均为false
public class Main{
public static void main(String[] args){
int num = 15;
String s = num + "";
String s1 = Integer.toString(num);
String s2 = "150";
int num1 = Integer.parseInt(s2);
}
}
String类
Java程序中所有的字符串文本都是String类的实例
创建方式
- 字面量赋值
public class Main{
public static void main(String[] args){
String name = "zhangsan";
//name是zhangsan的地址存放在栈中,在方法区中开辟一个常量池,存放zhangsan
name = "hi";
//重新开辟一个空间存放hi,name的地址改变
name2 = "zhangsan"
//不开辟新空间,而是指向之前的张三
}
}
- 使用new创建
public class Main{
public static void main(String[] args){
String s = new String("haha");
//将“haha”作为char数组存放到方法区中,在堆中存放数组地址,s存放的是堆中存放数组地址的变量的地址
String s1 = new String("haha");
System.out.println(s==s1); //false
//s s1中存放的是变量,每次创建都会在堆中开辟一个新的空间存放指向haha这个数组的地址
System.out.println(s.equals(s1)); //true
//此时比较的是数值
}
}
常用方法
legtn()
返回字符串长度
charAt(int index)
返回某个位置的字符
contains(String str)
判断是否包含某个子字符串
public class Main{
public static void main(String[] args){
String s1 = "wwww123";
String s2 = "123";
System.out.println(s1.contains(s2));
}
}
toCharArray()
将字符串转换成数组
public class Main{
public static void main(String[] args){
String s1 = "wwww123";
System.out.println(Array.toString(s1.toCharArray()));
}
}
indexOf lastIndexOf
返回字符串首次出现的位置
public class Main{
public static void main(String[] args){
String s1 = "wwww123";
System.out.println(s1.indexOf("w"));
}
}
trim()
去掉字符串空格,只能去掉前后空格
public class Main{
public static void main(String[] args){
String s1 = " wwww 123 ";
System.out.println(s1.trim());
}
}
replace(new str,old str)
用新的字符或者字符串替换旧的字符或者字符串
public class Main{
public static void main(String[] args){
String s1 = "wwww123";
System.out.println(s1.replace("123","456"));
}
}
split()
拆分字符串
扩展
1.split("[ ,]"),此时遇到空格或者逗号就会拆分
2.split("[ ,]+")此时遇到多个空格或者多个逗号也会拆分
public class Main{
public static void main(String[] args){
String s1 = "www.w12.3";
String[] s = s1.split(".")
System.out.println(s1.indexOf("w"));
}
}
compareTo
比较字典大小
public class Main{
public static void main(String[] args){
String s1 = "abc"; //a为97
String s2 = "xyz"; //x为120
System.out.println(s1.compareTo(s2)); //-23
String s3 = "abc"; //a为97
String s4 = "abcxyz"; //x为120
System.out.println(s3.compareTo(s4)); //-3
//比较完位置之后就比较长度
}
}
案例
public class Main{
public static void main(String[] args){
String s1 = "this is a text";
System.out.println(s1.split(" "));
System.out.println(s1.replace("text","haha"));
System.out.println(s1.replace(" text","easy text"));
}
}
可变字符串
区别
1.效率比String高
public class Main{
public static void main(String[] args){
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i <99999 ; i++) {
s+=i;
}
long end = System.currentTimeMillis();
System.out.println("String用时:"+(end-start));
long start1 = System.currentTimeMillis();
StringBuffer s1 = new StringBuffer();
for (int i = 0; i <99999 ; i++) {
s1.append(i);
}
long end1 = System.currentTimeMillis();
System.out.println("StringBuffer用时:"+(end1-start1));
}
}
2.比String节省内存
StringBuffer
运行效率慢,线程安全
StringBuilder
运行效率快,线程不安全
常用方法
append
public class Main{
public static void main(String[] args){
StringBuffer s = new StringBuffer();
System.out.println(s.append("hello"));
}
}
insert()
在某个位置添加
public class Main{
public static void main(String[] args){
StringBuffer s = new StringBuffer();
System.out.println(s.append("hello"));
System.out.println(s.insert(5," world"));
}
}
replace
public class Main{
public static void main(String[] args){
StringBuffer s = new StringBuffer();
System.out.println(s.append("hello"));
System.out.println(s.insert(5," world"));
System.out.println(s.replace(0,5,"he"));
}
}
delete
public class Main{
public static void main(String[] args){
StringBuffer s = new StringBuffer();
System.out.println(s.append("hello"));
System.out.println(s.insert(5," world"));
System.out.println(s.replace(0,5,"he"));
System.out.println(s.delete(0,s.length()));
}
}
BigDecimal类
浮点数类型的数据是相对精确的数据,进行运算时,会出现精度丢失问题
此时BigDecimal就出现了,用于大的浮点数精确计算
import java.math.BigDecimal;
public class Main{
public static void main(String[] args){
double a = 1.0;
double b = 0.9;
System.out.println(a-b);
BigDecimal c = new BigDecimal("1.0"); //使用ab时,输出结果将为更高精度的浮点数,而不是0.1
BigDecimal d = new BigDecimal("0.9");
BigDecimal e = c.subtract(d);
BigDecimal f = c.subtract(d);
System.out.println(e);
}
}
注意点:
使用除法时,主要写舍入模式
c.divide(d,2,BigDecimal.ROUND_HALF_UP) //四舍五入
Date
Date表示特定的瞬间,精确到毫秒,现大部分被Calendar类中的方法所取代
import java.math.BigDecimal;
import java.util.Date;
public class Main{
public static void main(String[] args){
Date a = new Date(); //获取时间
System.out.println(a);
Date b = new Date(a.getTime()-(60*60*24*1000)); //getTime 从1970到现在的毫秒数
System.out.println(b);
boolean c = a.after(b);
System.out.println(c);
int d = a.compareTo(b);
System.out.println(d); //a>b d=1, a<b d=-1
}
}
Calendar
Canlendar提供了获取或者设置各种日历字段的方法
该类的修饰符为protected 所以无法直接创建该对象
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
public class Main{
public static void main(String[] args){
Calendar a = Calendar.getInstance(); //获取指定时间
System.out.println(a.getTime().toLocaleString());
System.out.println(a.getTimeInMillis());
int year = a.get(Calendar.YEAR); //获取想要的时间数据
int month = a.get(Calendar.MONTH);
int day = a.get(Calendar.DAY_OF_MONTH);
System.out.println(year+" "+(month+1)+" "+day);
Calendar b = Calendar.getInstance();
b.set(Calendar.DAY_OF_MONTH,12); //通过set改变时间,如年月日
System.out.println(b.getTime().toLocaleString());
b.add(Calendar.HOUR,-1); //通过add改变时间,当前为减少一个小时
System.out.println(b.getTime().toLocaleString());
int max = b.getActualMaximum(Calendar.DAY_OF_MONTH); //获取年月日的最大值
int min = b.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max+" "+min);
}
}
SimpleDateFormat
将日期数据在文本与日期间转换
步骤:
- 创建对象
- 创建Date
- 格式化、
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception {
SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm");
SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()
SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
SimpleDateFormat myFmt4 = new SimpleDateFormat("一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");
Date now = new Date();
System.out.println(myFmt.format(now));
System.out.println(myFmt1.format(now));
System.out.println(myFmt2.format(now));
System.out.println(myFmt3.format(now));
System.out.println(myFmt4.format(now));
System.out.println(now.toGMTString());
System.out.println(now.toLocaleString());
System.out.println(now.toString());
Date first = myFmt.parse("2020/12/12");
System.out.println(first);
}
}
System类
系统类,用于获取一些系统的属性数据和其他操作
arraycopy
复制数组
System.arraycopy(原数组,开始位置,目标数组,目标数组开始位置,复制长度)
System.currentTimeMillis();
系统此刻时间,一般用于计算运行时间
public class Main{
public static void main(String[] args){
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i <99999 ; i++) {
s+=i;
}
long end = System.currentTimeMillis();
System.out.println("String用时:"+(end-start));
long start1 = System.currentTimeMillis();
StringBuffer s1 = new StringBuffer();
for (int i = 0; i <99999 ; i++) {
s1.append(i);
}
long end1 = System.currentTimeMillis();
System.out.println("StringBuffer用时:"+(end1-start1));
}
}
System.gc
提示jvm回收垃圾,但是否回收由jvm判断