1.LinkedList

  1. List是父类接口 Deque 队列
  2. 双向链表
  3. 队列:先进先出 排队
  4. 栈:先进后出 弹夹
  5. 特征:查询数据慢,增删改快

LinkedList方法

  1. add(int a , E e);//指定位置添加数据
  2. addFirst(E e);//添加数据在首位
  3. addLast(E e);//添加数据在最后
  1. package com.qfedu.test2LinkedList;
  2. import java.util.Iterator;
  3. import java.util.LinkedList;
  4. //LinkedList 的使用和遍历
  5. public class Demo1 {
  6. public static void main(String[] args) {
  7. LinkedList<String> list1 = new LinkedList<String>();
  8. //这个不能多态,子类独有的方法
  9. //因为LinkedList实现了List接口,但是LinkedList有自己独有的方法
  10. //就不要在父类的引用了
  11. list1.add("农夫山泉");
  12. list1.add("六个核桃");
  13. list1.add("康师傅");
  14. System.out.println(list1);
  15. list1.add(1, "雪碧");
  16. System.out.println(list1);
  17. list1.addFirst("可乐");
  18. System.out.println(list1);
  19. list1.addLast("a ?");
  20. System.out.println(list1);
  21. //遍历1:增强for
  22. for (String string : list1) {
  23. System.out.println(string);
  24. }
  25. System.out.println("--------------");
  26. //遍历2:for
  27. Object[] obj =list1.toArray();
  28. for (int i = 0; i < obj.length; i++) {
  29. System.out.println(list1.get(i));
  30. }
  31. System.out.println("--------------");
  32. //遍历3:迭代器
  33. Iterator<String> iterator = list1.iterator();
  34. while (iterator.hasNext()) {
  35. System.out.println(iterator.next());
  36. }
  37. }
  38. }

面试题:

