菜单

4166m金沙含面试知识点

2019年8月10日 - 4166am金沙下载
4166m金沙含面试知识点

Java集合框架体系详细梳理,含面试知识点。,java框架

一、集合类

集合的由来:

  面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式。

集合特点:

1,用于存储对象的容器。(容器本身就是一个对象,存在于堆内存中,里面存的是对象的地址)
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。 (只能存对象)

小问题:想用集合存基本数据类型怎么办?  

    装箱、拆箱。  例:al.add(5); // 相当于al.add(new
Integer(5));

集合和数组的区别:

  数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。

  数组中可以存储基本数据类型,集合只能存储对象。

 

集合框架的构成及分类:(虚线为接口)

4166m金沙 1

 

 

下面分别整理集合框架中的几个顶层接口。

 

一、集合类

集合的由来:

  面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式。

集合特点:

1,用于存储对象的容器。(容器本身就是一个对象,存在于堆内存中,里面存的是对象的地址)
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。 (只能存对象)

小问题:想用集合存基本数据类型怎么办?  

    装箱、拆箱。  例:al.add(5); // 相当于al.add(new
Integer(5));

集合和数组的区别:

  数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。

  数组中可以存储基本数据类型,集合只能存储对象。

 

集合框架的构成及分类:(虚线为接口)

4166m金沙 1

 

 

下面分别整理集合框架中的几个顶层接口。

 

一、集合类

集合的由来:

  面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式。

集合特点:

1,用于存储对象的容器。(容器本身就是一个对象,存在于堆内存中,里面存的是对象的地址)
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。 (只能存对象)

小问题:想用集合存基本数据类型怎么办?  
    装箱、拆箱。  例:al.add(5); // 相当于al.add(new Integer(5));

集合和数组的区别:

  数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。

  数组中可以存储基本数据类型,集合只能存储对象。

 

集合框架的构成及分类:(虚线为接口)

4166m金沙 3

4166m金沙, 

 

下面分别整理集合框架中的几个顶层接口。

 

二、 Collection接口

Collection子接口以及常用实现类:

Collection接口
  |–List接口:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

    |–Vector:内部是 数组 数据结构,是同步的。增删,查询都很慢!100%延长(几乎不用了)
 
    |–ArrayList:内部是 数组 数据结构,是不同步的。替代了Vector,查询的速度快,增删速度慢。50%延长。(查询时是从容器的第一个元素往后找,由于数组的内存空间是连续的,所以查询快;增删的话所有元素内存地址都要改变,所以增删慢。)
    |–LinkedList:内部是 链表 数据结构,是不同步的。增删元素的速度很快。(同理,链表的内存空间是不连续的,所以查询慢;增删时只需改变单个指针的指向,所以快;)

  |–Set接口:无序,元素不能重复。Set接口中的方法和Collection一致。

    |–HashSet: 内部数据结构是哈希表 ,是不同步的。
      |–LinkedHashSet:内部数据结构是哈希表和链表,是有顺序的HashSet。

    |–TreeSet:内部数据结构是有序的二叉树,它的作用是提供有序的Set集合,是不同步的。

   

List接口:

  有一个最大的共性特点就是都可以操作角标,所以LinkedList也是有索引的。list集合可以完成对元素的增删改查。

 

Set和List的区别:

  1. Set 接口实例存储的是无序的,不重复的数据。List
接口实例存储的是有序的,可以重复的元素 <最本质区别>

  2.
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 。

  3.
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变  。

 

ArryList和Vector可变长度数组的原理:

  当默认长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。

 

ArryList是线程不安全的,Vector是安全的:

由于是否有锁的判断将影响效率,故Arrylist效率远远高于Vector。而且只要是常用的容器就不是同步的,因为同步效率比较低。

 

ArryList存取对象的一个小例子:

        Person p1 = new Person("lisi1",21);

        ArrayList al = new ArrayList();
        al.add(p1);
        al.add(new Person("lisi2",22));
        al.add(new Person("lisi3",23));
        al.add(new Person("lisi4",24));

        Iterator it = al.iterator();
        while(it.hasNext()){
//          System.out.println(((Person) it.next()).getName()+"::"+((Person) it.next()).getAge());
            //错误方式:不能这样取,next()一次指针会移动一次,会输出“lisi1::22 lisi3::24”
            // 正确方式:拿到一个Person对象,然后取属性。
            Person p = (Person) it.next();
            System.out.println(p.getName()+"--"+p.getAge());
        }  

