count++和++count区别:
| 表达式 | 运算 | ||
|---|---|---|---|
| count++ | 给count加1 | ||
| ++count | 给count加1 | ||
| count-- | 给count减1 | ||
| --count | 给count原来的值 |
| 表达式 | |
|---|---|
| count原来的值 | |
| count+1以后原来的值 | |
| count原来的值 | |
| count-1以后的值 |
++i和i++单独使用的时候都是i=i+1; 而a=++i;相当于i=i+1;a=1; a=i++;相当于a=i;i=i+1;
自增自减运算符
++和--运算符可以放在变量之前,也可以放在变量之后,当运算符放在变量之前时,先自增或者自减,在赋值,当运算符放在变量之后时(后缀),先赋值,在自增/减。
例如, 当 b= ++a,先自增(a自己先加1),再赋值(赋值给b);
当b = a++时,先赋值(赋值给b),在自增(自己增加1)。也就是 ++a输出的是a+1的值,a++输出的是a值
口诀:符号在前就先加/减,符号在后就后加/减
链表中的指针:C语言的指针,可以理解成java中的“引用”。对于指针的理解:
将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者返货来说指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量
Scanner类中的next()和nextLine()区别
next()
1.一定要读取到有效字符后才可以结束输入
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉
3.只有输入有效字符后才将其后面输入的空白作为分割符或者结束符
4.next()不能得到带有空格的字符串
nextLine()
1.以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
2.可以获取空白
Character类
常用的一些方法:
isLetter() 判断是否是一个字母;
isDigit() 是否是一个数字字符;
isWhitespace()是否是一个空白字符
isUpperCase() 是否是大写字母
isLowerCase() 是否是字母的小写形式
toString() 返回字符的字符串形式,字符串的长度仅为1
等差数列
末项=首项+(项数-1)*公差
项数=(末项-首项)/公差+1
首项=末项-(项数-1)*公差
和=(首项+末项)*项数/2
末项:最后一位数
首项: 第一位数
项数:一共有几位数
和:求一共数的总和
java8-接口-默认方法
jdk8之后,有了默认方法,出现需要解决的场景,为了解决接口的修改与现实不兼容的问题。
其实就是为了兼容以前的接口,如果修改现有的接口,尤其是添加接口,其他implements改接口的类都需要实现新的方法,修改量太大,
接口中出现的默认方法有两种:
static 修饰的静态方法
default 修饰的默认方法
static静态方法使用:接口名.方法名调用
dafault 默认方法调用:接口名.super.方法名调用.
接口与类相似点
- 一个接口可以有多个方法
- 接口文件保存在.java结尾的文件,文件名使用接口名
- 接口的字节码文件保存在.class结尾文件中。
- 接口的字节码文件必须在与包名称相匹配的目录结构中
接口与类的区别
- 接口不能实例化对象
- 接口没有构造方法
- 接口中所有的方法必须是抽象方法,也可以是default关键字修饰的非抽象方法
- 接口不能包含成员变量,除了staic 和final变量
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承 接口特性
- 接口中每一个方法也隐式抽象的,接口中的方法会隐式的指定为public abstract(只能是public abstract,其他修饰符都会报错)
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final变量(并且只能是public,用private修饰会报编译错误)
- 接口中的方法是不能在接口中实现的,只能实现接口的类来实现接口中的方法。 抽象类和接口的区别
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
- 接口中不能含有静态代码块以及静态方法(用static修饰的方法);而抽象类是可以静态代码块和静态方法
- 一个类只能继承一个抽象类,一个类可以实现多个接口
抽象类的总结
- 抽象类不能被实例化。如果被实例化,就会报错,编译无法通过,只有抽象类的非抽象子类可以创建对象
- 抽象类中不一定包涵抽象方法,但是有抽象方法的一定是抽象类
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能
- 构造方法,类方法不能声明为抽象方法
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类 java中泛型标记符
- E -Element(在集合中使用,因为集合中存放的是元素)
- T -Type(java类)
- K -key(键)
- V -Value(值)
- N -Number(数值类型)
- ? -表示不确定的java类型 Math类常用的方法
1.abs()
作用:该方法用于计算绝对值
实例
`
int num =1;
System.out.print(Math.abs(num))
结果: 1
2.sqrt()
作用:该方法用于计算方根
实例:
int a = 4;
System.out.print(Math.sqrt(num))
结果2.0
3.ceil()
作用:该方法用于向上取整
实例:
float b = 5.1f;
System.out.print(Math.ceil(b));
结果6.0
4.floor()
作用:该方法用于向下取整
示例:
float b = 5.1f;
System.out.print(Math.floor(b))
结果: 5.0
5.round()
作用:该方法用于计算小数进行四舍五入的结果
示例:
`
float d = 5.4f
System.out.println(Math.round(d))
结果:5
6.max()、min()
作用:计算两个数的较大较小值
示例:
int e = 6;
System.out.println(Math.max(e,7));
System.out.println(Math.min(e,7));
`
结果:7,6
7.random()
作用:该方法用于生成一个大于0.0小于1.0的随机值。
示例:
System.out.println(Math.random());
结果: 0.9515596928882306
8.pow()
作用:该方法用于计算指数函数的值。
示例:
int f = 7;
System.out.println(Math.pow(f,2));
结果:49.0
什么是OOM:
OOM 即 out of memory,内存用完了。当JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经乜有空间可回收时,就会抛出这个error。(非exception,因为这个问题已经严重到不足以被应用处理)
为什么会OOM:
1.分配的少了,比如虚拟机本身可以使用内存太少(一般通过启动时的VM参数指定)。 2.应用的太多,并且用完没有释放,浪费了。此时就会造成内存泄漏,或者内存溢出。
内存泄漏:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄漏了,因为申请者不用了,而又不能被虚拟机分配给别人用。
内存溢出:申请内存超出了JVM能提供的内存大小,此时称之为溢出。
GC:java语言中,由于存在垃圾自动回收机制,所以我们一般不用去主动释放不用的对象所占用的内存,也就是理论上来说,是不会存在内存泄漏,但如果编码不当,比如,将某个对象的引用放到全局的Map中,虽然方法结束了,但是由于垃圾回收会根据对象的引用情况来回收内存,导致该对象不能被及时的回收。
OOM的类型
最常见的OOM情况有一下三种:
java堆内存溢出,此时情况最常见,一般由于内存泄漏或者堆的大小设置不当引起。而堆大小可以通过虚拟机参数-Xms,-Xmx等修改
java永久代溢出,一般出现大量的Class或者jsp页面,或者采用了cglib反射机制的情况,因为上述情况会产生大量的Class信息存储与方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
不会跑OOM error,但也是比较常见的java内存溢出,java虚拟机栈溢出,一般是有与程序中存在死循环或这深度递归调用造成的。栈大小设置太小也会出现这种溢出,可以通过虚拟机参数-Xss设置栈的大小。
自动封箱与自动拆箱理解吗?原理是什么?
什么是自动拆装箱?
装箱:将基本类型用他们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
举例:
Integer i = 10; //装箱
int n = i; //拆箱;
从字节码中来看,装箱其实就是调用了包装类的valueOf()方法,拆箱其实就是调用了xxxValue()方法。 因此
Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue();
如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。