ArrayList和LinkedList的区别:

  1. ArrayList:底层是数组,初始容量为10,超过10个数据以后会自动扩容,每次扩容是之前的1.5
  2. 特征:
  3. 增删慢:
  4. 1.增加数据的时候可能涉及到数组的扩容,数组赋值,效率低
  5. 2.增加一个数据或者删除一个数据,可能牵涉到数组的前移和后移,查询慢(for
  6. 查询快:
  7. 1.底层用的索引,可以直接找到当前值,时间复杂度是1,比如:目录
  8. 因为开发中查询偏多,所以使用ArrayList
  9. LinkedList底层是双线链表
  10. 增删快:直接找到被增加或者被删除那个数据的前置节点对象和后置节点对象进行添加和删除。时间复杂度是1
  11. 查询慢:因为底层是二分法查找的算法(二分法自己百度看)。时间复杂度是n/2 使用的for循环,凡是牵涉到for循环效率都低

2.Object类

Object是java所有类的超类,或者基类。是所有类的祖宗类

方法:

toString

String toString();变成字符串

  1. package com.qfedu.test3Object;
  2. //Object的toString方法
  3. class Person{//Person继承了Object
  4. String name;
  5. int age;
  6. @Override
  7. public String toString() {
  8. return "Person [name=" + name + ", age=" + age + "]";
  9. }
  10. }
  11. public class Demo1 {
  12. public static void main(String[] args) {
  13. Person person = new Person();
  14. person.name = "a ?";
  15. person.age = 18;
  16. //打印的时候会自己执行toString方法
  17. System.out.println(person);
  18. }
  19. }

equals

对象.equals(对象):比较的是地址

”字符串“.equals(“字符串”):比较的是内容

源码比较内存地址的,如下

  1. public boolean equals (object boj){
  2. return (this == obj);
  3. }

Object类下面的equals方法比较的是内存地址 所有使用了==

为什么String类的equals方法比较的是内容?能相同吗?

String继承Object,重写了equals,在重写的equals方法中不仅判断了内存地址,还判断了String的内容,内存地址和内容都是true

Object类下的equals方法比较的是内存地址。

String类下的equals方法比较的是内存地址和内容,都为true才为true。

String类是java封装的

需求:比较两个对象内容是否一致

重写equals方法:

  1. package com.qfedu.test3Object;
  2. //Object的equals方法
  3. class Student{
  4. int id;
  5. String name;
  6. public Student(int id, String name) {
  7. this.id = id;
  8. this.name = name;
  9. }
  10. @Override
  11. public String toString() {
  12. return "Student [id=" + id + ", name=" + name + "]";
  13. }
  14. @Override
  15. public boolean equals(Object obj) {//向上转型
  16. if(this == obj) {//内存地址一样 就直接返回true
  17. return true;
  18. }
  19. //如果对象的内容一样,也要返回true
  20. //将object类型的数据强转为Student类型的数据
  21. if (obj instanceof Student) {
  22. Student stu = (Student)obj;//向下转型
  23. //stu是student2的是属性值-->看代码39行
  24. //this是student的是属性值
  25. return stu.id == this.id && stu.name.equals(this.name);
  26. }
  27. return false;
  28. }
  29. }
  30. public class Demo2 {
  31. public static void main(String[] args) {
  32. Student student = new Student(1, "朱志伟");
  33. Student student2 = new Student(1, "朱志伟");
  34. //Student继承了Object,所以equals可以使用
  35. boolean b1 = student.equals(student2);
  36. //内容一样,内存地址不一样 所以false
  37. System.out.println(b1);//false-->重写之后就是true
  38. }
  39. }

hashCode

返回一个int的数据,object类中的hashCode方法把内存地址16进制的转换为10进制

  1. //hashCode方法
  2. public class Demo3 {
  3. public static void main(String[] args) {
  4. Object object = new Object();
  5. Object object2 = new Object();
  6. //以上两个的内存地址不一样
  7. System.out.println(object);//java.lang.Object@15db9742
  8. int a = object.hashCode();
  9. System.out.println(a);//366712642
  10. System.out.println(object2.hashCode());//1829164700
  11. }

String类下对hashCode进行了重写!!!这个重写的hashCode不在返回的内存的地址,返回的是字符串的ASSCI码值

  1. String string = new String("aa");
  2. String string2 = new String("aa");
  3. System.out.println(string.hashCode());//3104--返回ASSCI码值,不是地址
  4. System.out.println(string2.hashCode());//3104

要求:

重写了equals的方法,必须也要重写hashCode方法

ASSCI码一样,对象不一样一定

  1. package com.qfedu.test3Object;
  2. //重写了equals的方法,必须也要重写hashCode方法
  3. //官方手册要求
  4. //如果根据equals(Object)方法两个对象相等,
  5. //则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
  6. class Teacher{
  7. int id;
  8. String name;
  9. public Teacher(int id, String name) {
  10. super();
  11. this.id = id;
  12. this.name = name;
  13. }
  14. @Override
  15. public boolean equals(Object obj) {
  16. if (this == obj) {
  17. return true;
  18. }
  19. if (obj instanceof Teacher) {
  20. Teacher t = (Teacher)obj;
  21. return t.id == this.id && t.name.equals(this.name);
  22. }
  23. return super.equals(obj);
  24. }
  25. @Override
  26. public int hashCode() {
  27. // return id;
  28. return name.hashCode();//如果没有int类型,直接用字符串重写的hashCode方法
  29. }
  30. @Override
  31. public String toString() {
  32. return "Teacher [id=" + id + ", name=" + name + "]";
  33. }
  34. }
  35. public class Demo3test {
  36. public static void main(String[] args) {
  37. Teacher teacher = new Teacher(1, "朱志伟");
  38. Teacher teacher1 = new Teacher(1, "朱志伟");
  39. System.out.println(teacher.equals(teacher1));
  40. //如果根据equals(Object)方法两个对象相等,
  41. //则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
  42. //借助id,只比较id就行了
  43. System.out.println(teacher.hashCode());
  44. System.out.println(teacher1.hashCode());
  45. }
  46. }

3.Set集合

Set集合也是一个接口,和List一样

可以存数据,无序的,不可重复的。开发中少用

Set接口下面的两个实现类

  1. HashSet:底层是根据哈希值进行存储的,如果hash值一样,就存不了数据了
  2. TreeSet:底层是一个二叉树,对存入的数据可以进行自然排序

3.1HashSet

对集合的迭代次序不做任何保证(无序),特别是它不能保证数据在一段时间内保持不变,可以添加null值

  1. HashSet的方法:
  2. add(E e);
  3. remove(E e);

3.2HashSet存对象

  1. package com.qfedu.test4hashSet;
  2. //练习
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. class Employee{
  6. private String name;
  7. private int age;
  8. public Employee(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public int getAge() {
  20. return age;
  21. }
  22. public void setAge(int age) {
  23. this.age = age;
  24. }
  25. @Override
  26. public boolean equals(Object obj) {
  27. if(this == obj) {
  28. return true;
  29. }
  30. if (obj instanceof Employee) {
  31. Employee e = (Employee)obj;
  32. return e.getName().equals(this.getName()) && e.getAge() == this.getAge();
  33. }
  34. return false;
  35. }
  36. @Override
  37. public int hashCode() {
  38. // TODO Auto-generated method stub
  39. return age;
  40. }
  41. @Override
  42. public String toString() {
  43. return "Employee [name=" + name + ", age=" + age + "]";
  44. }
  45. }
  46. public class Demo2test {
  47. public static void main(String[] args) {
  48. Employee employee1 = new Employee("朱志伟", 24);
  49. Employee employee2 = new Employee("朱志伟", 24);
  50. Employee employee3 = new Employee("杨博", 23);
  51. Set<Employee> set = new HashSet<Employee>();
  52. set.add(employee1);
  53. set.add(employee2);
  54. set.add(employee3);
  55. System.out.println(set);
  56. }
  57. }