16.01_去除ArrayList中重复字符串元素方式(掌握)
- A:案例演示
- 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
- 思路:创建新集合方式
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
//....
//去除重复
ArrayList newList = new ArrayList(); //创建一个新集合
Iterator it = list.iterator(); //获取迭代器
while(it.hasNext()) { //判断老集合中是否有元素
String temp = (String)it.next(); //将每一个元素临时记录住
if(!newList.contains(temp)) { //如果新集合中不包含该元素
newList.add(temp); //将该元素添加到新集合中
}
}
System.out.println(newList);
16.02_去除ArrayList中重复自定义对象元素(掌握)
- A:案例演示
- 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
- B:提示: 重写自定义对象的
equals()
方法,如果不重写,属性值一样的对象,因为地址不一样,也会被认为不相同的对象。
ArrayList 的 contanins方法判断是否包含,底层依赖对象的equals方法
ArrayList 的 remove方法判断是否删除,底层依赖对象的equals方法
@Override
public boolean equals(Object obj) { // 重写Person类equals方法示例
if (this == obj) { // 1.地址比较
return true;
}
if (obj instanceof Person) {// 2.类型判断
Person p = (Person)obj; // 3.属性值判断
if (p.name.equals(this.name)&&(p.age == this.age)) {
return true ;
}
}
return false;
}
16.03_LinkedList的特有功能(掌握)
- A:LinkedList类概述
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
LinkedList list = new LinkedList<>();
list.addFirst("1"); //在集合头部添加元素
list.addLast("4"); //在集合尾部添加元素 ,效果同:add()
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)); //获取指定位置的元素,小心越界
16.04_栈和队列数据结构(掌握)
- 栈 ---> 先进后出
- 队列 ---> 先进先出
16.05_用LinkedList模拟栈数据结构的集合并测试(掌握)
- 需求:请用LinkedList模拟栈数据结构的集合,并测试
- 创建一个类将Linked中的方法封装
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();
}
}
16.06_泛型概述和基本使用(掌握)
- A:泛型概述: 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。
- B:泛型好处
- 提高安全性(将运行期的错误转换到编译期)
- 省去强转的麻烦
- C:泛型基本使用
-
<>
中放的必须是引用数据类型
-
- D:泛型使用注意事项
- 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
ArrayList<Person> list = new ArrayList<>(); // 1.7新特性菱形泛型
list.add(new Person("a1", 10));
System.out.println(list.get(0).getName()); // 不用强转就能直接使用
// <>如果都写类型, 那么前后类型必须一致
ArrayList<Person> list2 = new ArrayList<Person>();
16.07_ArrayList存储字符串和自定义对象并遍历泛型版(掌握)
- ArrayList存储自定义对象并遍历泛型版
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("p1", 12));
list.add(new Person("p2", 16));
Iterator<Person> it = list.iterator();
while (it.hasNext()) {
Person p = it.next();
System.out.println(p.getName() + ".." + p.getAge());
}
16.08_泛型的由来(了解)
- 泛型的由来:通过Object转型问题引入
- 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
16.09_泛型类的概述及使用(了解)
- A:泛型类概述<T>
- 把泛型定义在类上
- B:定义格式:
public class 类名<泛型类型1,…>
- C:注意事项: 泛型类型必须是引用类型
// 泛型类
public class TestClass<T> {
private T t;
public T getT() { //泛型方法
return t;
}
public void setT(T t) { //泛型方法
this.t = t;
}
public<T> void show(T t) { //方法泛型和类的泛型不一致
System.out.println(t);
}
}
// 使用
TestClass<Person> t = new TestClass<Person>();
t.setT(new Person("XXOO", 20));
System.out.println(t);
16.10_泛型方法的概述和使用(了解)
- A:泛型方法概述 : 把泛型定义在方法上
- B:定义格式
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public<T> void show(T t) { //方法泛型和类的泛型不一致
System.out.println(t);
}
public static <Q> void print(Q q) { //静态方法必须声明自己的泛型
System.out.println(q);
}
16.11_泛型接口的概述和使用(了解)
- A:泛型接口概述: 把泛型定义在接口上
- B:定义格式
public interface 接口名<泛型类型>
interface Inter<T> { // 泛型接口
public void show(T t);
}
class Demo implements Inter<String> { //实现方式一,推荐这个
@Override
public void show(String t) {
System.out.println(t);
}
}
16.12_泛型高级之通配符(了解)
- A:泛型通配符<?>
- 任意类型,如果没有明确,那么就是Object以及任意的Java类了
- B:
? extends E
向下限定,E及其子类 - C:
? super E
向上限定,E及其父类 (后面再说这个)
// 泛型高级--通配符
List<?> list3 = new ArrayList<>(); //放右边的泛型不确定时,左边可以指定为?
ArrayList<Father> list = new ArrayList<>();
list.add(new Father("F1", 20));
list.add(new Father("F2", 21));
ArrayList<Son> list2 = new ArrayList<>(); //Son继承于Father
list2.add(new Son("F1", 20));
list2.add(new Son("F2", 21));
list.addAll(list2); //没有问题。可以添加。 list2.addAll(list)就会报错,父类不能提升为子类
System.out.println(list);
16.13_增强for的概述和使用(掌握)
- A:增强for概述: 简化数组和Collection集合的遍历
// 增强for
int[] arr = {1,2,3,4,5};
for(int i : arr){
System.out.println(i);
}
ArrayList<String> list = new ArrayList<>();
list.add("xxoo1");
list.add("xxoo2");
for(String s: list){
System.out.println(s);
}
增强for循环底层依赖的是迭代器Iterator
// 快捷键: fore 就能快速出来, 跟syso一样
16.15_三种迭代的能否删除(掌握)
- 普通for循环,可以删除,但是索引要--
- 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
- 增强for循环不能删除
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("b");
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())) {
it.remove(); //这里只能使用Iterator的删除
}
}
// 迭代器删除 写法二
for(Iterator<String>it2 = list.iterator(); it2.hasNext();) {
if ("b".equals(it.next())) {
it.remove(); //这里只能使用Iterator的删除
}
}
16.16_静态导入的概述和使用(掌握)
- A:静态导入概述,JDK1.5的新特性
- B:格式:
-
import static 包名….类名.方法名
; - 可以直接导入到方法的级别
-
- C:注意事项
- 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
16.17_可变参数的概述和使用(掌握)
- A:可变参数概述: 定义方法的时候不知道该定义多少个参数
- B:格式
修饰符 返回值类型 方法名(数据类型… 变量名){}
- C:注意事项:
- 这里的变量其实是一个数组
- 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
// 可变参数 ,可变参数其实就是一个数组: int[] arr
public static void print(String x ,int...arr) {
System.out.println(x);
for (int i : arr) {
System.out.println(i);
}
}
// 调用
print("xxoo",2,3,45,6);
print("xxoo"); //也可以不给参数,可变参数个数: 0-无数个
16.18_数组和集合的互相转换掌握)
// 数组转集合 , 集合的好处是可变的,数组是固定的
// 数组转成集合虽然不能增加和减少元素,但是可以使用集合的其他思想方法去操作
String[] arr = {"q","xxoo","56"};
List<String> list = Arrays.asList(arr); //将数组转为集合
//list.add("我是新加的"); 不能添加,会报错
System.out.println(list);
int[] arr = {2,3,5,6};
List<int[]> list = Arrays.asList(arr);
System.out.println(list); //这里会发现,基本数据类型,转为集合,是把整个数组当成一个对象了
//想要像字符串一样,转成集合之后,还是每个元素的办法:
Integer[] arr2 = {2,3,5,6};
List<Integer> list2 = Arrays.asList(arr2);
System.out.println(list2);
// 集合转数组,需要加泛型
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("xxoo");
list.add("123");
// 集合转数组时,数组的长度如果小于等于集合的size时,转后的数组的长度等于集合的size
// 如果数组的长度大于集合的size,那分配的长度就和指定的长度一样
String[] arr = list.toArray(new String[list.size()]);
System.out.println(Arrays.toString(arr));
16.19_集合嵌套之ArrayList嵌套ArrayList(掌握)
// ArrayList 嵌套 ArrayList
ArrayList<ArrayList<Person>> list = new ArrayList<>();
ArrayList<Person> a1List = new ArrayList<>();
a1List.add(new Person("我草", 30));
ArrayList<Person> a2List = new ArrayList<>();
a2List.add(new Person("你莎", 22));
list.add(a1List);
list.add(a2List);
// 遍历
for(ArrayList<Person> a: list){
for (Person p : a) {
System.out.println(p.getName() + "..." + p.getAge());
}
}
END。
我是小侯爷。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。