List的学习
今天的主要内容
集合框架(去除ArrayList中重复字符串元素方式)(掌握)
集合框架(去除ArrayList中重复自定义对象元素)(掌握)
集合框架(LinkedList的特有功能)(掌握)
集合框架(用LinkedList模拟栈数据结构的集合并测试)(掌握)
集合框架(三种迭代的能否删除)(掌握)
集合框架(三种迭代的能否删除)(掌握)
一、集合框架(去除ArrayList中重复字符串元素方式)(掌握)
-
案例演示
需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
-
思路:创建新集合方式
- 分析:
- 创建新集合
- 获取老集合中的迭代器
- 遍历老集合
- 通过新集合判断是否包含老集合中的元素,如果包含则不添加,不包含则添加
- 分析:
此时要注意的是:从老集合中获取,到新的中查看是否存在
2 .程序
/*
* * A:案例演示
* 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
* 思路:创建新集合方式
*
* 分析:
* 1. 创建新集合
* 2. 获取老集合中的迭代器
* 3.遍历老集合
* 4. 通过新集合判断是否包含老集合中的元素,如果包含则不添加,不包含则添加
* */
public class TestList_1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("haha");
list.add("xixi");
list.add("haxi");
list.add("xiha");
list.add("haha");
list.add("xixi");
list.add("haxi");
list.add("xiha");
System.out.println("======原集合中元素为======");
System.out.println(list);
System.out.println("======去重后集合中元素为======");
System.out.println(getList(list));
}
private static ArrayList<String> getList(ArrayList<String> list) {
//创建新集合
ArrayList<String> newList = new ArrayList<>();
//获取老集合的迭代器
Iterator<String> i = list.iterator();
while(i.hasNext()) {
//获取老集合中元素
String s = i.next();
//如果新集合中不包含则add
if(!newList.contains(s))
newList.add(s);
}
return newList;
}
}
/*
在JDK1.8中输出结果为:
------------------------------------------------
======原集合中元素为======
[haha, xixi, haxi, xiha, haha, xixi, haxi, xiha]
======去重后集合中元素为======
[haha, xixi, haxi, xiha]
------------------------------------------------
*/
二、集合框架(去除ArrayList中重复自定义对象元素)(掌握)
-
自定义Employee类并存储对象到集合中,然后去重
- 重写equals()方法的
-
class Employee
class Employee{ //data field private String name; private double salary; private LocalDate hireDay; //constructor public Employee(String name,double salary,int year,int month,int day){ this.name = name; this.salary = salary; this.hireDay = LocalDate.of(year,month,day); } //method public String getName(){ return name; } public double getSalary(){ return salary; } public LocalDate gethireDay(){ return hireDay; } public void raiseSalary(double byPercent){ salary += salary * byPercent/100; } public String toString() { return "name : " + name + " salary : " + salary + " hireDay : " + hireDay; } @Override public boolean equals(Object obj) { if(this == obj) return true; if(obj == null) return false; if(this.getClass() != obj.getClass()) return false; Employee e = (Employee)obj; return (this.name.equals(e.name) && this.salary == e.salary && this.hireDay.equals(e.hireDay)); } }
-
class TestList_2
public class TestList_2 { public static void main(String[] args) { ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee("haha",200,2018,7,16)); list.add(new Employee("xixi",200,2018,7,16)); list.add(new Employee("haxi",200,2018,7,16)); list.add(new Employee("xiha",200,2018,7,16)); list.add(new Employee("haha",200,2018,7,16)); list.add(new Employee("xixi",200,2018,7,16)); list.add(new Employee("haxi",200,2018,7,16)); list.add(new Employee("xiha",200,2018,7,16)); System.out.println("======原集合中元素为======"); for(int i = 0;i < list.size();i++) { System.out.println(list.get(i)); } System.out.println("======去重后集合中元素为======"); ArrayList<Employee> newList = getList(list); for(int i = 0;i < newList.size();i++) { System.out.println(newList.get(i)); } } private static ArrayList<Employee> getList(ArrayList<Employee> list) { //创建新集合 ArrayList<Employee> newList = new ArrayList<>(); //获取老集合的迭代器 Iterator<Employee> i = list.iterator(); while(i.hasNext()) { //获取老集合中元素 Employee s = i.next(); //如果新集合中不包含则add if(!newList.contains(s)) newList.add(s); } return newList; } } /* * 在JDK1.8中输出结果为: * -------------------------------------------------------- * ======原集合中元素为====== name : haha salary : 200.0 hireDay : 2018-07-16 name : xixi salary : 200.0 hireDay : 2018-07-16 name : haxi salary : 200.0 hireDay : 2018-07-16 name : xiha salary : 200.0 hireDay : 2018-07-16 name : haha salary : 200.0 hireDay : 2018-07-16 name : xixi salary : 200.0 hireDay : 2018-07-16 name : haxi salary : 200.0 hireDay : 2018-07-16 name : xiha salary : 200.0 hireDay : 2018-07-16 ======去重后集合中元素为====== name : haha salary : 200.0 hireDay : 2018-07-16 name : xixi salary : 200.0 hireDay : 2018-07-16 name : haxi salary : 200.0 hireDay : 2018-07-16 name : xiha salary : 200.0 hireDay : 2018-07-16 -------------------------------------------------------- * */
三、集合框架(LinkedList的特有功能)(掌握)
-
LinkedList类概述
- LinkedList类特有功能
- public void addFirst(E e)及addLast(E e)
- public E getFirst()及getLast()
- public E removeFirst()及public E removeLast()
- public E get(int index);
-
程序
public class TestLinkedList_1 { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.addFirst("1"); //头部插入,插入顺序和输出顺序相反 list.addFirst("2"); list.addFirst("3"); list.addLast("i"); //尾部插入,则输入顺序和输出顺序一致 list.addLast("love"); list.addLast("you");; System.out.println("======list集合中的元素======"); list.forEach((str) ->{ System.out.print (str + " "); }); System.out.println(); System.out.println(); //获取0号位置上元素 System.out.println("====get(int index)获取元素===="); System.out.println("第 0 个位置上元素为:" + list.get(0)); System.out.println(); //删除头部和尾部 System.out.println("======删除头部和尾部后======"); list.forEach((str) ->{ System.out.print(str + " "); }); } } /* * 在JDK1.8中输出结果为: * ----------------------------- * ======list集合中的元素====== 3 2 1 i love you ====get(int index)获取元素==== 第 0 个位置上元素为:3 ======删除头部和尾部后====== ----------------------------- 2 1 i love * */
四、集合框架(用LinkedList模拟栈数据结构的集合并测试)(掌握)
-
创建Stack类,利用LinkedList来实现进栈、出栈和判空
class Stack<E> { private LinkedList<E> list = new LinkedList<>(); //元素添加 void add(E e) { list.addFirst(e); } //元素取出 E get() { return list.removeFirst(); } boolean isEmpty() { return list.isEmpty(); } }
-
Stack测试类——TestStack
public class TestStack { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.add("1"); stack.add("2"); stack.add("3"); stack.add("4"); while(!stack.isEmpty()) { System.out.print(stack.get() + " "); } } } /* * 在JDK1.8中输出结果为: * --------------- * 4 3 2 1 * --------------- * */
五、集合框架(泛型概述和基本使用)(掌握)
泛型概述
-
泛型好处
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
-
泛型基本使用
- <>中放的必须是引用数据类型
-
泛型使用注意事项
- 前后的泛型必须一致,或者后面的泛型可以省略不写
六、集合框架(三种迭代的能否删除)(掌握)
-
普通for循环,可以删除,但是索引要--
List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("b"); list.add("d"); System.out.println("======list中元素======"); System.out.println(list); System.out.println("=====删除元素'b'后====="); //for循坏进行元素删除 for(int i = 0;i < list.size();i++) { if(list.get(i).equals("b")) { //list.remove(i); //remove以后数组元素上移,i本来指向了下一个待检查的元素,但是i++使得指针下移,造成元素遗漏 list.remove(i--); } } System.out.println(list); /* * 在JDK1.8中输出结果为: * -------------------------- * ======list中元素====== [a, b, b, d] =====删除元素'b'后===== [a, b, d] //无法做到正确删除b,i的问题 ------------------------- * */
-
迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("b"); list.add("d"); System.out.println("======list中元素======"); System.out.println(list); System.out.println("=====删除元素'b'后====="); for(Iterator<String> iterator = list.iterator();iterator.hasNext();) { if("b".equals(iterator.next())) iterator.remove(); //不可调用集合的remove方法 } System.out.println(list); /* * 在JDK1.8中输出结果为: * ------------------------ * ======list中元素====== [a, b, b, d] =====删除元素'b'后===== [a, d] //成功删除 ------------------------- * */
-
增强for循环不能删除
有异常,增强的for循坏不可以删除元素,只能遍历
因为增强的for循坏的原理就是迭代器,迭代器中不可以通过集合名称来删除元素
七、集合框架(集合嵌套之ArrayList嵌套ArrayList)(掌握)
-
A:案例演示
- 集合嵌套之ArrayList嵌套ArrayList
-
程序
public class TestMulArrayList { public static void main(String[] args) { ArrayList<Employee> personList1 = new ArrayList<>(); //第一个部门员工信息 ArrayList<Employee> personList2 = new ArrayList<>(); //第二个部门员工信息 //为第一个部门员工添加信息 personList1.add(new Employee("haha", 200, 2018, 7, 24)); personList1.add(new Employee("xixi", 300, 2018, 7, 24)); //为第二个部门员工添加信息 personList2.add(new Employee("haxi", 400, 2018, 7, 24)); personList2.add(new Employee("xiha", 500, 2018, 7, 24)); ArrayList<ArrayList<Employee>> depList = new ArrayList<>(); depList.add(personList1); depList.add(personList2); for(ArrayList<Employee> elem : depList) { System.out.println(elem); } } /* 在JDK1.8中输出结果为: * [name : haha salary : 200.0hireDay : 2018-07-24, name : xixi salary : 300.0hireDay : 2018-07-24] [name : haxi salary : 400.0hireDay : 2018-07-24, name : xiha salary : 500.0hireDay : 2018-07-24] * */