Java上笔记汇总

目录

一.面向对象 

.常用API

总结


 

一.面向对象 

 

引用数据类型存储的是地址值
new出来的东西存在堆内存中
方法存在栈内存中,且方法的调用以栈类型结算
如何定义类:
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表属性,一般是动词)
3.构造器
4.代码块
5.内部类
}

你的girlfriend是一个类,你可以new出不同的girlfriend就是对象 
就是根据girlfriend来创建出新的不同的对象。
比如说你幻想的girlfriend有眼睛鼻子嘴巴等特征(l类),而你可以找到有不同特征的对象,第一个可能小眼睛高鼻梁,第二个可能大眼睛小鼻子(对象)。

eg:public class girlfriend{
    String hand;
    int face;//这是成员变量 属性
    public void holdHands(){
        System.out.println("女朋友能牵手");
    }
    public void kiss(){
        System.out.println("女朋友能亲亲");
    }//这是成员方法 行为
}
public class Main {
    public static void main(String[] args) {
        girlfriend g=new girlfriend();//在程序中new出新对象
        g.hand="很润";
        System.out.println(g.hand);
    }
}


ps:原来对象真的可以new出来。

一个java文件中可以定义多个class类但只能有一个类由public修饰,且public修饰的类名名必须为文件名
实际开发中建议一个文件一个class类

测试类:带main方法的类
JavaBean类:描述一个事物的类

 

1.封装

封装代表什么,就得封装对应的数据,并提供对应的行为

就近原则
this.成员变量位置


构造方法:在创建对象时给成员变量进行初始化(赋值)的
格式:
修饰符 类名(参数){
    方法体;
}
特点:    方法名与类名相同
    没有返回值类型,连void都不能有
    没有具体返回值(不能由return带回返回值)

用private搞JavaBean属性的原因
1.只对自己开放,可以被自己的get/set方法进行读写,外部无法访问
使该属性的值只被自己影响。更符合面对对象的封装思想
2.如果不进行封装,修改属性时就要对调用的每一处地方进行修改,
而用private只需要修改对象即可。
3.拒绝外部的随意访问,保证数据的合法安全。


空参构造 初始化默认值
带参构造 初始化参数 
创建对象由虚拟机调用,不能手动调用
每创建一次对象,就会调用一次构造方法
eg:Student s = new Student()空参构造
如果没写构造方法,虚拟机给我们加空参构造
无论是否使用,都手动书写无参构造方法,和全部带参构造方法

标准JavaBean类
1.类名见名知意
2.成员变量由private修饰
3.提供两个构造方法  无参构造和带全部参数构造
4.提供每一个成员变量对应的set/get方法
5.如果有其它行为,也要写上

快捷键:alt+insert/alt++Fn+insert
插件ptg 一键生成javabean

int a在栈内存储,基本数据类型在变量中存储自己的值
s引用数据类型 定义一个变量 变量存储堆空间的地址值故曰引用
this作用:区分局部变量和成员变量
this本质:所在方法调用者的地址值
eg:方法:method
       调用者:s(001)
       this:(001)(所在方法调用者地址)
       sout(age);(就近原则)
       sout(this.age)方法调用者的地址

局部变量必须先赋值

创建对象七步走:
1.在方法区加载class文件
2.在栈内存中开辟一个空间,存储对象的地址值声明局部变量
3.new出一个对象,在堆内存中开辟一个空间,把方法区储存的class拷贝到这里并记录地址值
4.默认初始化eg:null 0
5.显示初始化
6.构造方法初始化
7.将堆内存的地址值赋给左边的局部变量
ps: 等号左边:2       等号右边:3456      等号:7
eg:Student s=new Student();
s就是堆内存的地址  s.xxx 通过s地址调用里面的成员及方法 

流程图:先从main方法入口,将main方法放入方法区临时存储
        再将main方法调入栈内存中 new一个对象七步走
        出栈内存然后全出去。

数据能不写死就不写死,eg:arr[3];sum/3 ×
                      sum/arr.length

==号比较原理 
基本数据类型比的是数据值 因为在串池里可以复用,故用了同一个地址值
引用数据类型比较的是地址值

