集合-2
1.去除ArrayList中重复字符串元素方式
*案例演示,通过创建新集合的方式去除ArrayList集合中字符串的重复值(字符串的内容相同)
publicstatic void main(String[] args) {
ArrayListlist = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
ArrayListnewList = getSingle(list);
System.out.println(newList);
}
* 分析:
* 1,创建新集合
* 2,根据传入的集合(老集合)获取迭代器
* 3,遍历老集合
* 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
publicstatic ArrayList getSingle(ArrayList list) {
ArrayListnewList = new ArrayList(); //创建一个新集合
Iteratorit = list.iterator(); //获取迭代器
while(it.hasNext()){ //判断老集合中是否有元素
Stringtemp = (String)it.next(); //将每一个元素临时记录住
if(!newList.contains(temp)){ //如果新集合中不包含该元素
newList.add(temp);//将该元素添加到新集合中,@@遍历老集合的同时,增加新集合的元素,所以不会产生并发修改.
}
}
returnnewList; //将新集合返回
}
2.去除ArrayList中重复自定义对象元素
*通过创建新集合的方式去除ArrayList集合中自定义对象元素的重复值(对象的成员变量值相同)
* B:注意事项
*必须重写equals()方法!!!!!!
@@在添加自定义对象时contains方法判断是否包含,底层依赖的是equals方法
remove方法判断是否删除,底层依赖的是equals方法,都必须在封装对象属性的那个类中也就是set,get方法下重写equals方法
public class Demo2_ArrayList {
publicstatic void main(String[] args) {
ArrayListlist = new ArrayList(); //创建集合对象
list.add(newPerson("张三", 23));
list.add(newPerson("张三", 23));
list.add(newPerson("李四", 24));
list.add(newPerson("李四", 24));
list.add(newPerson("李四", 25));
list.add(newPerson("李四", 24));
//ArrayListnewList = getSingle(list); //调用方法去除重复
//System.out.println(newList);
list.remove(newPerson("张三", 23));
System.out.println(list); //[Student [name=张三, age=23],Student [name=李四, age=24], Student [name=李四, age=25]]
}
* 分析:
* 1,创建新集合
* 2,根据传入的集合(老集合)获取迭代器
* 3,遍历老集合
* 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
publicstatic ArrayList getSingle(ArrayList list) {
ArrayListnewList = new ArrayList<>(); //1,创建新集合
Iteratorit = list.iterator(); //2,根据传入的集合(老集合)获取迭代器
while(it.hasNext()){ //3,遍历老集合
Objectobj = it.next(); //记录住每一个元素
if(!newList.contains(obj)){ //如果新集合中不包含老集合中的元素
newList.add(obj); //将该元素添加
}
}
returnnewList;
}
}
public boolean equals(Object obj) {
studentp = (student)obj;
returnthis.name.equals(p.name) && this.age == p.age;
}
3.LinkedList的特有功能
* A:LinkedList类概述
* B:LinkedList类特有功能
*public void addFirst(E e)及addLast(E e) //在链表头位置添加,在末尾位置添加
LinkedListlist = new LinkedList();
list.addFirst("a");
list.addFirst("b");
list.addLast("e"); // bae
*public E getFirst()及getLast() //获取第一个值,获取最后一个值
System.out.println(list.getLast()); //e
*public E removeFirst()及public E removeLast() //删除第一个,最后一个元素并返回删除的元素
System.out.println(list.removeFirst()); // b
*public E get(int index); //获取给定索引处的元素,虽然看起来和数组一样能快速定位找到元素,但它底层还是从前向后或从后向前挨个找的,较数组慢
System.out.println(list.get(1)); // e
4.栈和队列数据结构
* 栈: 先进后出
* 队列: 先进先出
5.用LinkedList模拟栈数据结构的集合并测试
* A:案例演示
*请用LinkedList模拟栈数据结构的集合,并测试
模拟队列数据结构的集合,只需将出栈方法改成list.removeFirst()即可!!!
publicclass Demo4_LinkedList {
publicstatic void main(String[] args) {
Stacks = new Stack();
s.in("a"); //进栈
s.in("b");
s.in("c");
while(!s.isEmpty()){ //判断栈结构是否为空
System.out.println(s.out()); //弹栈
}
}
classStack {
privateLinkedList list = new LinkedList(); //创建LinkedList对象
publicvoid in(Object obj) {
list.addLast(obj); //模拟进栈方法
}
publicObject out() {
returnlist.removeLast(); //模拟出栈
}
publicboolean isEmpty() {
returnlist.isEmpty(); //模拟栈结构是否为空
}
}
6.泛型概述和基本使用
* A:泛型概述
@@<>指的就是泛型,里面要写一个引用数据类型,它是限定你这个集合存储的数据类型,如果加上了这个引用数据类型,你这个集合只能存储该类型的对象,或该类型的子类对象,比如你放Person,如果Student继承了Person,那我这个集合也可以放Student,这叫父类引用指向子类对象,也可以只放person,这个<>相当于表示了我这个泛型能够存储什么样的引用数据类型; 另<>中只能存放引用数据类型,因为泛型中只能存储对象
* B:泛型好处
*提高安全性(将运行期的错误转换到编译期)
*省去强转的麻烦 @@@参考代码理解Demo1_Generic.java!!!!!!
publicstatic void demo1() {
ArrayList<Person>list = new ArrayList<Person>();
//list.add(110); 1
//list.add(true); 2 //如果不加泛型,1和2只有到运行的时候才会报错,但加了泛型之后,只要写上这两句话就会报错
list.add(newPerson("张三", 23));
list.add(newPerson("李四", 24));
Iterator<Person>it = list.iterator();
while(it.hasNext()){
//System.out.println(it.next().getName()+ "..." + it.next().getAge());//next方法只能调用一次,如果调用多次会将指针向后移动多次. //张三.....24
Personp = it.next(); //不用强转!!!!!!!
System.out.println(p.getName() +"..." + p.getAge());
}
}
}
* D:泛型使用注意事项
*前后的泛型必须一致,
*或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
*泛型最好不要定义成Object,没有意义
7.ArrayList存储字符串和自定义对象并遍历泛型版
* A:案例演示
*ArrayList存储字符串并遍历泛型版(普通字符串类型的自己写!!!)
publicstatic void main(String[] args) {
ArrayList<Person> list = newArrayList<>();
list.add(new Person("张三",23));
list.add(new Person("李四",24)); //加了泛型后add里面默认的是person类型,不加默认object类型
Iterator<Person> it =list.iterator();
while(it.hasNext()) {
Person p = it.next(); //将集合中的每一个元素用Person记录,不用强转
System.out.println(p.getName() +"..." + p.getAge());
}
}
8.泛型的由来
* A:案例演示
*泛型的由来:通过Object转型问题引入
*早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
9.泛型类的概述及使用
* A:泛型类概述<T>
*把泛型定义在类上
* B:定义格式
*public class 类名<泛型类型1,…>
* C:注意事项
*泛型类型必须是引用类型
* D:案例演示
*泛型类的使用
10.泛型方法的概述和使用
* A:泛型方法概述
*把泛型定义在方法上
* B:定义格式
*public <泛型类型> 返回类型方法名(泛型类型变量名)
* C:案例演示
*泛型方法的使用
11.泛型接口的概述和使用
* A:泛型接口概述
*把泛型定义在接口上
* B:定义格式
*public interface 接口名<泛型类型>
* C:案例演示
*泛型接口的使用
12.泛型高级之通配符
* A:泛型通配符<?>
*(可以替代)任意类型,如果没有明确,那么就是Object以及任意的Java类了
* B:? extends E
*向下限定,E及其子类
* C:? super E
*向上限定,E及其父类
13.增强for的概述和使用
* A:增强for概述
*简化数组和Collection集合的遍历,底层依赖的是迭代器(Iterator)
* B:格式: @@@fore alt+/会自动生成下面的格式!!!
*
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
* C:案例演示
*数组,集合存储元素用增强for遍历
publicstatic void demo2() {
ArrayList<Person>list = new ArrayList<>();
list.add(newPerson("张三", 23));
list.add(newPerson("李四", 24));
for(Person person : list) {
System.out.println(person.getName()+"...."+person.getAge()); @@也可以直接调用get方法,得到属性值!!!!!!!!
} }
* D:好处
*简化遍历
ArrayList<String>list = new ArrayList<>();
list.add("a");
list.add("b");
for(Strings : list) {
System.out.println(s);
}
14.三种迭代的能否删除
* 普通for循环,可以删除,但是索引要--
public static void main(String[] args) {
ArrayList<String>list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
for(inti = 0; i < list.size(); i++) {
if("b".equals(list.get(i))){
list.remove(i--); //通过索引删除元素,如果list.remove(i);的话,当相邻的两个元素相同时只能删除第一个,因为当你删除第一个的时候,指针指向的是第一个,但删除完之后,后面的元素会整体向前移动一个位置,这时候当前指针位置是第二个要删除的元素,但随后i++,指针后移,就正好错过了这个要删除的元素,所以这时需要将指针向后退一个位置,在i++后正好删除它
}
}
* 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
Iterator<String>it = list.iterator(); //用它的话,它只有remove没有add
//ListIterator<String>it = list.listIterator();这句也可以
while(it.hasNext()){
if("b".equals(it.next())){
//list.remove("b"); //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
it.remove();
}
}
* 增强for循环不能删除,只能遍历.
15.静态导入的概述和使用
* A:静态导入概述
静态导入是导入类中静态方法
* B:格式:
*import static 包名….类名.方法名;
* C:注意事项
*方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
静态导入开发不用,但是需要能看懂
16.可变参数的概述和使用
* A:可变参数概述 @@可变参数其实是一个数组
*定义方法的时候不知道该定义多少个参数
* B:格式
*修饰符 返回值类型 方法名(数据类型… 变量名){}
* C:注意事项:
*这里的变量其实是一个数组
*如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
public static void print(int ... arr) { //可变参数其实是一个数组
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
} @@@可变参数虽然表示一个数组,但你调用这个方法时,你传一个数组print(arr);,传值print(11,22,33,44,55);或是什么都不传print();都可以调用这个方法,只不过什么都不传,什么都不打印
17.Arrays工具类的asList()方法的使用
* A:案例演示
* 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法(除了添加和减少的方法)
*Arrays工具类的asList()方法的使用
String[]arr = {"a","b","c"};
List<String>list = Arrays.asList(arr); //将数组转换成集合
//list.add("d"); //不能添加
Integer[]arr = {11,22,33,44,55}; //将数组转换成集合,数组必须是引用数据类型
List<Integer>list = Arrays.asList(arr);
System.out.println(list); @@[11,22,33,44,55]
*Collection中toArray(T[] a)泛型版的集合转数组
//集合转数组,加泛型的
ArrayList<String>list = new ArrayList<>();
list.add("a");
list.add("b");;
String[]arr = list.toArray(new String[10]); //当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size;如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
for(String string : arr) {
System.out.println(string);
}
18.集合嵌套之ArrayList嵌套ArrayList
* A:案例演示
*集合嵌套之ArrayList嵌套ArrayList
public class Demo5_ArrayListArrayList {
* 案例:
* 我们学科,学科又分为若个班级
* 整个学科一个大集合
* 若干个班级分为每一个小集合
publicstatic void main(String[] args) {
ArrayList<ArrayList<Person>>list = new ArrayList<>();
ArrayList<Person>first = new ArrayList<>(); //创建第一个班级
first.add(newPerson("杨幂", 30));
first.add(newPerson("李冰冰", 33));
first.add(newPerson("范冰冰", 20));
ArrayList<Person>second = new ArrayList<>();
second.add(newPerson("黄晓明", 31));
second.add(newPerson("赵薇", 33));
second.add(newPerson("陈坤", 32));
//将班级添加到学科集合中
list.add(first);
list.add(second);
//遍历学科集合
for(ArrayList<Person>a : list) {
for(Personp : a) {
System.out.println(p);
@@System.out.println(p.getName()+"...."+p.getAge());!!!!!
} } } }
注:了解部分翻看笔记源码!!!