位置:首页 > 后端 > java

Java基础不得不知的那点事

dearweb 发布:2021-08-27 11:06:02阅读:


1、常见数据类型及长度

(1)Java基本数据类型

1个字节等于8位

 byte(字节型) 1(字节) -128~127

short(短整型) 2 (字节) -32768~32767

int(整型) 4 (字节)

long(长整型) 8(字节)

float(浮点型) 4(字节)

double(双精度) 8(字节)

char(字符型) 2(字节)

 boolean(布尔型) true/false


(2)引用数据类型 

类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型


2、基本数据类型和引用数据类型的区别

2.1 存储位置

(1)基本数据类型

  在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的

(2)引用数据类型

  只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址


2.2 传递方式

(1)基本数据类型

  在方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的

(2)引用数据类型

  引用数据类型变量,调用方法时作为参数是按引用传递的


3、Java 值传递与引用传递


(1)实参与形参

  在调用方法之前,会先创建一个形参,实参将自身的值拷贝一份,将拷贝的副本传给形参供方法使用。

(2)基本类型和引用类型的不同之处

  基本类型,值就直接保存在变量中。

  引用类型,变量中保存的只是实际对象的地址。

(3)赋值运算符"="的作用

  对于基本类型,赋值运算符会直接改变变量的值,原来的值被覆盖掉。

  对于引用类型,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。


 代码分析:


(1)基本类型

void foo(int value) {
    value = 100;
}
foo(num); // num 没有被改变

(2)虽然是引用类型传递,但是String类型改变值等于重新new一个对象


void foo(String text) {
    text = "windows";
}
foo(str); // str 也没有被改变

(3)提供了改变自身方法的引用类型

StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder.append("4");
}
foo(sb); // sb 被改变了,变成了"iphone4"。

image.png

(4)提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符


StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。

image.png

builder = new StringBuilder(“ipad”); 之后:

image.png


(5)引用类型传递

public class TestPropagationReferenceObject {
    static class People {
        int age;
    }
    static void changeAge(People people){
        people.age = 30;
    }
    public static void main(String[] args) {
        // 函数改变了形参指向的值,实参变量也指向了他,所以实参变量的值发生了改变
        People people = new People();
        people.age = 20;
        System.out.println(people.age); // 20
        changeAge(people);
        System.out.println(people.age); // 30
        // 函数只是改变了形参对象之间的地址,并未影响到原实参变量的数值
        People people1 = new People();
        people1.age = 40;
        People people2 = new People();
        people2.age = 45;
        System.out.println(people1.age + "," + people2.age); // 40,45
        exChangePeopleAge(people1,people2);
        System.out.println(people1.age + "," + people2.age); // 40,45
    }
    static void exChangePeopleAge(People p1,People p2){
        People temp = p1;
        p1 = p2;
        p2 = temp;
    }
}


4、int与Integer的区别

(1)Integer是int提供的封装类,而int是Java的基本数据类型;

(2)Integer默认值是null,而int默认值是0;

(3)声明为Integer的变量需要实例化,而声明为int的变量不需要实例化;

(4)Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值。


5、Java中“==”与“equals”的区别

(1)“==”是判断符号两个变量(Object)是否指向同一内存地址;“equals”判断两个object是否一样。

(2)用String或者int直接声明的变量是放在常量池的,所以即使声明多个相同常量其内存地址是指向的同一个地址。

(3)而new的对象则是放在了内存heap区,所以有时其内容object相等,但是内存地址不相等。


6、Java中String、StringBuffer、StringBuilder有什么区别

在这方面运行速度快慢为:StringBuilder > StringBuffer > String

(1)String:适用于少量的字符串操作的情况(String类似是final的,每次操作改变对象值虚拟机就会在内存中重新创建常量对象,所以导致速度最慢)

(2)StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况(每次操作改变对象值虚拟机不会重新创建常量对象,但在多线程中不能保证线程安全)

(3)StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况(相当于线程安全的StringBuilder)


7、Java的Object类里面有哪些方法

protected Object clone() 

  创建并返回此对象的一个副本。 

boolean equals(Object obj) 

  指示某个其他对象是否与此对象“相等”。 

protected void finalize() 

  当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 

Class<? extendsObject> getClass() 

  返回一个对象的运行时类。 

int hashCode() 

  返回该对象的哈希码值。 

void notify() 

  唤醒在此对象监视器上等待的单个线程。 

void notifyAll() 

  唤醒在此对象监视器上等待的所有线程。 

String toString() 

  返回该对象的字符串表示。 

void wait() 

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 

void wait(long timeout) 

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。 

void wait(long timeout, int nanos) 

  导致当前的线程等待,直到其他线程调用此对象的 notify()


8、Jdk、Jre、Jvm有什么关系和区别

(1)JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,具体的下文会详细说明。

(2)JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。

(3)JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。

  显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。


24人点赞 返回栏目 提问 分享一波

小礼物走一波,支持作者

还没有人赞赏,支持一波吧

留言(问题紧急可添加微信 xxl18963067593) 评论仅代表网友个人 留言列表

暂无留言,快来抢沙发吧!

本刊热文
网友在读
手机扫码查看 手机扫码查看