float类型的数据在定义浮点型数据时,必须在后面加上f或F;double类型的数据在定义时可以在后面加上d或D,也
可以不加。
java关键字都是小写的

substring(数字,数字) 截取字符串  包左不包右
replace("要替换的数字","用来替换的数字") 替换字符串

StringBuilder append:添加字符串
            reverse:颠倒字符串
          tostring:把stringbuilder的对象转换为字符串

StringJoier 间隔符号,开始符号,结束符号
            .add()添加东西

string 类型只要拼接就是开辟了个新地址
       
String str = "123456";
        String sta = "12345";
        String stb = sta+"6";
        System.out.println(str == sta);
答案是false,因为str记录的是串池里的地址
             stb进行了(有变量参与)拼接即相当于在堆里new了一个新地址
             而引用数据类型比较的是地址值故不相等

修改字符串内容
1.用substring截取并操作
2.把字符串转化为字符数组进行操作
tochararray把字符串变成字符数组

 

 

在循环前面加上标识符“xxx:”
跳出循环时break xxx 就可以跳出指定循环

被static修饰的成员变量被称为静态变量
被static修饰的成员方法叫做静态方法 可以通过类名调用(工具类)
静态变量随着类的加载而加载,是优先于对象存在的

JavaBean类:用来描述一类事物的类
测试类:用来检查其他类是否书写正确
工具类:不是用来描述一类事物,而是帮我们做一些事情的类。

工具类:1.类名见名知意
         2.私有化构造方法 

 

静态方法中,只能访问静态
非静态可以访问所有
静态中没有this关键字

 

2.继承

子类可以继承父类的哪些特征
构造方法不能继承
成员方法:能 private修饰的也能,但不能用
成员方法:加载到虚方法表中的能,其他不能(非private,非static,非final)

当父类方法不能满足子类需求时,进行方法重写
继承体系中子类出现一样的方法声明,就称为子类这个方法的重写
@Override放在重写方法上,校验重写时语法是否正确
本质:覆盖虚方法表中的方法
非private,非static,非final
非虚方法:如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法。静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。
访问权限子类必须大于等于父类,返回值类型子类必须小于等于父类只有被添加到虚方法表中的方法才能被重写
this调用:就近原则
super:直接找父类
子类中所有构造方法默认先访问父类中的无参构造,在执行自己
子类初始化之前,一定调用父类构造方法先完成父类空间数据的初始化
子类构造方法第一句默认是:super(),不写也存在,且必须写在第一行,想使用父类有参构造,必须手动构造

this super汇总:
this:理解为一个变量,表示方法调用者地址

3.多态
一个方法既要接收好几个类,就要把参数写成他们的父类
什么是多态:对象的多种形态
多态的前提:1.有继承/实现关系
         2.有父类引用指向子类对象
         3.有方法的重写
多态的好处:使用父类型作为参数,可以接收所有子类对象,便于体现多态的扩展性与便利
写方法的时候用多态,传参更方便
Fu f = new Zi();
调用成员变量:编译看左边,运行也看左边
        a.name编译时候会看左边父类有没有这个变量        有就编译成功,没有编译失败
            运行时获取的是左边父类成员变量的值
调用成员方法:编译看左边,运行看右边
        a.show()编译时看左边父类中有没有这个方            法,有编译成功,无编译失败
              运行代码时实际上运行的是子类的                  方法
多态弊端:不能调用子类特有功能
       原因:调用成员方法时,编译看左边,运行看右边
           先检查父类,没有这个方法直接报错
       解决方法:在建一个对象强转  Cat c = (Cat) a
        instanceof

final修饰:    1.方法:表明该方法是最终方法,不能被重写
        2.类:表明该类是最终类,不能被继承
        3.变量:叫做常量,只能被赋值一次
final修饰的基本数据类型:值不能发生改变
        引用数据类型:记录的地址值不能发生改变
字符串不能发生改变:关于设计字符串的数组被final修饰

实际开发中,一般只用private和public
成员变量私有  方法公开
如果方法中的代码是抽取其他方法中的共性代码,这个方法一般也私有

