三十二、Java基础之List集合
一、list相关方法演示
public class Test01 { public static void main(String[] args){ //1、创建list集合 List<String> list = new ArrayList<>(); //2、新增元素 list.add("gg"); list.add("jj"); list.add("dd"); list.add("mm"); list.add("jj"); //3、直接打印 System.out.println(list); //4、在指定索引值位置添加,注意索引值越界 list.add(0,"MM"); list.add(list.size(),"DD"); System.out.println(list); //5、删除指定位置的元素 list.remove(0); System.out.println(list); list.remove(list.size()-1); //6、返回指定位置的元素 System.out.println(list.get(0)); System.out.println(list.get(list.size()-1)); //7、修改指定位置的元素,并没有生成新的List列表,而是返回原有列表的一个视图 System.out.println(list); list.set(0,"KK"); System.out.println(list);//[KK, jj, dd] //8、返回指定范围的子列表 List<String> sublist = list.subList(0,3); System.out.println(sublist); //修改自列表sublist sublist.add("DD"); sublist.set(0,"ee"); System.out.println(sublist);//[ee, jj, dd, DD] //对sublist的修改实际上是对list的修改 System.out.println(list);//[ee, jj, dd, DD, mm, jj] //9、返回元素第一次出现的位置 System.out.println(list.indexOf("jj"));//1 System.out.println(list.lastIndexOf("jj"));//5 //10、ListIterator迭代器 ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()){ String string =(String) listIterator.next(); System.out.print(string + "\t"); } System.out.println(); //ListIterator还可以向前迭代,经过上个while循环后,listIterator游标指向最后一个 while (listIterator.hasPrevious()){ String str=listIterator.previous(); System.out.print(str+"\t"); } System.out.println(); //ListIterator不仅可以删除元素,还可以修改/添加元素 [ee, jj, dd, DD, mm, jj] while (listIterator.hasNext()) { String string = (String)listIterator.next(); if (string.equals("mm")){ listIterator.remove(); }else if(string.equals("jj")){ listIterator.add("jjj"); }else if (string.equals("DD")){ listIterator.set("DDD"); } } System.out.println(list); //[ee, jj, jjj, dd, DDD, jj, jjj] } }
二、List集合存储自定义类型数据
public class Person { String name; int age; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return age == person.age && name.equals(person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Person(String name, int age) { this.name = name; this.age = age; } }
public class Test02 { public static void main(String[] args){ //创建List集合,存储Person对象 List<Person> list = new ArrayList<>(); //添加元素 list.add(new Person("lisi",18)); list.add(new Person("wangwu",22)); list.add(new Person("zhangyu",126)); list.add(new Person("gouzi",23)); System.out.println(list);//[Person{name='lisi', age=18}, Person{name='wangwu', age=22}, Person{name='zhangyu', age=126}, Person{name='gouzi', age=23}] Person wangwu = new Person("wangwu",22); System.out.println(list.contains(wangwu));//true list.remove(wangwu); System.out.println(list);//[Person{name='lisi', age=18}, Person{name='zhangyu', age=126}, Person{name='gouzi', age=23}] } }
三、List排序
public class Test03 { public static void main(String[] args){ //创建List集合,存储Person对象 List<Person> list = new ArrayList<>(); //添加元素 list.add(new Person("lisi",18)); list.add(new Person("wangwu",22)); list.add(new Person("zhangyu",126)); list.add(new Person("gouzi",23)); System.out.println(list); //对List集合中的元素排序,想要对list集合中的Person按照年龄降序排列, list.sort(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { //在compare方法中指定比较规则,按照年龄降序 //return o2.age-o1.age;//如果o1的年龄大返回负数,o2的年龄大返回正数-降序 return o1.age-o2.age;//如果o1的年龄大返回正数,o2的年龄大返回负数-升序 } }); System.out.println(list); //按照name首字母排序 list.sort(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { //return o1.name.compareTo(o2.name);//姓名升序 return o2.name.compareTo(o1.name);//姓名降序 } }); System.out.println(list); } }
四、ArrayList 和 Vector
/** * 1。ArrayList 和 Vector底层都是数组 * 2。ArrayList 和 Vector默认初始化容量都是10 * 3。ArrayList 扩容1。5倍 和 Vector扩容2倍 * 4。Vector提供的方法都使用了synchronized修饰,是线程安全的 * ArrayList不是线程安全的 * * 创建日期:2019-06-30-16:33 */
五、单项链表,双向链表,LinkedList
/** * 创建日期:2019-06-30-17:01 * * * 单项链表: * * 双向链表: * 优点:添加和删除元素时,只需要修改一下节点的next/prev指针域即可 * * 缺点:每次访问,要么从头节点开始,要么从尾节点开始顺序查找 * * 与单项链表相比:不仅可以访问某个结点的next后继,还可以访问某个节点的prev前驱 * * * *LinkedList新增方法: * 主要增加了针对头结点与尾结点进行操作的方法,即针对第一个元素和最后一个元素进行操作的方法 * * addFirst(E e): 添加到头部 * addLast(E e): 添加到尾部 * element(): 返回第一个元素 * getFirst():返回第一个元素 * removeFirst()返回最后一个元素 * * boolean offer(E e):把元素添加到尾部 * boolean offerFirst(E e):添加到头部 * boolean offerLast(E e):添加到尾部 * * peek():返回第一个元素 * peekFirst():返回第一个元素 * peekLast():返回最后一个元素 * * poll():删除第一个元素并返回 * pollFirst():删除第一个元素并返回 * pollLast():删除最后一个元素并返回 * * pop(): 删除第一个元素并返回 * push():在头部添加元素 * removeFirst()删除第一个元素并返回 * removeLast()删除最后一个元素并返回 * push()/pop()模拟栈,栈特点是先进后出,后进先出 * offer()/poll()模拟队列,队列的特点是先进先出 * * * */
当有些人一出生就有的东西,我们要为之奋斗几十年才拥有。但有一样东西,你一辈子都不会有,那就是我们曾经一无所有。