ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)—两种方法。
import java.util.ArrayList; import java.util.Iterator; import com.heima.bean.Person; @SuppressWarnings({ "rawtypes", "unchecked" }) public class Demo2_ArrayList { /** * * A:案例演示 * 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同) * B:注意事项 * 重写equals()方法的 contains方法判断是否包含,底层依赖的是equals方法 remove方法判断是否删除,底层依赖的是equals方法 */ public static void main(String[] args) { ArrayList list = new ArrayList(); //创建集合对象 list.add(new Person("张三", 23)); list.add(new Person("张三", 23)); list.add(new Person("李四", 24)); list.add(new Person("李四", 24)); list.add(new Person("李四", 24)); list.add(new Person("李四", 24)); //方法1 //ArrayList newList = getSingle(list); //调用方法去除重复 //System.out.println(newList); //方法2 list.remove(new Person("张三", 23)); System.out.println(list); } /* * 创建新集合将重复元素去掉 * 1,明确返回值类型,返回ArrayList * 2,明确参数列表ArrayList * * 分析: * 1,创建新集合 * 2,根据传入的集合(老集合)获取迭代器 * 3,遍历老集合 * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加 */ public static ArrayList getSingle(ArrayList list) { ArrayList newList = new ArrayList<>(); //1,创建新集合 Iterator it = list.iterator(); //2,根据传入的集合(老集合)获取迭代器 while(it.hasNext()) { //3,遍历老集合 Object obj = it.next(); //记录住每一个元素 if(!newList.contains(obj)) { //如果新集合中不包含老集合中的元素 newList.add(obj); //将该元素添加 } } return newList; } }
*. 注意!:对上述例子需要重写equals方法,用于判断两个对象的属性相等。 ``` @Override public boolean equals(Object obj) { Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } ```
栈和队列数据结构
- 栈
- 先进后出
- 队列
- 先进先出
- 栈
用Linklist模拟栈数据结构,进栈和出栈
import java.util.LinkedList; public class Demo4_LinkedList { /** * 用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()); //弹栈 } } public 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()); } } }
创建一个类stack将Linked中的方法封装:
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(); } }
泛型(generic)概述和基本使用
- 泛型概述:泛型程序设计是程序设计语言的一种风格或范式。允许程序员在编写代码时使用一些以后才指定的类型,在实例化时(instantiate)作为参数指明这些类型。
- 泛型好处
- 提高安全性(将运行期的错误转换到编译期)
- 省去强转的麻烦
- 泛型基本使用
- 在类旁边放一个<>,在其中放的必须是引用数据类型
- 泛型使用注意事项
- 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
注意:在一个语句中,next方法只能调用一次,不能重复调用来获取同一值,因为如果调用多次会将指针向后移动多次。
- 泛型类
- A:泛型类概述
- 把泛型定义在类上* B:定义格式
- public class 类名<泛型类型1,…>
- C:注意事项
- 泛型类型必须是引用类型
-
- A:泛型方法概述
- 把泛型定义在方法上
- B:定义格式
- public <泛型类型> 返回类型 方法名(泛型类型 变量名)
- 静态方法static必须声明自己的泛型,与类的泛型无关
集合框架(增强for的概述和使用)(jdk1.5新特性)
- A:增强for概述
- 简化数组和Collection集合的遍历
- B:格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
} - C:案例演示
public static void demo1() { int[] arr = {11,22,33,44,55}; 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) { //for循环用 fore + alt + / 可快速完成 System.out.println(string); } } public 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)); for (Person person : list) { System.out.println(person); } }
三种迭代删除方法测试(重要)
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"); //1,普通for循环删除,索引要-- /*for(int i = 0; i < list.size(); i++) { if("b".equals(list.get(i))) { list.remove(i--); //通过索引删除元素 } }*/ //2,迭代器删除 /*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();) { //指针++操作,隐藏于next()中,无需再写 if("b".equals(it2.next())) { //list.remove("b"); //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常 it2.remove(); } }*/ //3,增强for循环,增强for循环不能删除,只能遍历 for (String string : list) { if("b".equals(string)) { list.remove("b"); //ConcurrentModificationException,报错,并发修改异常 } } System.out.println(list); }
-
- A:静态导入概述(jdk1.5新特性,开发时一般不用,了解即可)
- B:格式:
- import static 包名….类名.方法名;
- 可以直接导入到方法的级别
- C:注意事项
- 方法必须是静态的,如果使用中有多个同名的静态方法,容易不知道使用谁?这个时候要使用,还要再加前缀。由此可见,意义不大,所以一般不用。
-
- A:可变参数概述
- 定义方法的时候不知道该定义多少个参数
- B:格式
- 修饰符 返回值类型 方法名(数据类型 … 变量名){}
- C:注意事项:
- 可变参数其实是一个数组
- 可变参数可以不给他赋值
- 如果一个方法有可变参数,并且有多个参数,那么,要把可变参数放在最后一个
- A:可变参数概述
Java中处理数组的类:Array,Arrays,ArrayList,List,ListIterator
- 转。Arrays类的常用方法
数组转集合和集合转数组实例
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Demo4_AsList { /** * 数组转换成集合 * 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法 */ public static void main(String[] args) { demo1(); demo2(); demo3(); } public static void demo3() {//方法:集合转数组,加泛型的 ArrayList<String> list = new ArrayList<>();//创建集合,此集合非彼集合Set list.add("a"); list.add("b"); list.add("c"); list.add("d"); String[] arr = list.toArray(new String[10]);//当集合转换数组时,数组长度如果是小于等于集合的size时(如本例0,1,2,3,4),转换后的数组长度等于集合的size //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样 for (String string : arr) {//数组arr是不能直接打印的 System.out.println(string); } } public static void demo2() {//方法:整数数组转集合 //int[] arr = {11,22,33,44,55}; //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); } public static void demo1() {//方法:String数组转集合 String[] arr = {"a","b","c"}; List<String> list = Arrays.asList(arr);//将数组转换成集合 //list.add("d");//报错!数组转集合不能添加或减少 System.out.println(list); } }
-
数组Array和集合的区别: [补充 :数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。] (1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) (2)JAVA集合可以存储和操作数目不固定的一组数据。 (3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。 联系:使用相应的toArray()和Arrays.asList()方法可以互相转换。 一.集合的体系结构: List、Set、Map是这个集合体系中最主要的三个接口。 List和Set继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。 Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set 只能通过游标来取值,并且值是不能重复的。 List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。 ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的 Map 是键值对集合。其中key列就是一个集合,key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是Map的三个主要的实现类。 HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 值 二.List和ArrayList的区别 1.List是接口,List特性就是有序,会确保以一定的顺序保存元素. ArrayList是它的实现类,是一个用数组实现的List. Map是接口,Map特性就是根据一个对象查找对象. HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>) 2.一般情况下,如果没有必要,推荐代码只同List,Map接口打交道. 比如:List list = new ArrayList(); 这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要: List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类 这样,就不需要修改其它代码,这就是接口编程的优雅之处. 另外的例子就是,在类的方法中,如下声明: private void doMyAction(List list){} 这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数. 3.如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
泛型和集合的区别
泛型与集合的区别 泛型听起来很高深的一个词,但实际上它的作用很简单,就是提高c#程序的性能。 比如在计算机中经常用到一些数据结构,如队列,链表等,而其中的元素以前一般这么定义:object a=new object(); 这样就带来一个严重的问题,用object来表示元素没有逻辑问题,但每次拆箱、封箱就占用了大量的计算机资源,导致程序性能低下,而这部分内容恰恰一般都是程序的核心部分,如果使用object,那么程序的表现就比较糟糕。 而使用泛型则很好的解决这个问题,本质就是在编译阶段就告诉编译器,数据结构中元素的种类,既然编译器知道了元素的种类,自然就避免了拆箱、封箱的操作,从而显著提高c#程序的性能。 比如List<string>就直接使用string对象作为List的元素,而避免使用object对象带来的封箱、拆箱操作,从而提高程序性能。 可以自己编个小例子体验一下在使用数据结构时的情形,自然就理解了。
集合嵌套及遍历 实例
import java.util.ArrayList; public class Demo5_ArrayListArrayList { /** * * A:案例演示 * 集合嵌套之ArrayList嵌套ArrayList * 案例: * 我们学科,学科又分为若个班级 * 整个学科一个大集合 * 若干个班级分为每一个小集合 */ public static void main(String[] args) { ArrayList<ArrayList<Person>> list = new ArrayList<ArrayList<Person>>(); //嵌套。右边的<>里内容可不写 ArrayList<Person> first = new ArrayList<>(); //创建第一个班级 first.add(new Person("a", 30)); first.add(new Person("aa", 33)); first.add(new Person("aaa", 20)); ArrayList<Person> second = new ArrayList<>(); second.add(new Person("b", 31)); second.add(new Person("bb", 33)); second.add(new Person("bbb", 32)); //将班级添加到学科集合中 list.add(first); list.add(second); //遍历学科集合 for(ArrayList<Person> a : list) { //格式: for(引用类型名 集合中每一个元素:所在集合) for(Person p : a) { System.out.println(p); } } } } class Person { // 一般把类写在独立的class中,本例仅做演示 private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } /*@Override public boolean equals(Object obj) { Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; }*/ }
- jdk1.5-1.8新特性
学习日记40--java学习--集合框架2
最新推荐文章于 2018-09-19 19:14:00 发布