局部代码块,用完回收空间
静态代码块:static{}需要通过static关键字修饰,随着类加载而加载,并自动触发,只执行一次
使用场景:类加载时做一些数据初始化时使用 
Java类的加载时机
Java类的加载时机分为三种情况:1. 当创建类的实例对象时;2. 当访问类的静态变量或静态方法时;3. 当使用反射方式强制创建某个类或接口的Class对象时。在这三种情况下,Java虚拟机都会尝试加载并初始化该类。

抽象方法:将共性行为抽取到父类之后,由于每个子类执行的内容不一样,所以在父类中不能确定具体的方法体,该方法可以定义为抽象方法
public abstract 返回值类型 方法名(参数列表)
抽象类:如果一个类中存在抽象方法,该类就必须声明为抽象类
public abstract class 类名
抽象类不能创建对象
抽象类不一定有抽象方法,有抽象方法的一定是抽象类
可以有构造方法
抽象类的子类:
1.要么重写抽象类中的所有   抽象  方法
2.要么是抽象类

接口:就是一种功能
public interface 接口名{}
接口不能实例化
接口和类是实现关系,通过implements关键字
public class 类名 implemens 接口名{}
接口子类:实现类
要么重写接口所有 抽象 方法
要么是抽象类

注意:    1.接口和类可以单实现可以多实现ps:public class 类名 implements 接口1,接口2{}

    2.实现类可以在继承一个类的同时实现多个接口eg:public class 类名 extends 父类 implements 接口1,接口2{}

成员变量
    只能是常量
    默认修饰符:public static final
构造方法
    没有
成员方法
    只能是抽象方法
    默认修饰符:public abstract

jdk8中新增方法
允许在接口中定义默认方法,需要使用关键default修饰
作用:解决接口升级问题
接口中默认方法定义格式:
格式:public default 返回值类型 方法名(参数列表)
eg:public default void show(){}

静态方法:java接口中的静态方法有啥用

Java 接口中的静态方法可以在不创建接口实例的情况下直接调用,这对于一些工具类和辅助函数非常有用。静态方法可以提供一些通用的功能,例如工具类中的排序算法、字符串处理等。此外,静态方法还可以在接口中提供一些默认实现,这在 Java 8 中引入了默认方法的概念。


java接口中的静态方法和default方法有啥区别

Java接口中的静态方法是可以直接调用的,而default方法是可以被实现类重写的方法。静态方法是属于接口的一部分,而default方法是属于实现类的一部分。此外,实现类可以实现多个接口,但只能继承一个类,因此default方法可以解决多继承的问题。

当一个方法参数是接口时,可以传递接口所有实现类对象,这种方法称为接口多态

适配器设计模式:不想让实现类不得不重写那么多抽象方法,直接在中间写一个适配器(抽象类,实现接口)然后再让原本的实现类继承这个适配器就可以了。想用哪个方法就用哪个方法。

内部类可以直接访问外部类成员,包括私有
外部类要访问内部类成员必须创建对象

内部类:
1.成员内部类:写在成员位置,属于外部类成员,可以被一些修饰符所修饰
eg:private,只能在本类中使用
获取成员内部类对象
法一:在外部类中编写方法,对外提供内部类对象
法二:直接创建格式:外部类.内部类对象 对象名= 外部类对象.内部类对象;Outer.Inner oi = new Outer Inner();
调用变量时 直接:本方法中的  this.:本内部类中  外部类.this.:外部类
匿名内部类:new 类名/接口名(){
    重写方法
};
实质上是该类/接口的对象,{重写方法}才是匿名内部类
简化代码,把对象当成参数传递给方法,不用再为了一个参数创建一个对象


!!!创建对象等号右边创建对象,左边创建个类型去接收他,所以new stu();可以,但没人接收他

 

二.常用API

API不要背!!!!!
1.Math 类

Math类方法全用静态修饰,调用不用创建对象,私有化构造方法,是工具类
abs:绝对值
ceil(天花板):向上取整
floor(地板):向下取整
round:四舍五入
max:获取较大值
pow(a,b):返回a的b次幂
sqrt:平方根
cbrt:立方根

2.System

静态  工具类
System.currentTimeMillis()获取程序运行到此代码的时间 单位:毫秒
exit():0:正常停止 1:异常停止
arraycopy(要拷贝的数组从哪而来,从第几个数索引开始,要拷贝到哪,目的地索引,拷贝个数)