二、 Collection接口

Collection子接口以及常用实现类:

Collection接口
  |–List接口:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

    |–Vector:内部是 数组 数据结构,是同步的。增删,查询都很慢!100%延长(几乎不用了)
 
    |–ArrayList:内部是 数组 数据结构,是不同步的。替代了Vector,查询的速度快,增删速度慢。50%延长。(查询时是从容器的第一个元素往后找,由于数组的内存空间是连续的,所以查询快;增删的话所有元素内存地址都要改变,所以增删慢。)
    |–LinkedList:内部是 链表 数据结构,是不同步的。增删元素的速度很快。(同理,链表的内存空间是不连续的,所以查询慢;增删时只需改变单个指针的指向,所以快;)

  |–Set接口:无序,元素不能重复。Set接口中的方法和Collection一致。

    |–HashSet: 内部数据结构是哈希表 ,是不同步的。
      |–LinkedHashSet:内部数据结构是哈希表和链表,是有顺序的HashSet。

    |–TreeSet:内部数据结构是有序的二叉树,它的作用是提供有序的Set集合,是不同步的。

   

List接口:

  有一个最大的共性特点就是都可以操作角标,所以LinkedList也是有索引的。list集合可以完成对元素的增删改查。

 

Set和List的区别:

  1. Set 接口实例存储的是无序的,不重复的数据。List
接口实例存储的是有序的,可以重复的元素 <最本质区别>

  2.
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 。

  3.
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变  。

 

ArryList和Vector可变长度数组的原理:

  当默认长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。

 

ArryList是线程不安全的,Vector是安全的:

由于是否有锁的判断将影响效率,故Arrylist效率远远高于Vector。而且只要是常用的容器就不是同步的,因为同步效率比较低。

 

ArryList存取对象的一个小例子:

        Person p1 = new Person("lisi1",21);

        ArrayList al = new ArrayList();
        al.add(p1);
        al.add(new Person("lisi2",22));
        al.add(new Person("lisi3",23));
        al.add(new Person("lisi4",24));

        Iterator it = al.iterator();
        while(it.hasNext()){
//          System.out.println(((Person) it.next()).getName()+"::"+((Person) it.next()).getAge());
            //错误方式:不能这样取,next()一次指针会移动一次,会输出“lisi1::22 lisi3::24”
            // 正确方式:拿到一个Person对象,然后取属性。
            Person p = (Person) it.next();
            System.out.println(p.getName()+"--"+p.getAge());
        }  

二、 Collection接口

Collection子接口以及常用实现类:

Collection接口
  |–List接口:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

    |–Vector:内部是 数组 数据结构,是同步的。增删,查询都很慢!100%延长(几乎不用了)
 
    |–ArrayList:内部是 数组 数据结构,是不同步的。替代了Vector,查询的速度快,增删速度慢。50%延长。(查询时是从容器的第一个元素往后找,由于数组的内存空间是连续的,所以查询快;增删的话所有元素内存地址都要改变,所以增删慢。)
    |–LinkedList:内部是 链表 数据结构,是不同步的。增删元素的速度很快。(同理,链表的内存空间是不连续的,所以查询慢;增删时只需改变单个指针的指向,所以快;)

  |–Set接口:无序,元素不能重复。Set接口中的方法和Collection一致。

    |–HashSet: 内部数据结构是哈希表 ,是不同步的。
      |–LinkedHashSet:内部数据结构是哈希表和链表,是有顺序的HashSet。

    |–TreeSet:内部数据结构是有序的二叉树,它的作用是提供有序的Set集合,是不同步的。

   

List接口:

  有一个最大的共性特点就是都可以操作角标,所以LinkedList也是有索引的。list集合可以完成对元素的增删改查。

 

Set和List的区别:

  1. Set 接口实例存储的是无序的,不重复的数据。List
接口实例存储的是有序的,可以重复的元素 <最本质区别>

  2.
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 。

  3.
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变  。

 

