Java 基础

J2EE-J2SE-J2ME区别

J2EE(Java 2 Platform Enterprise Edition)企业版
​ 是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 Servlet Jsp等,主要针对于Web应用程序开发。
J2SE(Java 2 Platform Standard Edition)标准版
​ 是为开发普通桌面和商务应用程序提供的解决方案。该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
J2ME(Java 2 Platform Micro Edition)小型版
​ 是为开发电子消费产品和嵌入式设备提供的解决方案。该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。

JDK-JRE-JVM的区别

JVM(Java Virtual Machine Java虚拟机)
可以理解为是一个虚拟出来的计算机,具备着计算机的基本运算方式,
它主要负责将java程序生成的字节码文件解释成具体系统平台上的机器指令。
让具体平台如window运行这些Java程序。

JRE(Java Runtime Environment Java运行环境)
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,
如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

JDK(Java Development Kit Java开发工具包)
JDK是提供给Java开发人员使用的,其中包含了java的开发工具,
也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。
其中的开发工具包括编译工具(javac.exe) 打包工具(jar.exe)等

简单而言:使用JDK开发完成的java程序,交给JRE去运行。
三者关系:

JVM:将字节码文件转成具体系统平台的机器指令。

JRE:JVM+Java语言的核心类库。

JDK:JRE+Java的开发工具。

equal和“==”的区别

==:在直接值比较是比较值的大小,在引用值比较时比较值的地址是否相同
equal :比较值是否相等

windows和linux文件路径问题

windows平台:用\或\
linux平台:用/

main方法

1
2
3
public static void main(String[] args) {  

}

public:表示此方法可以被外部所调用

static:表示此方法可以由类名称直接调用

void:主方法是程序的起点,所以不需要任何返回值

main:系统规定好默认调用的方法名称,执行的时候,默认找到main方法名称

String args [] :表示的是运行时的参数,参数传递的形式:java类名称 参数1 参数2 参数3..

常见的关键字

java注释

  • 单行注释(line comment)用//表示
  • 多行注释(block comment)用/**/表示
  • 文档注释用/*/表示,是java特有的注释

java数据类型

  • 基本数据类型

    • byte/8
    • char/16
    • short/16
    • int/32
    • float/32
    • long/64
    • double/64
    • boolean/~ boolean 只有true 和 false 用 1 bit 来存储

    包装类型

    基本类型都有对应的包装类,基本类型和其对应的包装类型之间的赋值使用自动装箱和拆箱完成,Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据。

    1
    2
    Integer x = 2;     // 装箱  
    int y = x; // 拆箱
    基本数据类型 对应的包装类
    byte Byte
    short Short
    int Integer
    long Long
    char Character
    float Float
    double ouble
    boolean Boolean

缓存池

new Integer(123) 与 Integer.valueOf(123) 的区别在于:

  • new Integer(123) 每次都会新建一个对象;

  • Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
    例如:Integer a = 10;
    调用的就是Integer.valueof()方法(自动装箱调用这个方法)
    默认的缓冲池的大小是-128到+127(可以在JVM的启动参数中修改)
    valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。

    1
    2
    3
    4
    5
    public static Integer valueOf(int i) {  
    if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
    }

    所有整数类型的类都有类似的缓存机制,基本类型对应的缓冲池如下:

  • boolean values true and false

  • all byte values

  • short values between -128 and 127

  • int values between -128 and 127

  • char in the range \u0000 to \u007F

String

1. 数字转字符串

  • 使用string 类的valueof方法
  • 将数字装箱为基本类型,调用tostring方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestNumber {  

public static void main(String[] args) {
int i = 5;

//方法1
String str = String.valueOf(i);

//方法2
Integer it = i;
String str2 = it.toString();

}
}

2. 数字转字符串

调用Integer的静态方法parseInt

1
2
3
4
5
6
7
8
9
10
11
12
public class TestNumber {  

public static void main(String[] args) {

String str = "999";

int i= Integer.parseInt(str);

System.out.println(i);

}
}

String Intern方法

仅考虑jdk1.8

如果字符串常量池不存在对应的常量,则将

修饰符访问权限

访问权限控制:

public > protected > default > private

所有->其他包的非子类无法访问->子类无法访问->仅限本类

类修饰符:

public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。

abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。

final,将一个类生命为最终(即非继承类),表示他不能被其他类继承。

friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类。

成员变量修饰符:

public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。

private(私有访问控制符)指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。

protected(保护访问控制符)指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量。

friendly ,在同一个包中的类可以访问,其他包中的类不能访问。

final,最终修饰符,指定此变量的值不能变。

static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。

transient(过度修饰符)指定该变量是系统保留,暂无特别作用的临时性变量。

volatile(易失修饰符)指定该变量可以同时被几个线程控制和修改。

方法修饰符:

public(公共控制符)

private(私有控制符)指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类)

protected(保护访问控制符)指定该方法可以被它的类和子类进行访问。

final,指定该方法不能被重载。

static,指定不需要实例化就可以激活的一个方法。

synchronize,同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。

native,本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的。

访问权限控制

访问权限控制: 指的是本类及本类内部的成员(成员变量、成员方法、内部类)对其他类的可见性,即这些内容是否允许其他类访问。

Class和Object类

Class类

Class类也是类的一种,内容是创建的类的类型信息,Class只能由JVM去创建,没有public构造函数。

获取Class对象的方法

1
2
3
4
5
//使用forName()方法
Class obj= Class.forName("shapes");
//使用getClass()方法
Class obj=s1.getClass();
Class obj1=s1.getSuperclass();

Objetc类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
2.getClass方法
final方法,获得运行时类型。
3.toString方法
该方法用得比较多,一般子类都有覆盖。
4.finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
5.equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
6.hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
7.wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
1)其他线程调用了该对象的notify方法。
2)其他线程调用了该对象的notifyAll方法。
3)其他线程调用了interrupt中断该线程。
4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8.notify方法
该方法唤醒在该对象上等待的某个线程。
9.notifyAll方法
该方法唤醒在该对象上等待的所有线程。

编码

字符集和编码规范:

字符集: Unicode,为每个字符分配一个唯一的id(码点)

编码规范: UTF-8,将码点转换成字节序列的规则

多态和多态绑定

一个对象变量可以指示多种实际类型的现象称为多态,在运行时能够自动选择适当的方法称为动态绑定

理解方法调用

假设调用x.f(args),x声明为类C的一个对象,则调用方法的详细过程为:

  1. 编译器查看对象的声明类型和方法名,列举所有名为f的方法和父类中所有名为f的方法
  2. 确定方法调用中的参数类型,如果存在与提供类型完全匹配的方法,则选择这个方法,这个过程称为重载解析

为什么要重写hashcode和equals方法

  1. 重写equals方法是为了比较两个不同对象的值是否相等
  2. 重写hashCode是为了让同一个Class对象的两个具有相同值的对象的Hash值相等。
  3. 同时重写hashCode()与equals()是为了满足HashSet、HashMap等此类集合的相同对象的不重复存储。

java类加载器加载顺序

BootstrapClassLoader 启动类加载器,加载$JAVA_HOME中jre/lib/rt.jar

ExtensionClassLoader 标准扩展类加载器

AppClassLoader 系统类加载器 加载classPath下面的指定的jar包和class


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!