3.Runtime
私有化了成员方法,可以用get.Runtime()获取对象
runtime()当前系统的运行环境变量,
exit:是System的底层代码
availableProcessors()获取CPU线程数
maxMemory()总内存大小
exec:cmd命令

4.Object
tostring:对象的包名+地址
当你想打印对象属性值时候重写
equals:没有重写equals方法,比较的是地址值是否相等
重写之后的equals方法比较的是对象的内部值
clone:
clone不能直接调用的原因:Java中的clone方法是一个浅拷贝方法,它只会复制对象的基本类型和引用类型的地址,而不会复制引用类型的内容。这样可能会导致一些意外的问题,比如修改了一个对象的引用类型的内容,会影响到所有引用该对象的地方。因此,Java不允许直接调用clone方法,而是需要实现Cloneable接口,并重写clone方法来实现深拷贝。
细节:
1.重写Object中的clone方法
2.让JavaBean类实现Cloneable接口
3.创建原对象并调用clone就可以了
浅克隆:不管对象内部是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型重新创建新的

不能用NULL调用对象
eg:Student s1 = NULL
Objects:
equals:先做非空判断,比较两个对象
isNull 判断对象是否为空,为NULL返回true
nonNULL:与isNull

5.BigInterger与BigDecimal

BigDecimal

BigInteger(int num,Random rnd) 随机获得大整数.范围:[0~2的num次方-1]
BigInteger(String val) 获取指定大整数
BigInteger(String val,int radix) 获取指定进制大整数
如果BigInteger表示数字没有超过long范围,可以用静态方法获取
如果BigInteger超出long范围,可以用构造方法获取
对象一旦创建,BigInteger内部记录的值不能发生改变
只要进行计算都会产生一个新的BigInteger对象

BigDecimal
1.通过传递double类型的小数来创建对象,eg:BigDecimal bd1 = new BigDecimal(0.01); 这种创建方式是不精确的不建议使用
2.通过传递字符串表示的小数来创建对象,eg:BigDecimal bd1 = new BigDecimal("0.01");
valueOf获取对象
add 加法
subtract 减法
multiply 乘法
divide(BigDecimal val,精确几位,摄入模式) 除法
底层:数组存储ASCII值

正则表达式(本质是字符串可以用字符串.matches(正则表达式)校验是否正确)
1.校验字符串是否满足规则
2.在一段文本中查询满足要求的内容
[abc]            只能是a,b,c
[^abc]        除了a,b,c之外的任何字符
[a-zA-Z]        a到z A到Z,都可以
[a-d[m-p]]        a到d 或m到p
[a-z&&[def]]    a-z和def的交集
[a-z&&[^bc]]    a-z和非bc的交集
[a-z&&[^m-p]]    a到z和除了m到p的交集

.任何字符
\d  一个数字(0到9)
\D 非数字
\s  一个空白字符
\S 一个非空白字符
\w 数字字母下划线
\W 一个非单词字符

{n,}至少出现n次
{n}刚好n次
{n,m}至少出现n次最多出现m次
心得:拿着一个正确的数据,从左到右依次去写 
(?i)忽略后面大小写

Patter:表示正则表达式 .compile接收正则表达式
Matcher:文本匹配器,在大串中找符合匹配规则的子串

带条件的数据爬取
String str = "Java(?=8|11|17)"
?理解为前面是数据Java
=表示在Java后面要跟随的数据
但是在获取的时候,只获取前半部分
String str = "Java(?:=8|11|17)"
:获取所有
!去除后面的

贪婪爬取:尽可能多爬取  "ab+"
非贪婪爬取:尽可能少爬取 "ab+?"

正则表达式在字符串方法中的使用
1.matches(String regex) 判断字符串是否满足正则表达式的规则
2.replaceALL(String regex,String newStr)按照正则表达式规则进行替换
3.String[] split(String regex)按照正则表达式的规则切割字符串,每个切出来的存到String数组中
捕获分组:
\\组号:表示把第x组的数据拿出来在用一次,验证要一样
*:作用于\\1,表示后面重复的内容出现0次或多次eg:“(.)\\1*”
String str = "我要学学编编编编程程"
str.replaceAll("(.)\\1",$1)
(.)表示把重复内容的第一个字符看成一组
\\1表示第一个字符再次出现
+至少一次
非捕获分组:
仅仅把组号括起来(?:)(?!)(?=)

