1,Long类型
必须带后缀l或者L,最好用大写的。long类型,可以不用带后缀,但是会把int转化为long类型,所以如果超过int范围就会报错,所以最好加上后缀。比如:
System.out.println(Long.MAX_VALUE);
long L = 9223372036854775807;//报错
long L1 = 9223372036854775807L;//通过
Long.MAX_VALUE是9223372036854775807
2.包装类型
默认值为null,比如JavaBean中,Integer类型没有值,默认为null。基本类型int,则默认为0。
3,字段串“==”和equals的比较
String a = "a";
String b = new String("a");
if(a == b){
System.out.println("a == b" + " : equals");
}else{
System.out.println("a == b" + ": not equals");
}
if(a.equals(b)){
System.out.println("a equals b" + " : equals");
}else{
System.out.println("a equals b" + ": not equals");
}
String c = "c";
String d = "c";
if(c == d){
System.out.println("c == d" + " : equals");
}else{
System.out.println("c == d" + ": not equals");
}
//output:
a == b: not equals
a equals b : equals
c == d : equals
字符串比较一定不能用 “==”,这个只能确定两个字符在同一个位置上。当然如果在同一个位置上,必然相等。要用equals方法。
整型“==”和equals的的比较
Integer a = 1;
Integer b = 1;
if(a.equals(b)){
System.out.println("a.equals(b)" + ":equals");
}else {
System.out.println("a.equals(b)" + ":not equals");
}
if(a == b){
System.out.println("a == b" + ":equals");
}else {
System.out.println("a == b" + ":not equals");
}
Integer c = new Integer(1);
Integer d = new Integer(1);
if(c.equals(d)){
System.out.println("c.equals(d)" + ":equals");
}else {
System.out.println("c.equals(d)" + ":not equals");
}
if(c == d){
System.out.println("c == d" + ":equals");
}else{
System.out.println("c == d" + ":not equals");
}
output:
a.equals(b):equals
a == b:equals
c.equals(d):equals
c == d:not equals
Integer常量赋值和new Integer对象是不一样的。
4,BigDecimal
BigDecimal a = new BigDecimal("0.02");
BigDecimal b = new BigDecimal(0.02);
System.out.println(a);
System.out.println(b);
output:
0.02
0.0200000000000000004163336342344337026588618755340576171875
要准确的,以字符串的形式。
5、String,StringBuffer ,StringBuilder
String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {}
private final char value[];//string存储在char数组中。
String
类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
String的定义,不可变的类。
字符串常量池(String pool, String intern pool, String保留池) 是Java方法区中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。
如下面的代码所示,将会在堆内存中只创建一个实际String对象.
例如:
String s1 = "abcd";
String s2 = "abcd";
参考:https://blog.csdn.net/ylyg050518/article/details/52352993
StringBuffer
线程安全的可变字符序列。一个类似于 String
的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer
上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert
方法则在指定的点添加字符。
与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
StringBuilder
一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。
在 StringBuilder
上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append
方法始终将这些字符添加到生成器的末端;而 insert
方法则在指定的点添加字符。
将 StringBuilder
的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer
。
Java中的String,StringBuilder,StringBuffer三者的区别:https://www.cnblogs.com/su-feng/p/6659064.html
参考:http://www.importnew.com/18633.html
7,基本类型优于装箱基本类型
先看两个例子:
Long sum = 0L;
long start = System.currentTimeMillis();
for(long i = 0;i < Integer.MAX_VALUE;i++){
sum +=i;
}
long end = System.currentTimeMillis();
System.out.println(sum);
System.out.println(end - start + "ms");
output:
2305843005992468481
5508ms
long sum = 0L;
long start = System.currentTimeMillis();
for(long i = 0;i < Integer.MAX_VALUE;i++){
sum +=i;
}
long end = System.currentTimeMillis();
System.out.println(sum);
System.out.println(end - start + "ms");
output:
2305843005992468481
612ms
很明显,第二个比第一个快了很多,因为第一个用的是大写的Long类型。变量被反复的装箱和拆箱,导致性能明显下降。
参考:《effective java 2th》
8,static
thingKing in java : 希望某个方法不与包含它的类的任何方法关联在一起。两个术语:类数据和类方法。他们作为整个类,而不是类的某个特定对象而存在的。
有四种用法:
1)static变量
2)static方法
3)static块
4)static导入包
1)static变量:
package com.test.basicJava; public class StaticTest { static int x = 1; public StaticTest(){ this.x = 2; } public void setValue(int i){ this.x = i; } public int getValue(){ return this.x; } public static void main(String[] args) { System.out.println(StaticTest.x); StaticTest test1 = new StaticTest(); StaticTest test2 = new StaticTest(); test1.setValue(3); test1.setValue(4); System.out.println(test1.getValue()); System.out.println(test1.getValue()); } }
输出:1,4,4
解释:StaticTest.x只有一份空间。test1.x和test2.x指向同一存储空间。
2)static方法
thinking in java:static方法一个重要用法就是在不创建任何对象的情况下,可以调用它。这一点对定义main()方法很重要,是一个应用时的入口点。
public class StaticTest { public static void staticMethod() { System.out.println("static method test"); } public static void main(String[] args) { StaticTest.staticMethod(); } }
output: static method test
3)static块:
public class StaticTest { static { System.out.println("static block"); } public static void staticMethod() { System.out.println("static method test"); } public static void main(String[] args) { // StaticTest test = new StaticTest(); StaticTest.staticMethod(); } }
以下情况会输出static块的内容:1,new对象;2,调用static方法;3extends父类,父类的static block会输出。
4)static导入包
import static ..... 比较少用。
参考:https://www.cnblogs.com/dolphin0520/p/3799052.html,https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral
9 final
通常指的是“这是无法改变的”。有三种用法:数据,方法和类。
1)数据
用在:一个永不改变的编译时常量;一个在运行时被初始化的值,而你不希望它被改变。
一个即是static有时final的域只占据一段不可改变的存储空间。变量名常用大写字母表示,比如: private static final int VALUE = 1;
2)方法
把方法锁定,确保在继承中使方法行为保持不变,并且不会被覆盖。
3)类
final类禁止覆盖,不希望有子类。
10 数据类型
11 n次幂运算
有两种方式:左移运算,Math.pow()方法。比如求2的4次幂
System.out.println( 2 << 3); System.out.println( Math.pow(2, 4)); output:65536 65536.0
2用二进制表示 : 0000 0010
向左移动三位变成:0001 0000
转化成十进制就是 2的四次幂= 16