集合框架
List
ArrayList去重复方法
public class demo1_ArrayList { public static void main(String[] args) { //创建新集合将重复元素去掉 ArrayList list =new ArrayList(); list.add("a"); list.add("a"); list.add("c"); list.add("c"); list.add("a"); ArrayList newlist=getSing(list); System.out.println(newlist); } public static ArrayList getSing(ArrayList list){ ArrayList newlist = new ArrayList<>();//创建新集合 Iterator it = list.iterator(); //根据传入的集合(老集合)获取迭代器 while (it.hasNext()) { //遍历老集合 Object obj1= it.next(); //记录每一个元素 if (!newlist.contains(obj1)) { //如果新集合不包含老集合中的元素 newlist.add(obj1); //将该元素添加 } } return newlist; } }
import java.util.ArrayList; import java.util.Iterator; /* 重写equals()方法 * contains和remove判断都是依赖equals方法 * */ public class demo2_ArrayList { public static void main(String[] args) { ArrayList list = new ArrayList(); //创建集合对象 list.add(new person("张三",20)); list.add(new person("张三",20)); list.add(new person("张三",20)); list.add(new person("张三",20)); list.add(new person("李四",20)); list.add(new person("赵文",20)); list.add(new person("李四",20)); ArrayList newlist =getSing(list); System.out.println(newlist); } public static ArrayList getSing(ArrayList list){ ArrayList newlist = new ArrayList<>();//创建新集合 Iterator it = list.iterator(); //根据传入的集合(老集合)获取迭代器 while (it.hasNext()) { //遍历老集合 Object obj1= it.next(); //记录每一个元素 if (!newlist.contains(obj1)) { //如果新集合不包含老集合中的元素 newlist.add(obj1); //将该元素添加 } } return newlist; } } //第二个包 public class person { private String name; private int 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; } public person(String name, int age) { super(); this.name = name; this.age = age; } public person() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "person [name=" + name + ", age=" + age + "]"; } @Override public boolean equals(Object obj1) { person p=(person)obj1; return this.name.equals(p.name) && this.age == p.age; } }
LinkList的特有功能
public void addFirst( E e)及addFirst(E e)
public E getFirst( )及getLast( )
public E removFirst( ) 及public E remoLast( )
public E get(int index)
public class demo3_LinkedList { public static void main(String[] args) { demo1(); LinkedList list= new LinkedList(); } public static void demo1() { LinkedList list= new LinkedList(); list.addFirst("a"); //添加 list.addFirst("b"); list.addFirst("c"); list.addLast("z"); System.out.println(list); //System.out.println(list.getFirst());//获取 //System.out.println(list.getLast()); System.out.println(list.removeFirst());//删除 System.out.println(list.get(1)); System.out.println(list); } }
栈和队列数据结构
栈:
先进后出
队列:
先进先出
LinkedList模拟栈数据结构的集合并测试
package tan.jung.list; import java.util.LinkedList; import org.xml.sax.ErrorHandler; public class demo4_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); 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()); } } } //第二个包 package tan.jung.list; 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
泛型的好处:
提高安全性(将运用期的错误转换到编译器)
省去强转的麻烦
泛型基本使用:
< >中放的必须是引用数据类型
泛型使用注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
package tan.jung.generic; import java.util.ArrayList; import java.util.Iterator; import tan.jung.list.person; public class demo1_generic { public static void main(String[] args) { //demo1(); //ArrayList<person> list =new ArrayList<object>();//集合的泛型要保证前后的数量类型一致 //ArrayList<person> list =new ArrayList<>();//1.7版本的新特性,菱形泛型 ArrayList<object> list =new ArrayList<>(); //泛型最好不要定义成object,没有意义 } public static void demo1() { ArrayList<person> list =new ArrayList<person>(); // list.add("a"); // list.add(true); // list.add(100); list.add(new person("谭某",20)); list.add(new person("某某",22)); Iterator<person> it1=list.iterator(); while (it1.hasNext()) { // person p1=it1.next(); //System.out.println(it1.next().getName()+"..."+it1.next().getAge()); //next方法只能调用一次,如果调用多次会将指针向后移动多次 person p1=it1.next(); System.out.println(p1.getName()+"..."+p1.getAge()); } } }
泛型的由来
泛型的由来:通过object转型问题引入
早起的object类型可以接受任意的对象类型,但是在实际色使用中。会有类型转换的问题,也就存在隐患,所以java提供了泛型来解决这个安全问题
泛型类概述
把泛型定义在类上
定义格式
public class 类名<泛型类型1,...>
注意事项
泛型类型必须是引用类型
泛型的方法
把泛型定义在方法上
public <泛型类型> 返回类型 方法名 (泛型类型 变量名)
泛型接口
把泛型定义在接口
public interface 接口名<泛型类型>
public class demo4_generic { public static void main(String[] args) { } } interface Inter<T>{ public void show(T t); } /*class demo implements Inter<String>{ @Override public void show(String t) { System.out.println(t); } }*/ class demo<T> implements Inter<T>{ //没有必要再实现接口的时候给自己类加泛型 @Override public void show(T t) { System.out.println(t); } }
泛型通配符< ?>
任意类型,如果没有明确,那么就是object以及任意的java类了
? extends E
向下限定,E及其子类
?super E
向上1限定,E及其父类
public class demo_Generic { public static void main (String args []){ //List<?> list = new ArrayList<Integer>(); //?代表任意类型 当右边的泛型是不确定时,左边可以指定为? ArrayList<person> list1= new ArrayList<>(); list1.add(new person("张三",23)); list1.add(new person("李四",24)); list1.add(new person("赵八",28)); ArrayList<Student> list2=new ArrayList<>(); list2.add(new Student("六六",26)); list2.add(new Student("七七",27)); list1.addAll(list2); System.out.println(list1); } }
Foreach
public class demo1_Foreach { /* 增强for概述 * 简化数组和Collection集合的遍历 * 格式: * for(元素数据类型 变量: 数组或者Collection集合){ * 使用变量即可,该变量就是元素 * } * 增强for循环底层依赖的是迭代器(Iterator) * */ public static void main(String[] args) { int [] arr={1,2,3,4,5}; /*for (int i : arr) { System.out.println(i); }*/ for (int i : arr) { System.out.println(i); } ArrayList<String> list =new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); for (String string : list) { System.out.print(string); } } }
三种迭代
普通for循环,可以删除,但是要索引--
迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
增强for循环不能删除
import java.util.ArrayList; import java.util.Iterator; public class demo2 { 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> it1=list.iterator(); while (it1.hasNext()) { if ("b".equals(it1.next())) { //list.remove("b"); //不能用集合的删除犯法,因为迭代器过程中如果修改会出现并发修改异常 //it1.remove(); } } for(Iterator<String> it2=list.iterator();it2.hasNext();){ if ("b".equals(it2.next())) { //list.remove("b"); //不能用集合的删除犯法,因为迭代器过程中如果修改会出现并发修改异常 //it2.remove(); } } //3.增强for循环 ,不能删除,只能遍历 for (String string : list) { if ("b".equals(string)) { list.remove("b"); } } System.out.println(list); } }
静态导入
格式:
import static 包名..,类名.方法名
注意事项
方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀,由此可见,意义不太,所以一般不用
import static java.util.Arrays.sort; import javax.naming.ldap.SortControl; public class demo3_static { public static void main(String[] args) { int [] arr ={11,22,44,66,33,55}; sort(arr); //排序 //System.out.println(Arrays.toString(arr)); } public static sort(int [] arr){ } }
可变参数
定义方法的时候不知道该定义多少个数
格式:
修饰符 返回值类型 方法名 (数据类型... 变量名){ }
注意事项:
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
public class demo4_ChangeableArgs { public static void main(String[] args) { int [] arr={11,22,33,44,55}; print(11,22,33,44,55); System.out.println("----------"); //print(); } /*public static void print(int [] arr){ for (int i : arr) { System.out.println(i); } }*/ public static void print(int x,int ... arr){ //可变参数是一个数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
Arrays工具类的asList( )方法
import java.util.List; import java.util.ArrayList; import java.util.Arrays; public class demo5_AsList { //数组转换成集合,数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法 public static void main(String[] args) { //demo1(); //demo2(); //demo3(); //集合转数组,加泛型 ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); String [] arr=list.toArray(new String [10]); //当集合转换数组时,数组长度如果小于等于集合的size时,转换后的数组长度等于集合的size //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样 for (String string : arr) { System.out.println(string); } } public static void demo3() { Integer [] arr={11,22,33,44,55}; List<Integer> list=Arrays.asList(arr);//将数字转换成集合,数组必须是引用数据类型 System.out.println(list); } public static void demo2() { int [] arr={11,22,33,44,55}; List<int[]> list=Arrays.asList(arr); //基本数据类型的数组转换成集合,会将整个数组当做一个对象转换 System.out.println(list); } public static void demo1() { String [] arr={"a","b","c","d"}; List<String> list=Arrays.asList(arr); //将数字转换成集合 //list.add("f"); //不能添加 System.out.println(list); } }
集合嵌套ArrayList嵌套ArrayList
package tan.jung.jdk5; import java.util.ArrayList; import tan.jung.list.person; public class demo6_ArrayListArrayList { public static void main(String[] args) { ArrayList<ArrayList<person>> list =new ArrayList<>(); ArrayList<person> first = new ArrayList<>(); //创建第一个班级 first.add(new person("嘿嘿",18)); first.add(new person("嘻嘻",20)); first.add(new person("hh",22)); ArrayList<person> second = new ArrayList<>(); //创建第一个班级 second.add(new person("大力",19)); second.add(new person("美丽",21)); second.add(new person("ss",23)); //将班级天机到学科集合中 list.add(first); list.add(second); //遍历班级集合 for (ArrayList<person> a : list) { for (person person : a) { System.out.println(person); } } } }
来源:https://www.cnblogs.com/JungTan0113/p/10926340.html