Java直接输出一个对象名会自动调用对象的tostring方法

Date创建一个对象表示一个指定间
Date(long l)表示距离时间远点毫秒值

SimpleDateFormat 格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("自定义格式 eg:y年M月d日 H:m:s E")
String st = sdf.forat(Date date)
parse(st)解析

Calendar
是一个抽象类 

包装类
用一个对象把基本数据类型包起来
集合中不能存基本数据类型,不能存对象
JDK5以后自动拆箱,自动装箱
int Integer可以看作一个东西
Integer i1 = 10;Integer i2 = 8;Integer i3 = i1 + i2
static String toBinaryString(int i) 以二进制无符号整数形式返回一个整数参数的字符串表示形式。
static String toHexString(int i) 以十六进制无符号整数形式返回一个整数参数的字符串表示形式。
static String toOctalString(int i) 以八进制无符号整数形式返回一个整数参数的字符串表示形式。 
 !!!!!static int parseInt(String s) 
 将字符串参数作为有符号的十进制整数进行解析 !!!! 神!!!!
八种数据类型除了Character都有对应的parseXxx的方法

以后我们想要键盘输入,无论遇到什么数据类型统一用nextline
再用parseXxx

Arrays:操作数组的工具类
tostring:把数组拼接成一个字符串
binarySearch:二分查找元素
1.数组中的元素必须存在且有序
2.如果要找的元素是存在的,返回真实索引值
    如果不存在,返回-插入点-1
copyof:拷贝数组
参数1:老数组
参数2:新数组的长度
方法底层会根据第二个参数来创建新数组
如果新数组的长度大于老数组,会部分拷贝
如果新数组的长度等于老数组,会完全拷贝
如果新数组的长度大于老数组,会补上默认值
copyOfRange:拷贝数组(指定范围)
包头不包尾,包左不包右
fill(arr,val):填充数组
sort:排序
Arrays.sort(arr,new Comparator<Interger>()){
    @Override
    public int compare(Integer o1,Integer o2){
        return 0;
    }
}
compare底层用插入排序  o1:表示在无序序列中,遍历得到的每一个元素。
o2:有序序列中的元素 o1-o2v升序 o2-o1降序

Lambda表达式
()->{}
()对应着方法的形参
->固定格式
{}对应着方法的方法体
Lambda表达式可以用来简化匿名内部类的书写
Lambda表达式只能简化函数式接口的匿名内部类写法
有且仅有一个抽象方法的接口叫做函数式接口,接口上方加@Functionalinterface注释
调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象。如果实现类对象只要用到一次,就可以用匿名内部类的形式进行书写

集合的体系结构
Collection:单列集合 是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
boolean add()   void clear() boolean remove()boolean contains() boolean isEmpty() int size()
Collection的遍历方法
1.迭代器遍历
迭代器在Java里的类是Iterator,迭代器是集合专用的遍历方式
迭代器不依赖索引
bool Iterator<String> it = list.iterator();
flag = it.hasNext();判断是否有元素
String str = it.next();迭代器指向 下一个元素
细节:
如果已经指向空,在强行调用,直接报错
迭代器遍历完毕,指针不会复位
循环中只能用一次next方法
迭代器遍历时,不能用集合的方法进行增加和删除
next在底层1.获取元素2.移动指针
迭代器无法添加
2.增强for遍历
底层是迭代器
所有单列集合和数组才能使用增强for
快速生成方式:
集合的名字+for回车
本质是用一个第三方变量存储集合里的值
Lambda表达式
co.forEach(s-> System.out.println(s));


List:添加元素有序,可重复,有索引
E remove(int index) 删除指定索引处的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
void add(int index,E element) 在此集合中的指定位置插入指定元素
当方法重载时,实参形参保持一致的方法

set:无序,不重复,无索引


