package com.heima.review;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
//* 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
public class Day16 {
public static void main(String[] args) {
//方法一练习的是字符串去重
//mothed1();
//方法二练习的是自定义对象去重
//method2();
//用LinkedList模拟进出栈(后进先出)
//method3();
//泛型
//method4();
//增强for
//method5();
//在遍历集合的同时删除指定元素
//method6();
/* A:可变参数概述
* 定义方法的时候不知道该定义多少个参数
* B:格式
* 修饰符 返回值类型 方法名(数据类型… 变量名){}
* C:注意事项:
* 这里的变量其实是一个数组
* 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定放在参数列表的最后*/
/*集合和数组之间的相互转换:
集合转成数组:
Collection接口中的toArray();
数组转成集合: //掌握
Arrays类中asList();
注意:
1、数组转成集合后,该集合不能增加或者减少元素,但是可以调用集合的共性方法,因为数组的长度是固定的。
2、如果是基本类型的数组转成集合,那么会把该数组当做一个元素转成集合。
int[] arr = {1,2,3,4,5};
List<int[]> list = Arrays.asList(arr);
如果是引用类型的数组转成集合,会按照元素来转。
Integer[] arr = {1,2,3,4,5};
List<Integer> list = Arrays.asList(arr);*/
}
public static void method6() {
/*
* 普通for循环,可以删除,但是索引要变化。
* 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
* 增强for循环不能删除
* */
//删除"java"应该用哪种方式?
ArrayList<String> list5 = new ArrayList<>();
list5.add("java");
list5.add("java");
list5.add("object");
list5.add("heima");
list5.add("java");
//这种方式是无法完全删除"java"字符串的。因为在删除元素的同时元素的角标会发生改变。
for (int i = 0; i < list5.size(); i++) {
if("java".equals(list5.get(i))){
list5.remove(list5.get(i));
}
}
System.out.println(list5);
}
//可以遍历数组,也可以遍历集合
public static void method5() {
int[] arr = {1,2,3,4,5,6,7};
for (int i : arr) {
System.out.println(i);
}
}
public static void method4() {
/*泛型的概述:写在尖括号里的用来限定集合数据类型的引用数据类型就是泛型(注意:泛型只能是引用数据类型)。例如泛型是Person,那么集合中只能存储Person类对象
* 或者Person类的子类对象(多态)。
* 泛型的好处:
* 1、提高安全性:将错误从运行期提前到了编译期。
* 2、省去了强制类型转换的麻烦。
* 解释:因为集合中可以存储多种类型的元素,当存储一个person类型和一个Integer类型时,
* 想要获取Person对象下的特有功能时需要强制类型转换,但是Integer类型不能转成Person类型,运行时会报错。
* 所以说提高了安全性。如果提前写上泛型以后因为集合中存储的只有Person类型的对象,所以说,不用进行强制类型转换就可以
* 直接调用Person类中的特有方法,所以说省去了强制类型转换的麻烦。使用迭代器时要注意,只要写一个it.next()方法,就会
* 调用下一个对象。
* 泛型中的注意事项:前后的泛型必须一致,或者后面的泛型可以省略不写(菱形泛型是JDK1.7的新特性)。
* 类上可以加泛型:可以在基本类中自己定义泛型,当在测试类中对基本类进行创建对象时,测试类中是什么泛型,基本类中就是什么泛型。
* 方法上定义泛型:方法泛型最好是与类的泛型一致。如果不一致需要在方法上声明该泛型(也就是说在定义方法时也可以决定使用什么泛型)。
* 因为静态方法随着类的加载而加载调用方法时可能还没有创建类的对象,所以说静态方法必须要声明自己的泛型。
* 接口泛型:一个类在实现接口的时候一般不会定义泛型,而是在要实现的接口后面给泛型赋值。
* 泛型的通配符:<?>当不确定后面的对象是什么类型时可以在前面使用通配符。
* 例如:List<?> li = new ArrayList<String>();后面可以是任意类型。
* ? extends E:向下限定,也就是说该集合中何以存储E的类型或者是子类(?).
* ? super E:向上限定,学完TreeSet再讲
*
*/
Person_generic pg = new Person_generic();
pg.in("nihao");
System.out.println(pg.out());
}
/*LinkedList集合的特有功能:
addFirst() 将指定元素插入该列表的开头。
addLast() 将指定元素插入该列表的结尾
getFirst() 获取该列表的第一个元素
getLast() 获取该列表的最后一个元素
为什么用LinkedList来模拟数据进出栈的情景。
1、LinkedList底层是链式结构,增删改查都是按照链表结构进行,与栈内存相似。
2、LinkedList是由存取顺序的
3、LinkList有以下特有方法:
addFirst() 将指定元素插入该列表的开头。
addLast() 将指定元素插入该列表的结尾
getFirst() 获取该列表的第一个元素
getLast() 获取该列表的最后一个元素
removeFirst()删除该列表的第一个元素,并返回该元素。
removeLast()删除该列表的最后一个元素,并返回该元素。
能够模拟出数据进出栈的情景。所以用LinkedList集合模拟栈数据结构
注意:
这是一类题,面试的时候如果看到这类题:
"用**(一般是类),来模拟 某个功能",潜台词就是让我们对 **这个类进行封装,然后调用这个类中的一些方法,来实现功能。
*/
public static void method3() {
day16_Stack s = new day16_Stack();
s.in("a");
s.in("b");
s.in("c");
s.in("d");
while(!s.isEmpty()){
System.out.print(s.out());
}
}
public static void method2() {
// 如果是自定义类型要去重的话,要记得重写equals()方法,因为contains()方法在底层也是依赖equals()方法
ArrayList<Student> list3 = new ArrayList<Student>();
list3.add(new Student("张三", 23));
list3.add(new Student("张三", 23));
list3.add(new Student("张三", 23));
list3.add(new Student("李四", 24));
list3.add(new Student("王五", 25));
list3.add(new Student("赵六", 26));
list3.add(new Student("周七", 27));
System.out.println(list3);
ArrayList<Student> list4 = new ArrayList<Student>();
Iterator<Student> it = list3.iterator();
while(it.hasNext()){
Student stu = it.next();
//如果不重写equals()方法的话,还是无法去重。在Student类中重写equals()方法以后,就会去重了。
//因为contains()方法底层运用的是equals()方法
if(!list4.contains(stu)){
list4.add(stu);
}
}
System.out.println(list4);
}
public static void mothed1() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = sc.nextLine();
char[] ch = str.toCharArray();
ArrayList<Character> list = new ArrayList<>();
// 可以用for循环,也可以用迭代器
for (int i = 0; i < ch.length; i++) {
list.add(ch);
}
ArrayList<Character> list2 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (!list2.contains(list.get(i))) {
list2.add(list.get(i));
}
}
System.out.println(list2);
}
}
|
|