记录生活中的点点滴滴

0%

Java基础盲区(一)

JVM、JRE、JDK

JVM(Java Virtual Machine):Java虚拟机,是Java程序的运行环境。

JRE(Java Runtime Environment):Java程序运行时环境,包含JVM和核心类库。

JDK(Java Development Kit):Java程序开发工具包,包含JRE和开发人员工具。

image-20200310222039952

编译:将我们编写的Java源文件翻译成JVM认识的.class文件。

运行:将class文件交给JVM去运行,此时JVM就会执行我们编写的程序了。

Java中数据类型

image-20200310222750464

注意:

  • 字符串不是基本类型,而是引用类型
  • 浮点数默认double,整形默认int

Java中的内存划分

  1. 栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈当中进行。局部参数一旦超出作用域立即从栈中消失。
  2. 堆(Heap):凡是new出来的东西都在堆里面。堆内存里面的东西都有一个16进制的地址值。堆里面的数据都有默认值规则:如果是整数,默认为0,浮点数默认为0.0,字符默认是’\u0000‘,布尔为false,引用类型为null
  3. 方法区(Method Area):存储.class相关信息,包含方法的信息。
  4. 本地地方栈(Native Method Stack):与操作系统有关。
  5. 寄存器(pc Register):与CPU相关。

image-20200310224030912

局部变量和成员变量

  1. 定义的位置不一样

    • 局部变量:在方法的内部
    • 成员变量:在方法的外部,直接在类当中
  2. 作用范围不一样

    • 局部变量:只有方法当中才可以使用,出了方法就不能用
    • 成员变量:整个类都可以通用
  3. 默认值不一样

    • 局部变量:没有默认值,如果要使用,必须手动赋值
    • 成员变量:如果没有赋值,会有默认值
  4. 内存位置不一样

    • 局部变量:位于栈内存
    • 成员变量:位于堆内存
  5. 生命周期不一样

    • 局部变量:随着方法进栈而诞生,随着方法出栈而消失
    • 成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

标准类要有以下四部分

  • 所有的成员变量都要使用private关键字修饰

  • 为每一个成员变量编写一对getter/setter方法

  • 编写一个无参数的构造方法

  • 编写一全无参数的构造方法

    注意:类中对于Stringint等类型,例如

    1
    2
    private String name;
    private int age;

    的getter/setter方法为:getNamesetNamegetAgesetAge

    但对于boolean类型,例如

    1
    private boolean male;

    的getter/setter方法为:isMalesetMale

关于泛型

泛型只能是引用类型,不能是基本类型,若要用基本类型,则必须使用包装类

byte–>Byteint–>Integer(特殊)、char–>Character(特殊)等等

1
2
ArrayList<Integer> arrayList = new ArrayList<>();//没有问题
ArrayList<int> arrayList1 = new ArrayList<>();//会报错

ArrayList常用方法

public boolean add(E e):向集合中添加元素,参数类型与泛型一致,返回布尔值。

public E get(int index):从集合中获取元素,参数是索引编号,返回值就是对应元素

public E remove(int index):从集合中删除元素,参数是索引编号,返回值就是对应删除元素

public boolean remove(E e):从集合中删除元素,参数是删除元素,返回布尔值

public int size():获取集合中包含元素个数

1
2
3
4
5
6
7
8
9
10
ArrayList<String> al = new ArrayList<>();
al.add("迪丽热巴");
al.add("古力娜扎");
al.add("马尔扎哈");
System.out.println(al);//[迪丽热巴, 古力娜扎, 马尔扎哈]
System.out.println(al.get(1));//古力娜扎
System.out.println(al.size());//3
System.out.println(al.remove("迪丽热巴"));//删除"迪丽热巴",返回true
System.out.println(al.remove(1));//删除索引为1的“马尔扎哈”,返回“马尔扎哈”
System.out.println(al);//[古力娜扎]

字符串常量池

程序当中直接写上的双引号字符串,就在字符串常量池中。

对于基本类型来说:== 是进行数值的比较

对于引用类型来说:== 是进行地址值的比较

注意:双引号直接写的字符串在常量池当中,new的不在常量池中

1
2
3
4
5
6
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2);//false
String str3 = "hello";
String str4 = "hello";
System.out.println(str3 == str4);//true

image-20200310231714139

字符串相关

字符串比较方法

  • equals()

    1
    2
    "abc".equals(str);//推荐
    str.equals("abc");//不推荐

    因为如果strnull时,第二种会报空指针异常,而第一种会正常返回false

  • equasIgnoreCase()

    忽略大小写的比较

字符串获取相关方法

public int length():获取字符串长度

public String concat(String str):拼接字符串

public char charAt(int index):获取指定位置的单个字符

public int indexOf(String str):查找参数在字符串中出现的首次索引位置,若没有返回-1

1
2
3
4
5
6
7
String str = "hello";
System.out.println(str.length());//5
str = str.concat("world");
System.out.println(str);//helloworld
System.out.println(str.charAt(8));//l
System.out.println(str.indexOf('w'));//5
System.out.println(str.indexOf('b'));//-1

字符串转换相关方法

public char toCharArray():将当前字符串拆分成字符数组作为返回值

public byte[] getBytes():获得当前字符串底层的字节数组

public String replace(charSequence oldString,charSequence newString):替换字符串

1
2
3
4
5
6
7
8
9
10
11
String str = "hello";
char[] chars = str.toCharArray();
System.out.println(chars[0]);//h
byte[] bytes = str.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i] + " ");//104 101 108 108 111
}
str.replace("hel","abc");//str字符串常量不会改变值
System.out.println(str);//hello //仍然是hello
String str2 = str.replace("hel","abc");//用str2来接收
System.out.println(str2);//abclo

字符串分割方法

public String[] split(String regex):按照参数的规则把字符串分成若干部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String str = "aaa,bbb,ccc";
String regex = "\\W";// \W 匹配任意不是字母、数字、汉字或下划线的字符
String[] strs = str.split(regex);
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}

String ch = ",";
String[] strs2 = str.split(ch);
for (int i = 0; i < strs2.length; i++) {
System.out.println(strs2[i]);
}
/*输出都是aaa
bbb
ccc
*/

注意:split方法的参数其实是一个正则表达式

关于静态代码块

第一次用到本类时,静态代码块执行唯一的一次。静态内容的执行总是优于非静态,所以静态代码块比构造方法先执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
{
System.out.println("普通代码块执行");
}
static {
System.out.println("静态代码块执行");
}
}
public class demo {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
}
}

输出为:

1
2
3
静态代码块执行
普通代码块执行
普通代码块执行