泛型
格式<数据类型>
只能支持引用数据类型,基本数据类型要转换为对应的包装类 
没有泛型时,集合如何存储数据
结论:如果没有给集合指定类型,默认所有数据类型都是object 可以往集合里添加任意数据类型 但无法使用他的特有行为。
这时推出了泛型,可以在添加数据的时候把类型统一
在获取类型时,也省得强转了
好处:1.统一数据类型 2.把运行时期的问题提前到了编译期间,避免强制类型转换可能出现的异常。3.如果不写泛型类型默认object
Java中的泛型是伪泛型
泛型可以写在类/方法/接口后面
当一个类中,摸个变量类型不确定时,可以定义带泛型的类
public class arraylist<E>{} 大佬
测试类 要规定泛型类型 小弟弟
方法形参不确定时
1.使用类名后面定义泛型  所有方法都能用
2.在方法申明上定义自己的泛型 只有本方法能用
修饰符 <类型>返回值类型 方法名(类型 变量名)
修饰符 interface 接口名<类型>{}
1.实现类给出具体类型
2.实现类延续泛型,创建对象时在确定
泛型的继承
泛型不仅具备继承性,但数据具备
希望:本方法虽然不确 类型 可以进行类型限定
?extends E:表示可以传递E或E所有子类类型
? super E:表示可以传递E或E所有父类类型
应用场景:
1.定义类,方法,接口时,如果类型不确定就可以定义泛型类,泛型方法,泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系,就可以用泛型通配符。
关键点:可以限定类型的范围

二叉查找树 小的放左边,大的放右边
平衡二叉树 任意节点左右子树高度差不超过1
旋转机制
红黑规则(红黑树)
1.每一个节点必须是红色或黑色
2.根节点必须是黑色
3.如果一个节点没有子节点或父节点,则该节点的相应指针值为Nil,这些Nil视为叶子节点,每个叶子节点是黑色的
4.如果一个节点是红色那他的子节点必须是黑色
5.对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
添加默认红色节点,因为效率高

 

ArrayList
ArrayList<String> list = new Arraylist<>();
<>是泛型表示存放的数据类型,注意不能是基本数据类型;
增删改查
增:add 返回值为true
删:remove 1.直接删元素
           2.根据索引删元素
改:set(索引,要改的东西) 返回改掉的东西
查:get(索引)返回该索引存储的值
    size()长度
    
如果返回多个数据,先把数据放到容器当中
再把容器返回。
Ctrl Alt+t 选个东西包裹选中代码

set系列集合 是个接口
无序:存取顺序不一致
不重复: 可以去除重复
无索引:没有带索引的方法 ,所以不能使用普通for循环,也不能通过索引获取元素
HashSet:无序不重复无索引
LinkHashSet:有序不重复无索引
TreeSet:可排序不重复无索引

HashSet:无序 不重复 无索引
底层采用哈希表存储结构 数组,链表,红黑树
当链表长度超过8,数组长度超过64时自动转换为红黑树
哈希值:对象的整数存储形式
该方法定义在object类中,所有对象都可以调用,默认使用地址值进行计算
一般情况下,会重写hashcode方法,利用对象内部属性计算哈希值
对象哈希特点
如果没有重写hashcode方法,不同对象计算出的哈希值是不同的
如果已经重写hashcode方法,不同对象只要属性值相同,计算出的哈希值是相同的
如果集合中存储的是自定义对象,必须重写hashcode和equals方法
LinkHashSet:有序不重复无索引
底层数据结构还是哈希表,只是每个元素又额外多了一个双链表的机制记录存储顺序

TreeSet:不重复,无索引,可排序
TreeSet底层基于红黑树实现的,增删改查性能都好
TreeSet默认排序规则 student要实现Comparable接口(Javalang包下的)
重写compareTo方法
 @Override
    public int compareTo(student o) {
        int i = this.getAge() - o.getAge();
        return i;
    }
this:表示当前要添加的元素
o:表示已经在红黑树纯在的元素
返回值:
负数:认为要添加的元素是小的,存左边
正数:认为要添加的元素是大的,存右边
0:认为要添加的元素已经存在

比较器排序:可以随心所欲的指定比较规则
在()里面创建匿名内部类Comparator并重写compare方法
TreeSet<student> s = new TreeSet<>(new Comparator<student>() {
            @Override
            public int compare(student o1, student o2) {

                return o1.getName().length() - o2.getName().length();
            }
        });


总结

这就是Java上的全部内容了,很全的,喜欢的话点个赞呗

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值