ArrayList类
1.数组的长度不可以发生改变,但是ArrayList集合的长度是可以随意变化的。
2.对于ArrayList来说,有一个尖括号代表泛型。
泛型:也就是装在集合当中的所有元素,全都是同一的什么类型。
tip:泛型只能是引用类型,不能是基本类型。
3.一丢丢注意事项:
对于ArrayList集合来说,直接打印得到的不是地址值,而是内容。如果内容为空,得到的是空的中括号[]。
- 创建及使用:
// 创建了一个ArrayList集合,集合名称是list,里面装的全都是String字符串类型的数据。
// 备注:从 JDK 1.7开始,右侧的尖括号内部可以不写内容,但是<>本身还是要写的。
ArrayList<String> list = new ArrayList<>();
System.out.println(list);// []
// 向集合中添加一些数据,需要用到add方法。
list.add("小明");
System.out.println(list);// [小明]
list.add("Danny");
list.add("Li Ming");
System.out.println(list);// [小明, Danny, Li Ming]
ArrayList集合常用的方法和遍历
(1)常用的方法:
- public boolean add(E e):向集合当中添加元素,参数的类型和泛型一致。返回值代表添加是否成功。
备注:对于ArrayList集合来说,add添加动作一定是成功的,所以返回值可用可不用。但是对于其他集合来说(以后xue)来说,add添加动作不一定成功。 - public E get(int index):从集合当中获取元素,参数是索引编号,返回值就是对应位置的元素。(索引值从0开始)
- public E remove(in index):从集合当中删除元素,参数是索引编号,返回值就是被删除的元素。(索引值从0开始)
- public int size():获取集合的尺寸长度,返回值是集合中包含的元素个数。
栗子:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
System.out.println(list);// []
list.add("Jenny");
list.add("Danny");
list.add("Hanpi");
list.add("Tiedan");
System.out.println(list);// [Jenny, Danny, Hanpi, Tiedan]
// 从集合中获取元素,:get。索引值从0开始
String name = list.get(2);
System.out.println("第2号索引位置是:" + name);// 第2号索引位置是:Hanpi
// 从集合中删除元素:remove.
String whoRemoved = list.remove(2);
System.out.println("被删除的人是:" + whoRemoved);// 被删除的人是:Hanpi
System.out.println(list);// [Jenny, Danny, Tiedan]
// 获取长度
int size = list.size();
System.out.println("集合的长度是:" + size);// 集合的长度是:3
}
(2)遍历
栗子:
public static void main(String[] args) {
// 创建一个list集合,并且添加一些数据
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// 遍历输出 (list.fori)
// 结果是A, B, C, D
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
ArrayList集合存储基本类型数据
前提:如果希望向集合ArrayList中存储基本类型数据,必须使用进本类型对应的“包装类”。
基本类型 | 包装类(引用类型,包装类都位于java.lang包下) |
byte | Byte |
short | Short |
int | Integer【特殊】 |
long | Long |
float | Float |
double | Double |
char | Character【特殊】 |
boolean | Boolean |
tip:从JDK 1.5开始,支持自动装箱,自动拆箱。
- 自动装箱:基本类型–》包装类型
- 自动拆箱:包装类型–》基本类型
栗子:
public static void main(String[] args) {
// 创建
ArrayList<Integer> listC = new ArrayList<>();
// 添加数据
listC.add(998);
listC.add(648);
// 获取数据
int num0 = listC.get(0);
int num1 = listC.get(1);
System.out.println(num0);// 998
System.out.println(num1);// 648
}
字符串
- java.lang.String类代表字符串
- API当中说:Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。
- 其实就是说:程序当中所有的双引号字符串,都是Sting类的对象。(就算没有new,也照样是。)
字符串的特点:
1.字符串的内容用不可变。【重点】
2.正是因为字符串不可改变,所以字符串是可以共享使用的。
3.字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
创建字符串的常见3+1种方式:
(1)三种构造方法:
- public String():创建一个空白字符串。
- public Stirng(char[] array):根据字符数组的内容,来创建对应的字符串。
- public String(byte[] array):根据字结数组的内容,来创建对应的字符串。
栗子:
public static void main(String[] args) {
// 使用空参构造
String str1 = new String();
System.out.println(str1);
// 根据字符数组创建字符串
char[] charArray = { 'A', 'B', 'C' };
String str2 = new String(charArray);
System.out.println(str2);// ABC
// 根据字节数组创建字符串
byte[] byteArray = { 97, 98, 99 };
String str3 = new String(byteArray);
System.out.println(str3);// abc
}
(2)一种直接创建:
String str = “viki”;
tip:直接写上双引号,就是字符串对象。
字符串的常量池
字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中。
tips:
1.对于基本类型来说,==是进行【数值】的比较。
2.对于引用类型来说,==进行的是【地址值】的比较。
3.双引号直接写的字符串在常量池当中,new的不在池当中。
栗子:
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = { 'a', 'b', 'c' };
String str3 = new String(charArray);
System.out.println(str1 == str2);// true
System.out.println(str2 == str3);// false
System.out.println(str1 == str3);// false
}
字符串的比较相关方法
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法:
1)public boolean equals(Objuct obj):
参数可以是任何对象,只有参数是一个字符串并且内容相同的,才会给true,否则返回false。
注意事项:
1.任何对象都能用Object进行接收。
2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。
3.如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
- 推荐:“abc”.equlas(str)
- 不推荐:str.equals(“abc”)
2)public boolean equalsIgnoreCase(String str):
忽略大小写,进行内容比较。
栗子:
String stra = "Abc";
String strb = "abc";
System.out.println(stra.equalsIgnoreCase(strb));// true
字符串的获取相关方法
- public int length():获取字符串当中含有的字符个数,拿到字符串长度。
- public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。
- public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始)
- public int indexOf(String str):查找字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。
栗子:
public static void main(String[] args) {
// 获取字符串长度
int length = "Secret Garden".length();
System.out.println(length);// 13
// 拼接字符串
String str1 = "hello";
String str2 = "world";
String str3 = str1.concat(str2);
System.out.println(str1);// hello
System.out.println(str2);// world
System.out.println(str3);// helloworld
// 获取指定索引位置的单个字符
char c = "Secret".charAt(2);
System.out.println(c);// c
//查找字符串在本字符串当中首次出现的索引位置
int index1 = "Secret Garden".indexOf("t G");
int index2 = "Secret Garden".indexOf("abb");
System.out.println(index1);// 5
System.out.println(index2);// -1
}
字符串的截取方法
- public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串。
- public String substring(int begin, int end):截取从begin开始,一直到end结束,中间的字符串。
备注:[begin,end),包含左边,不包含右边。
栗子:
public static void main(String[] args) {
String str1 = "HelloWorld";
String str2 = str1.substring(5);
String str3 = str1.substring(4,7);
System.out.println(str2);// World
System.out.println(str3);// oWo
// 下面这种写法,字符串的内容是没有改变的
// str4中保存的是地址值
// 地址值由hello的地址值变成了it's me的地址值
String str4 = "hello";
System.out.println(str4);// hello
str4 = "it's me";
System.out.println(str4);// it's me
}
字符串的转换相关方法
咳咳(字符数组:每个元素都是字符的数组。)
- public char[] toCharArray():将当前字符串拆分为字符数组作为返回值。
- public byte[] getBytes():获得当前字符串底层的字节数组。
- public String replace(CharSequence oldString, CharSequence newString):将所有出现的老字符串替换为新的字符串,返回替换之后的结果新字符串。
备注:CharSequence意思就是说可以接受字符串类型。
栗子:
public static void main(String[] args) {
// 转换为字符数组
char[] chars = "Hello".toCharArray();
System.out.println(chars[0]);// H
System.out.println(chars.length);// 5 字符数组的lenth没有括号
// 转化为字节数组
byte[] bytes = "abcd".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);// 97 98 99 100
}
// 字符串的内容替换
String str1 = "What do you mean?";
String str2 = str1.replace("a", "*");
System.out.println(str2);// Wh*t do you me*n?
}
字符串的分割方法
- pubic String[] split(String regex):按照参数的规则,讲字符串切分为若干部分。
注意事项:
split方法的参数其实是一个“正则表达式”,如果按照英文句点".“进行切分,必须写成”\."。
栗子:
public static void main(String[] args) {
String str1 = "uuu,hhh,oooo,nn";
String[] array1 = str1.split(",");
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);// uuu hhh oooo nn
}
String str2 = "aaa.bbb.ccc";
String[] array2 = str2.split("\\.");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);// aaa bbb ccc
}
}
静态static关键字概述
- 简述:一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份。
- 细讲:如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享一份数据。
static关键字修饰成员变量
Student类:
private String name;
private int age;
static String room;
主函数:
public static void main(String[] args) {
// 学生一
Student stu1 = new Student("Tommy",18);
stu1.room = "101";// 直接赋值
System.out.println("姓名:" + stu1.getName() + ",年龄:"+ stu1.getAge() + ",教室:" + stu1.room);
// 姓名:Tommy,年龄:18,教室:101
// 学生二
Student stu2 = new Student("viki",24);
System.out.println("姓名:" + stu2.getName() + ",年龄:"+ stu2.getAge() + ",教室:" + stu2.room);
// 姓名:viki,年龄:24,教室:101
}
静态static关键字修饰成员方法
- 一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。
- 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
- 如果有了static关键字那么不需要创建对象,直接就能通过类名称来使用它。
- 无论是成员变量,还是成员方法。如果有了static,都推荐使用类名称进行调用。
tips:
1.静态不能直接访问非静态。
原因:在内存当中,先有的静态内容,后有的非静态内容。(“先人不知道后人,但后人知道先人。”)
2.静态方法中不能用this。
原因:this代表当前对象,通过谁调用的方法,谁就是对象。
栗子:
public class MyClass {
int num;
static int numStatic;
// 成员方法
public void method() {
System.out.println("这是一个成员方法。");
}
// 静态方法
public static void methodStatic() {
System.out.println("这是一个静态方法。");
}
}
主函数:
public static void main(String[] args) {
// 首先创建对象
MyClass obj = new MyClass();
// 然后才能使用没有static关键字的内容
obj.method();// 这是一个成员方法。
// 对于静态方法来说,可以通过对象名来调用,也可以直接通过类名称类调用。
// 正确,不推荐。这种写法在编译之后也会被javac翻译成为“类名称.静态方法”
obj.methodStatic();// 这是一个静态方法。
// 正确,推荐
MyClass.methodStatic();// 这是一个静态方法。
}
静态代码块
格式:
public class 类名称 {
static {
//静态代码块的内容
}
}
特点:
- 当第一次使用到本类时,静态代码块执行唯一的一次。
- 静态内容总是优先于非静态,所以静态代码块比构造方法先执行。
典型用途:
用来一次性地对静态成员进行赋值。
数组工具类Arrays
java.util.Arrays是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作。
- public static String toString(数组):将参数数组变成字符串(按照默认格式:[元素1, 元素2,
元素3…])。 - public static void sort(数组):按照默认升序(从小到大)对数组的元素进行排序。
备注:
1.如果是数值,sort默认按照升序从小到大。
2.如果是字符串,sort默认按照字母升序。
3.如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持。(暂时不懂,以后学)
栗子:
public static void main(String[] args) {
int[] array1 = {3, 5, 1, 6, 4, 9};
// 将int数组按默认格式变成字符串。
String intStr = Arrays.toString(array1);
System.out.println(intStr);// [3, 5, 1, 6, 4, 9]
// 排序
Arrays.sort(array1);
System.out.println(Arrays.toString(array1));// [1, 3, 4, 5, 6, 9]
String[] array2 = {"bac", "acb", "cbb"};
Arrays.sort(array2);
System.out.println(Arrays.toString(array2));// [acb, bac, cbb]
}
数学工具Math类
java.lang.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学相关的操作。
- public static double abs(double num):获取绝对值
- public static double ceil(double num):向上取整
- public static double floor(double num):向下取整
- public static double round(double num):四舍五入
Math.PI:近似的圆周率常量(double)
栗子:
public static void main(String[] args) {
// 获取绝对值
System.out.println(Math.abs(-2.1));// 2.1
System.out.println(Math.abs(0));// 0
System.out.println(Math.abs(6.3));// 6.3
// 向上取整
System.out.println(Math.ceil(4.2));// 5.0
System.out.println(Math.ceil(-2.3));// -2.0
// 向下取整
System.out.println(Math.floor(6.7));// 6.0
System.out.println(Math.floor(6.0));// 6.0
// 四舍五入
System.out.println(Math.round(3.4));// 3
System.out.println(Math.round(3.5));// 4
System.out.println(Math.round(-2.5));// -2
System.out.println(Math.round(-2.6));// -3
}
继承的概述
- 继承是多态的前提,如果没有继承,就没有多态。继承主要解决的问题就是:共性抽取。
父类:又叫基类、超类。
子类:又叫派生类。
特点:
1.子类可以拥有父类的“内容”。
2.子类还可以拥有自己专有的内容。
继承的格式
(在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类来看待。
例如:父类是员工,子类是讲师,那么“讲师就是一个员工”。关系:is-a。)
定义父类的格式:
public class 父类名称 {
// ...
}
定义子类的格式:
public class 子类名称 extends 父类名称 {
// ...
}
继承中成员变量访问的特点
- 在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问有两种方式。
1.直接:
通过子类对象访问成员变量(等号左边是谁,就优先用谁,没有则向上找。)
2.间接:
通过成员方法访问成员变量(该方法属于谁,就优先用谁,没有则向上找。)
父类:
public class Fu {
int numFu = 10;
int num = 100;
.
public void methodFu() {
// 因为本类有num,所以这里用的是本类的num。
System.out.println(num);// 100
}
}
子类:
public static void main(String[] args) {
Fu fu = new Fu();
Zi zi = new Zi();
// 方式一
System.out.println(zi.num);// 父类和子类都有num,但是优先子类,结果是:200
// 方式二
// 这个方法是子类的,优先用子类的num,没有再向上找。
zi.methodZi();// 200
// 这个方法是在父类中定义的,所以用的是父类的num。
fu.methodFu();// 100
}
区分子类方法中重名的三种变量
局部变量 | 直接写成员变量名 |
本类的成员变量 | this.成员变量名 |
父类的成员变量 | super.成员变量名 |
栗子:
子类:
public class Zi extends Fu{
int num = 20;
public void method() {
int num = 30;
System.out.println(num);// 30
System.out.println(this.num);// 20
System.out.println(super.num);// 10
}
}
父类:
public class Fu {
int num = 10;
}
主函数:
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
}