1_(去除ArrayList中重复字符串元素方式)*
-
A:案例演示
- 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
- 思路:创建新集合方式
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayList_1_demo {
/* 创建新集合将重复元素去掉
* 1.明确返回值类型,返回ArrayList
* 2.明确参数列表ArrayList
* */
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("c");
list.add("b");
ArrayList newList = getSingle(list);
System.out.println(newList);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList(); //1.创建新集合
Iterator it = list.iterator(); //2.根据传入的集合(老集合)获取迭代器
while(it.hasNext()) { //3.遍历老集合
Object obj = it.next(); //4.临时记录每一个元素
if(!newList.contains(obj)) { //5.如果新集合中不包含老集合中的元素
newList.add(obj); //6.将新元素添加到新集合中
}
}
return newList; //7.将新集合返回
}
}
2_(去除ArrayList中重复自定义对象元素)*
-
A:案例演示
- 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
-
B:注意事项
-
重写equals()方法的
- contains方法判断是否包含,底层依赖的是equals方法
- remove方法判断是否删除,底层依赖的是equals方法
-
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ArrayList_2_demo {
public static void main(String[] args) {
ArrayList list = new ArrayList(); //创建集合对象
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("张三",23));
list.add(new Person("张三",23));
list.add(new Person("王五",23));
list.add(new Person("李四",24));
// ArrayList newList = getSingle(list); //调用方法去除重复
// System.out.println(newList);
list.remove(new Person("张三",23));
System.out.println(list);
}
public static ArrayList getSingle(ArrayList list) {
ArrayList newList = new ArrayList(); //1.创建新集合
Iterator it = list.iterator(); //2.根据传入的集合(老集合)获取迭代器
while(it.hasNext()) { //3.遍历老集合
Object obj = it.next(); //4.临时记录每一个元素
if(!newList.contains(obj)) { //5.如果新集合中不包含老集合中的元素
newList.add(obj); //6.将新元素添加到新集合中
}
}
return newList; //7.将新集合返回
}
}
@Override//重写equals方法
public boolean equals(Object obj) {
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
3_(LinkedList的特有功能)*
- A:LinkedList类概述
-
B:LinkedList类特有功能
- public void addFirst(E e)及addLast(E e)
- public E getFirst()及getLast()
- public E removeFirst()及public E removeLast()
- public E get(int index);
import java.util.LinkedList;
public class ArrayList_3_LinkedList {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
list.addFirst("d");//在头部添加
list.addLast("e");//在尾部添加
// System.out.println(list.getFirst());//打印头部元素
// System.out.println(list.getLast());//打印尾部元素
// System.out.println(list.removeFirst());//删除头
// System.out.println(list.removeLast());//删除尾
System.out.println(list.get(1));
System.out.println(list);
}
}
4_(栈和队列数据结构)*
-
栈
- 先进后出 (装子弹原理)
-
队列
- 先进先出(水龙头原理)
5_用LinkedList模拟栈数据结构的集合并测试*
-
A:案例演示
- 需求:请用LinkedList模拟栈数据结构的集合,并测试
- 创建一个类将Linked中的方法封装
import java.util.LinkedList;
import java.util.Stack;
public class ArrayList_4_LinkedList {
public static void main(String[] args) {
// demo1();
stack s = new stack(); //进栈
s.in("a");
s.in("b");
s.in("c");
s.in("d");
while(!s.isEmpty()) { //是否为空
System.out.println(s.out());//弹栈
}
}
private static void demo1() {
LinkedList list = new LinkedList();
list.addLast("a");
list.addLast("b");
list.addLast("c");
list.addLast("d");
/* System.out.println(list.removeLast());
System.out.println(list.removeLast());
System.out.println(list.removeLast());
System.out.println(list.removeLast());*/
while (!list.isEmpty()) {
System.out.println(list.removeLast());
}
}
}
import java.util.LinkedList;
public class stack {
private LinkedList list = new LinkedList();
//模拟进栈方法
public void in(Object obj) {
list.addLast(obj);
}
//模拟出栈方法
public Object out() {
return list.removeLast();
}
//模拟栈结构是否为空
public boolean isEmpty() {
return list.isEmpty();
}
}
6_泛型概述和基本使用*
- A:泛型概述
-
B:泛型好处
- 提高安全性(将运行期的错误转换到编译期)
- 省去强转的麻烦
-
C:泛型基本使用
- <>中放的必须是引用数据类型
-
D:泛型使用注意事项
- 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
public class Generic_1_demo {
public static void main(String[] args) {
// demo1();
// int[] arr = new byte[5]; //数组要保证前后的数据类型一致
// ArrayList<Object> list = new ArrayList<Person>(); //集合泛型也要保证前后的数据类型一致
// ArrayList<Object> list = new ArrayList<>(); //1.7版本新特性,菱形泛型
ArrayList<Object> list = new ArrayList<>(); //泛型不定义Object,没有意义
list.add("aaa");
list.add(true);
list.add(new Person("张三",23));
}
private static void demo1() {
ArrayList<Person> list = new ArrayList<Person>();
// list.add(100);
// list.add(true);
list.add(new Person("张三",23));
list.add(new Person("李四",24));
Iterator<Person> it = list.iterator();
while(it.hasNext()) {
// System.out.println(it.next());
//next()方法只能调用一次,如果调用多次会将指针向后移动多次
// System.out.println(it.next().getName() + "..." + it.next().getAge());
Person p = it.next(); //向下转型
System.out.println(p.getName() + "..." + p.getAge());
}
}
}
7_ArrayList存储字符串和自定义对象并遍历泛型版*
-
A:案例演示
- ArrayList存储字符串并遍历泛型版
import java.util.ArrayList;
import java.util.Iterator;
import net.allidea.bean.Person;
public class Generic_2_demo
public static void main(String[] args) {
// demo1();
demo2();
}
private static void demo2() {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("王五",25));
list.add(new Person("赵六",26));
Iterator<Person> it = list.iterator();
while(it.hasNext()) {
Person p = it.next(); //将集合中的每一个元素用Person记录
System.out.println(p.getName() + "..." + p.getAge());
}
}
private static void demo1() {
ArrayList<String> list = new ArrayList(); //创建集合对象
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
8_泛型的由来(了解)
-
A:案例演示
- 泛型的由来:通过Object转型问题引入
- 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
import net.allidea.bean.Animal; //Animal 继承 Person及其构造
import net.allidea.bean.Person; //Person private String name;private int age;
import net.allidea.bean.Tool; //Tool 自定义类private Object obj;
import net.allidea.bean.Worker; //Worker 继承 Person及其构造
public class Generic_3_demo {
public static void main(String[] args) {
Tool t = new Tool(); //创建工具类对象
t.setObj(new Animal("张三",23));
Worker w = (Worker)t.getObj(); //向下转型
System.out.println(w);
}
}
9_泛型类的概述及使用(了解)
-
A:泛型类概述<T>
- 把泛型定义在类上
-
B:定义格式
- public class 类名<泛型类型1,…>
-
C:注意事项
- 泛型类型必须是引用类型
-
D:案例演示
- 泛型类的使用
import net.allidea.bean.Animal; //Animal 继承 Person及其构造
import net.allidea.bean.Person; //Person private String name;private int age;
import net.allidea.bean.Tool; //Tool 自定义类private Object obj;
import net.allidea.bean.Worker; //Worker 继承 Person及其构造
public class Generic_3_demo {
public static void main(String[] args) {
Tool<Animal> t = new Tool<>(); //创建工具类对象
t.setObj(new Animal("张三",23));
// Worker w = (Worker)t.getObj(); //报错
// System.out.println(w);
}
}
//Tool文件
package net.allidea.bean;
public class Tool<Q> { //E代表元素
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
}
10_泛型方法的概述和使用(了解)
-
A:泛型方法概述
- 把泛型定义在方法上
-
B:定义格式
- public <泛型类型> 返回类型 方法名(泛型类型 变量名)
-
C:案例演示
- 泛型方法的使用
import net.allidea.bean.Animal; //Animal 继承 Person及其构造
import net.allidea.bean.Tool; //Tool 自定义类private Object obj;
public class Generic_3_demo {
public static void main(String[] args) {
Tool<String> t = new Tool<>();
// t.show("abc");
t.show(true); //无类型,自动装箱
}
}
package net.allidea.bean;
public class Tool<Q> { //E代表元素
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
public<T> void show(T t) { //方法泛型需要与类的泛型一致
System.out.println(t); //如果不一致,需要在方法上声明该类型
}
public static<Q> void print(Q q) { //静态方法必须声明自己的泛型,加载早此Q非彼Q
System.out.println(q);
}
}
11_泛型接口的概述和使用(了解)
-
A:泛型接口概述
- 把泛型定义在接口上
-
B:定义格式
- public interface 接口名<泛型类型>
-
C:案例演示
- 泛型接口的使用
package net.allidea.Generic;
public class Generic_4_demo {
public static void main(String [] args) {
}
}
interface Inter<T> { //接口泛型
public void show(T t); //抽象方法
}
/*class Demo implements Inter<String> { //第一种方式实现接口泛型,推荐
@Override
public void show(String t) { //重写抽象方法
System.out.println(t);
}
}*/
class Demo<T> implements Inter<T> { //没有必要再实现接口的时候,给自己类加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
12_(泛型高级之通配符)(了解)
-
A:泛型通配符<?>
- 任意类型,如果没有明确,那么就是Object以及任意的Java类了
-
B:? extends E
- 向下限定,E及其子类
-
C:? super E
- 向上限定,E及其父类
import java.util.ArrayList;
import java.util.List;
import net.allidea.bean.Person;
import net.allidea.bean.Animal;
public class Generic_5_demo {
public static void main(String[] args) {
// List<?> list = new ArrayList<Integer>(); //当右边泛型是不确定时,左边可以指定为?
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("张三",23));
list1.add(new Person("李四",24));
list1.add(new Person("王五",25));
ArrayList<Animal> list2 = new ArrayList<>();
list2.add(new Animal("赵六",26));
list2.add(new Animal("田七",27));
list1.addAll(list2); //Animal继承Person
System.out.println(list1);
}
}
13_增强for的概述和使用*
- A:增强for概述——简化数组和Collection集合的遍历
- B:格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
- C:案例演示——数组,集合存储元素用增强for遍历
- D:好处——简化遍历
import java.util.ArrayList;
public class Foreach_1_demo {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66};
for(int i : arr) {
System.out.println(i);
}
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (String string : list) {
System.out.println(string);
}
}
}
14_ArrayList存储字符串和自定义对象并遍历增强for版 *
- ArrayList存储字符串并遍历增强for版
- 增强for循环底层依赖的是迭代器(Iterator)
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("王五",25));
list.add(new Person("赵六",26));
list.add(new Person("田七",27));
for (Person person : list) {
System.out.println(person);
}
}
15_三种迭代的能否删除*
- 普通for循环,可以删除,但是索引要--
- 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
- 增强for循环不能删除
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("b");
//普通for循环删除,索引要--
/*for (int i = 0; i < list.size(); i++) {
if("b".equals(list.get(i))) {
list.remove(i--); //通过索引删除元素
}
}*/
//迭代器删除
/*Iterator<String> it = list.iterator();
while(it.hasNext()) {
if("b".equals(it.next())) {
// list.remove("b"); //不能用集合的删除方法,会报并发修改异常
it.remove();
}
}*/
/*for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {
if("b".equals(it2.next())) {
it2.remove();
}
}*/
//增强for循环,不能删除,只能遍历
for (String String : list) {
if("b".equals(String)) {
list.remove("b");
}
}
System.out.println(list);
}
16_静态导入的概述和使用(了解)
-
A:静态导入概述
- 静态导入时导入类中的静态方法;
-
B:格式:
- import static 包名….类名.方法名;
- 可以直接导入到方法的级别
-
C:注意事项
- 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?
这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
import static java.util.Arrays.sort;
import static java.util.Arrays.*;
public class StaticImport_2_demo {
public static void main(String[] args) {
int[] arr = {11,33,55,66,99,44};
sort(arr); //排序
System.out.println(Arrays.toString(arr));
}
}
17_可变参数的概述和使用*
-
A:可变参数概述
- 定义方法的时候不知道该定义多少个参数
-
B:格式
- 修饰符 返回值类型 方法名(数据类型… 变量名){}
-
C:注意事项:
- 这里的变量其实是一个数组
- 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
public class ChangeableArgs_3_demo {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55};
// print(arr);
print(11,22,33,44,55);
System.out.println("------------");
print(0, arr);
}
/*public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}*/
public static void print(int x,int ... arr) { //可变参数是一个数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
18_Arrays工具类的asList()方法的使用*
-
A:案例演示
- Arrays工具类的asList()方法的使用
- Collection中toArray(T[] a)泛型版的集合转数组
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo4_Aslist {
public static void main(String[] args) {
// demo1();
// demo2();
//集合转数组,加泛型的
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
String[] arr = list.toArray(new String[10]);//当集合转换数组时,数组长度<=集合的size时,转换后的数组等于集合的size
for (String string : arr) { //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
System.out.println(string);
}
}
private static void demo2() {
/*int[] arr = {11,22,33,44,55,66}; //将整个数组当做一个引用类型
List<int[]> list = Arrays.asList(arr); //基本数据类型的数组转换成集合,会将整个数组当作一个集合
System.out.println(list);*/
Integer[] arr = {11,22,33,44,55};
List<Integer> list = Arrays.asList(arr); //将数组转换成集合,数组必须是引用数据类型
System.out.println(list);
}
private static void demo1() {
String[] arr = {"a","b","c","d","e","f","g"};
List<String> list = Arrays.asList(arr); //将数组转换成集合
list.add("h"); //不能添加
System.out.println(list);
}
}
19_集合嵌套之ArrayList嵌套ArrayList*
-
A:案例演示
- 集合嵌套之ArrayList嵌套ArrayList
-
案例
- 学科——分若干个班级
- 学科是一个大集合
- 若干个班级分为每一个小集合
import java.util.ArrayList;
import net.allidea.bean.Person;
public class List_6_ArrayList {
public static void main(String[] args) {
ArrayList<ArrayList<Person>> list = new ArrayList<>();
ArrayList<Person> first = new ArrayList<>(); //创建第一个班级
first.add(new Person("杨幂",30));
first.add(new Person("胡歌",36));
first.add(new Person("郭富城",50));
first.add(new Person("周杰伦",38));
ArrayList<Person> second = new ArrayList<>();
second.add(new Person("黄晓明",31));
second.add(new Person("赵薇",31));
second.add(new Person("陈坤",31));
//将班级添加到学科集合中
list.add(first);
list.add(second);
//遍历学科集合
for(ArrayList<Person> a : list) {
for(Person p : a) {
System.out.println(p);
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。