一、对象数组
//一个基本的类有四个部分
package arrayListD;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
package arrayListD;
//题目:定义一个数组,用来存储3个person对象
//数组有一个缺点,一旦创建,程序运行期间长度不可以变
public class Demo01Array {
public static void main(String[] args) {
//首先创建一个长度为3 的数组,存Person类型的对象
Person[] arr = new Person[3];
Person one = new Person("la",13); //one two thr 都是地址值
Person two = new Person("ka",19);
Person thr = new Person("ja",13);
//将one当中的地址值赋值给数组的0号元素
arr[0] = one;
arr[1] = two;
arr[2] = thr;
System.out.println( arr[0]); //这个是地址值
//这才是值
System.out.println(arr[1].getName() + arr[1].getAge());
}
}
二、 ArrayList类
package cn.day07.demo04;
import java.util.ArrayList;
/*
数组的长度不可以发生改变
但是ArrayList长度可以随意变化的
对于ArrayList来说,有个尖括号,代表泛型
泛型:也就是装在集合当中的所有元素,全都是统一的类型
注意:泛型只能是引用类型,不能是基本类型
注意事项:
对于ArrayList集合来说, 直接打印得到的不是地址值,而是内容,如果内容为空,得到的是空的中括号[]
*/
public class Demo02ArrayList {
public static void main(String[] args) {
//创建了一个ArrayList集合,集合的名称是list,里面全是String类型的数组
//备注:从jdk 1.7开始,右侧的尖括号内部可以不写内容,但是尖括号本身要写的
ArrayList<String> list = new ArrayList<>();
System.out.println(list); //[]
//向集合中添加数据,需用add方法
list.add("赵丽颖"); //[赵丽颖]
System.out.println(list);
list.add("迪丽热巴");
list.add("古力娜扎");
System.out.println(list); //[赵丽颖, 迪丽热巴, 古力娜扎]
// list.add(110) 错误写法
}
}
ArrayList例子1 ,没有赋值就是[],常用方法。
1、ArrayList的底层数据结构就是一个数组,查找快,增删慢
2、ArrayList的线程安全性
对ArrayList进行添加元素的操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素;第二步将size的值增加1。由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的。
具体举例说明:在单线程运行的情况下,如果Size = 0,添加一个元素后,此元素在位置 0,而且Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增 加 Size 的值。 那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而Size却等于 2。这就是“线程不安全”了。
如果非要在多线程的环境下使用ArrayList,就需要保证它的线程安全性,通常有两种解决办法:第一,使用synchronized关键字;第二,可以用Collections类中的静态方法synchronizedList();对ArrayList进行调用即可。
ArrayList常用方法有:
ArrayList的add()方法
public boolean add(E,e):参数的类型和泛型一致, 对于add方法来说,添加一定是成功的,返回值可用可不用。但是对于其他集合来说,add添加动作不一定成功,
在add()方法中主要完成了3件事:
首先确保能够将希望添加到集合中的元素能够添加到集合中,即确保ArrayList的容量(判断是否需要扩容);
然后将元素添加到elementData数组的指定位置;
最后将集合中实际的元素个数加1。
ArrayList的get(int index)方法
public E get (int index)从集合中获取元素,参数是索引编号,返回值是对应位置的元素,索引从0开始,
ArrayList的set(int index,E element)方法
set(int index, E element)方法的作用是指定下标索引处的元素的值。在ArrayList的源码实现中,方法内首先判断传递的元素数组下标参数是否合法,然后将原来的值取出,设置为新的值,将旧值作为返回值返回。
ArrayList的indexOf(Object o)方法
indexOf(Object o)方法的作用是从头开始查找与指定元素相等的元素,如果找到,则返回找到的元素在元素数组中的下标,如果没有找到返回-1。与该方法类似的是lastIndexOf(Object o)方法,该方法的作用是从尾部开始查找与指定元素相等的元素。
ArrayList的remove(int index)方法,参数是所编号,返回值是被删掉的元素
public E remove(int index)方法的作用是删除指定下标的元素。在该方法的源码中,将指定下标后面一位到数组末尾的全部元素向前移动一个单位,并且把数组最后一个元素设置为null,这样方便之后将整个数组不再使用时,会被GC,可以作为小技巧。而需要移动的元素个数为:size-index-1。
ArrayList的size方法
public int size():获取集合的大小, 返回值是集合中包含的元素个数
package arrayListD;
import java.util.ArrayList;
public class Demo1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
System.out.println(list) ; //这是一个[]
list.add("dfk");
list.add("gfd");
list.add("fdh");
System.out.println(list);
String name = list.get(1);
System.out.println("1号索引:" + name);
String remove = list.remove(1);
System.out.println("删掉的是:" + remove);
int size = list.size();
System.out.println("最后是:" + list);
System.out.println("大小是:" + size);
System.out.println("=====");
//遍历, list.fori
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
[]
[dfk, gfd, fdh]
1号索引:gfd
删掉的是:gfd
最后是:[dfk, fdh]
大小是:2
=====
dfk
fdh
三、ArrayList集合存储基本数据类型,自动装箱拆箱
package arrayListD;
import java.util.ArrayList;
/*
如果希望向集合ArrayList中存储基本类型,必须使用基本类型对应的包装类。
基本类型 包装类(引用类型,包装类位于java.lang包下)
byte Byte
short Short
int Integer 【特殊】
long Long
float Float
double Double
char Character 【特殊】
boolean Boolean
从jdk1.5+开始,支持自动装箱,自动拆箱
自动装箱:基本类型-->包装类型
自动拆箱:包装类型-->基本类型
*/
public class Demo2 {
public static void main(String[] args) {
//ArrayList<Integer> sc = new ArrayList<>(); 这是错误写法,泛型必须是引用类型,不能是基本类型
ArrayList<Integer> sc = new ArrayList<>();
sc.add(90);
sc.add(1);
Integer num = sc.get(1);
System.out.println("1号索引:" + num);
}
}
1号索引:1
四、例子、
4.1、 产生6个随机数字,遍历
package arrayListD;
import java.util.ArrayList;
import java.util.Random;
//生成5个1-33 之间的随机整数,并添加到集合,并遍历集合
public class Demo3 {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<>();
Random sc = new Random();
int n =33;
for (int i = 0; i < 5; i++) {
int rs = sc.nextInt(n) + 1;
al.add(rs);
System.out.print(rs + " ") ;
}
for (int i = 0; i < al.size(); i++) {
System.out.print(al.get(i) + " ");
}
}
}
22 24 28 33 20
22 24 28 33 20
4.2、自定义3个学生对象,添加到集合,并遍历
package arrayListD;
import java.util.ArrayList;
//自定义3个学生对象,添加到集合,并遍历
/*
1、自定义Student学生类,四个部分, 变量,构造,getter setter
2、创建一个集合,存储你学生对象,泛型<Student>
3、根据类,创建3个对象
4、将学生添加到集合 add
5、for size get 遍历
*/
public class Demo5Student {
public static void main(String[] args) {
ArrayList<Student> stu1 = new ArrayList<>();
Student one = new Student("s",12);
Student two = new Student("q",13);
Student thr = new Student("e",17);
stu1.add(one);
stu1.add(two);
stu1.add(thr);
//遍历集合,stu1.fori
for (int i = 0; i < stu1.size(); i++) {
Student stu = stu1.get(i);
System.out.println("姓名:" + stu.getName()+ stu.getAge());
}
}
}
package arrayListD;
public class Student {
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private int age;
}
4.3 按指定格式,打印集合方法
定义以指定格式打印集合的方法,ArrayList类型作为参数,使用{}扩起集合,使用@分隔每隔元素,格式参照元素@元素@元素
package cn.day07.demo04;
import java.sql.Struct;
import java.util.ArrayList;
/*
System.out.println(list) [10,20,30]
printArrayList(list) {10@20@30}
*/
public class Demo04ArrayList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("qwe");
list.add("asd");
list.add("zxc");
System.out.println(list); //[qwe, asd, zxc]
printArrayList(list);
}
/*定义方法的三要素
返回值类型:只是打印,没有运算,没有结果,所有返回用void
方法名称:printArrayList
参数列表:arrayList
*/
public static void printArrayList(ArrayList<String> list){
System.out.print("{");
for (int i = 0; i < list.size(); i++) {
//System.out.print(" " + list.get(i)); /{qwr@asd@zxc}
String name = list.get(i);
if (i == list.size() - 1){
System.out.print(name+"}"); //zxc
} else {
System.out.print(name + "@");
}
}
}
}
[qwr, asd, zxc]
{qwr@asd@zxc}
4.4、用一个大集合存入20个随机数字,然后筛选其中的偶数,并放到小集合
package arrayListD;
import java.util.ArrayList;
import java.util.Random;
/*
题: 用一个大集合存入20个随机数字,然后筛选其中的偶数,并放到小集合
要求用自定义方法实现筛选
分析:
1、创建一个大集合,用来存储int数据,<Integer>
2、随机数字Random,20个,循环20次,nextInt 可以不用限定。
3、循环20次,放入大集合,add
4、定义一个方法,筛选
筛选:根据大集合,筛选符合要求的小集合
筛选:
返回类型,小集合。 个数不确定
方法名称:getSmall
参数类型:ArrayList 大集合
5、判断是不是偶数,num%2 == 0
6、如果是偶数,放到小集合
*/
public class ArrayListReturn {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Random rs = new Random();
for (int i = 0; i < 20; i++) {
int num = rs.nextInt(100) + 1; //1~100
list.add(num);
}
System.out.print("大集合:" + list);
System.out.println("======");
ArrayList< Integer> smallist = getSmall(list);
System.out.println("偶数个数:" + smallist.size());
for (int i = 0; i < smallist.size(); i++) {
System.out.print(smallist.get(i) + " ");
}
}
//这个方法接受大集合参数,返回小集合list
public static ArrayList<Integer> getSmall(ArrayList<Integer> bigArray){
//创建小集合,放偶数结果
ArrayList<Integer> slist = new ArrayList<>();
for (int i = 0; i < bigArray.size(); i++) {
int num = bigArray.get(i);
if (num % 2 == 0){
slist.add(num);
}
}
return slist;
}
}
6.基础的取数
package arrayListD;
import java.util.ArrayList;
public class Demo2 {
public static void main(String[] args) {
ArrayList<Integer> sc = new ArrayList<>();
sc.add(90);
sc.add(1);
Integer num = sc.get(1);
System.out.println("1号索引:" + num);
}
}