ArryList和Vector可变长度数组的原理:

  当默认长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。

 

ArryList是线程不安全的,Vector是安全的:

由于是否有锁的判断将影响效率,故Arrylist效率远远高于Vector。而且只要是常用的容器就不是同步的,因为同步效率比较低。

 

ArryList存取对象的一个小例子:

        Person p1 = new Person("lisi1",21);

        ArrayList al = new ArrayList();
        al.add(p1);
        al.add(new Person("lisi2",22));
        al.add(new Person("lisi3",23));
        al.add(new Person("lisi4",24));

        Iterator it = al.iterator();
        while(it.hasNext()){
//          System.out.println(((Person) it.next()).getName()+"::"+((Person) it.next()).getAge());
            //错误方式:不能这样取,next()一次指针会移动一次,会输出“lisi1::22 lisi3::24”
            // 正确方式:拿到一个Person对象,然后取属性。
            Person p = (Person) it.next();
            System.out.println(p.getName()+"--"+p.getAge());
        }  

HashSet之覆盖hashCode方法和equals方法来保证元素唯一性 

如何保证HashSet的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的:
    ->如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 
    ->如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true:
      如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。

  记住:如果对象要存储到HashSet集合中,该对象必须覆盖hashCode方法和equals方法。
  一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法,以建立对象判断是否相同的依据。

 

例:往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素。

import java.util.HashSet;
import java.util.Iterator;

class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        // System.out.println(this+".......hashCode");
        return name.hashCode() + age * 27; // 乘以一个任意数,防止加了年龄以后HashCode仍相同
    }

    @Override
    public boolean equals(Object obj) {
        // 健壮性判断
        if (this == obj)
            return true;
        if (!(obj instanceof Person))
            throw new ClassCastException("类型错误");
        // System.out.println(this+"....equals....."+obj);

        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.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 String toString() {
        return name + ":" + age;
    }
}

public class HashSetTest {

    public static void main(String[] args) {
        HashSet hs = new HashSet();
        /*
         * HashSet集合数据结构是哈希表,所以存储元素的时候,
         * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。
         *
         */
        hs.add(new Person("lisi4", 24));
        hs.add(new Person("lisi7", 27));
        hs.add(new Person("lisi1", 21));
        hs.add(new Person("lisi9", 29));
        hs.add(new Person("lisi7", 27));

        Iterator it = hs.iterator();
        while (it.hasNext()) {
            Person p = (Person) it.next();
            System.out.println(p);
        }
    }
}  

运行结果:

lisi1:21
lisi9:29
lisi4:24
lisi7:27

HashSet之覆盖hashCode方法和equals方法来保证元素唯一性 

如何保证HashSet的元素唯一性呢?
  是通过对象的hashCode和equals方法来完成对象唯一性的:
    ->如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 
    ->如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true:
      如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。

  记住:如果对象要存储到HashSet集合中,该对象必须覆盖hashCode方法和equals方法。
  一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法,以建立对象判断是否相同的依据。

 

例:往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人,视为相同元素。

import java.util.HashSet;
import java.util.Iterator;

class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        // System.out.println(this+".......hashCode");
        return name.hashCode() + age * 27; // 乘以一个任意数,防止加了年龄以后HashCode仍相同
    }

    @Override
    public boolean equals(Object obj) {
        // 健壮性判断
        if (this == obj)
            return true;
        if (!(obj instanceof Person))
            throw new ClassCastException("类型错误");
        // System.out.println(this+"....equals....."+obj);

        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.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 String toString() {
        return name + ":" + age;
    }
}

public class HashSetTest {

    public static void main(String[] args) {
        HashSet hs = new HashSet();
        /*
         * HashSet集合数据结构是哈希表,所以存储元素的时候,
         * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。
         *
         */
        hs.add(new Person("lisi4", 24));
        hs.add(new Person("lisi7", 27));
        hs.add(new Person("lisi1", 21));
        hs.add(new Person("lisi9", 29));
        hs.add(new Person("lisi7", 27));

        Iterator it = hs.iterator();
        while (it.hasNext()) {
            Person p = (Person) it.next();
            System.out.println(p);
        }
    }
}  

运行结果:

lisi1:21
lisi9:29
lisi4:24
lisi7:27

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图