数组
静态初始化数组
- 静态初始化数组的格式
1 | 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...} |
“数据类型[] 数组名” 也可写成 “数据类型 数组名[] (C/C++的写法)”
数组名中存放的时数组的地址, 数组是引用数据类型
数组的访问
访问第index个数组元素:数组名[index]
获取数组的长度:数组名.length
动态初始化数组
初始化数组时,暂不存入元素,只确定数组类型和数组的长度
1 | 数据类型[] 数组名 = new 数据类型[数组长度]。 |
数组中的值在赋值前采用默认值
Java动态初始化数组的默认值规则
基本数据类型
数据类型 默认值 byte, short, char, int,long 0 float, double 0 boolean false 引用数据类型
类,接口,String, 数组等的默认值为null
静态初始化数组和动态初始化数组是独立的,不可以混用,以下写法错误:
1 | int[] ages = new int[3]{1, 2, 3}; //错误写法 |
Java数组的内存执行原理
java程序的执行原理
Java内存分配
划分JVM虚拟机为以下区域
- 方法区
- 存放编译后的class文件
- 栈内存
- 方法运行时所进入的内存,基本变量也在这里
- 堆内存
- new出来的东西会放在这块内存中开辟空间
- 本地方法栈
- 程序奇数器
数组变量在栈内存中, 数组元素的空间在堆内存中。
多个变量指向同一个数组的问题
1 | int[] arr1 = {1,3,6}; |
1 | arr2[1] = 99 |
面向对象基础
- 一个代码文件中,可以写多个class类,但只能一个用public修饰
- public修饰的类名必须成为代码文件名
- 如果一个对象没有一个变量引用它,它将无法被操作,该对象成为垃圾对象。
- Java存在自动垃圾回收机制,会自动清除垃圾对象。
this关键字
定义了有参构造器之后,Java就不会自动生成无参构造器,此时最好自己定义一个无参构造器
封装的设计规范
合理隐藏、合理暴露
使用private隐藏属性,设定合理的get, set方法访问属性。
对象的方法根据业务需求暴露必须暴露的方法
JavaBean(实体类)
- 是一种特殊形式的类
- 成员变量都要私有,并且对外提供相应的get,set方法
- 类中必须有一个公共的无参构造器(无定义有参构造器的情况下,会自动提供无参构造器) (其他构造器可写可不写)
- 通常没有其他成员
- 应用场景:实体类只负责数据存取,而队数据的处理交给其他类完成,实现数据和业务处理相分离。
成员变量和局部变量的区别
| 区别 | 成员变量 | 局部变量 |
|---|---|---|
| 位置不同 | 类中,方法外 | 常见于方法中,{}内 |
| 初始化值不同 | 有默认值 | 没有默认值,使用前必须复制 |
| 内存位置不同 | 堆内存 | 栈内存 |
| 作用域不同 | 整个对象 | 在所归属的大括号中 |
| 声明周期不同 | 与对象共存亡 | 与{}(方法调用)共存亡,随{}执行结束而结束 |
包
- 包是分门别类管理程序的。
- 调用其他包下程序的注意事项
- 如果当前程序中,要调用自己所在包下的其他程序,可以直接调用。(同一个包下的类,互相可以直接调用)
- 如果当前程序中,要调用其他包下的程序,则必须在当前程序中导包,才可以访问!导包格式:import 包名.类名
- 如果当前程序中,要调用lava提供的程序,也需要先导包才可以使用:但是lava.lang包下的程序是不需要我们导包的,可以直接使用
- 如果当前程序中,要调用多个不同包下的程序,而这些程序名正好一样,此时默认只能导入一个程序,另一个程序必须带包名访问。
Java常用API
String
创建方式
- 方式1(常用)
1
String name = "小黑"
方式2 构造器
1
2
3
4
5
6
7public String() //创建空字符串
public String(String original)
public String(char[] chars)
public String(byte[] bytes )
String的常用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public int length(), public char charAt(int index)
public char[] toCharArray() //转换成字符数组返回
public boolean equals(Object anObject) //判断当前字符串与另一字符串的内容是否一样
public boolean equalsIgnoreCase(String anotherString) //判断是否内容相同,忽略大小写
public String subString(int beginIndex, int endIndex) //截取字符串得到子串,左闭右开区间
public String subString(int beginIndex) //截取当前位置到末尾的子串
public String replace(CharSequence target, CharSequence replacement) //替换字符串中的值,得到新字符串
public boolean contains(CharSequence s) //判断是否包含字符串s
public boolean startsWith(String prefix) //判断字符串是否以prefix字符串开头
public String[] split(String regex) //分割字符串,得到字符串数组
注意事项
- String对象是不可变的,其内容不可变。
- 以“…”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符只会存储一份;
- 通过new 方式创建字符串对象,没new一次都会产生一个新的对象放在堆内存中
1
2
3
4
5
6
7
8String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);// true
char[] a = {'a','b',c};
String s1 = new String(a);
String s2 = new String(a);
System.out.println(s1 == s2);//false
1 | String s2 = new String("abc") ;//创建2个对象,在常量池一个,堆内存一个。 |
1 | String s1 = "abc"; |
ArrayList(泛型类 )
大小可变, 而数组定义之后长度固定
构造器
1
2
3
4
5ArrayList() //构造一个初始容量为10的空列表(会自动增加容量), 常用
ArrayList(int initialCapacity) //构造执行初始容量的空列表
ArrayList(Collection<? extends E> c) //按照集合的迭代器返回的顺序构造一个指定集合的列表常用方法: 增删改查 可以存放任意类型数据
约束数据类型
1
2
3ArrayList list = new ArrayList();// 可以存放任意不同的数据类型
ArrayList<String> list = new ArrayList<String>();//只能存放String数据类型
ArrayList<String> list = new ArrayList<>();//jdk1.7以上也可以这么写
- 本文链接: http://blogs.yovr.top/JavaSE2/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。