Java基础总结(二)

list,set,queue

List(ArrayList,LinkedList,Vector)

  • List 是一个接口,它继承于Collection的接口。它代表着有序的队列。
  • 在这里插入图片描述
  • ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。查询是O(1),删除插入是O(n),在末尾删除插入是O(1)
  • LinkedList底层是通过双向链表实现的。查询是O(n),删除插入是O(1),在末尾查询是O(1)。LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
  • Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。扩容时,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

Set

  • Set集合的特点:不能存储相同的元素。
  • 在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
  • HashSet底层由HashMap实现,是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;线程不安全。允许插入null值。
  • TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;线程不安全。允许插入null值。TreeSet类中跟HashSet类一样也没有get()方法来获取指定位置的元素,所以也只能通过迭代器方法来获取。TreeSet虽然是有序的,但是并没有具体的索引,当插入一个新的数据元素的时候,TreeSet中原有的数据元素可能需要重新排序,所以TreeSet插入和删除数据元素的效率较低。

queue

在这里插入图片描述

  • PriorityQueue类实质上维护了一个有序列表。加入到Queue中的元素根据他们天然排序(通过其java.util.Comparable实现)或者根据传递给构造函数的java.util.Comparator来实现定位。
  • ConcurrentLinkedQueue是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小,ConcurrentLinkedQueue对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。(通过CAS保证并发)
  • java.util.concurrent 中加入了 BlockingQueue 接口和五个阻塞队列类。它实质上就是一种带有一点扭曲的 FIFO 数据结构。不是立即从队列中添加或者删除元素,线程执行操作阻塞,直到有空间或者元素可用。

一些关键词的作用:final,static等等

final

  • 修饰成员变量、方法、类,表示成员变量不可变,方法不可被子类重写,类不可被继承
  • 一个类的private方法会隐式的被指定为final方法
  • final修饰的成员变量只能在初始化时被赋值,或者在构造方法中被赋值,只可赋值一次。
  • final类中的成员方法都会被隐式的指定为final方法。在JDK中,被设计为final类的有String、System等。

补充知识点:接口中默认成员变量修饰符:public static final,默认方法修饰符:public abstract

static

  • static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
  • 方便在没有创建对象的情况下来进行调用(方法/变量)。方便在没有创建对象的情况下来进行调用(方法/变量)。
  • static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

**虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。
**所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

  • static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static是不允许用来修饰局部变量

  • static静态代码块优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

补充一个知识点:执行顺序,父类静态代码块>子类静态代码块>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法。
在执行main方法前,先加载main方法所在的类,如果main方法所在的类是子类,那就先去加载父类。在父类子类都加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量。完成了父类的初始化,然后就来初始化自身了。
static块可以出现类中的任何地方(只要不是方法内部,记住,任何方法内部都不行)

Java访问修饰符

  • private,私有的访问权限,也是最严格的访问权限,仅只能在设置了该权限的类中访问,利用这个访问权限,表现出封装思想。
  • default,默认的访问权限,也是可以省略的访问权限,它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问。
  • protected,受保护的访问权限,它除了具有default的访问权限外,还可以在不同包中所继承的子类访问。
  • public,公有的访问权限,也是最宽松的访问权限,不仅可以是同一个类或子类,还是同一个包中的类或子类,又还是不同包中的类或子类,都可以访问。

抽象类和接口

  • 抽象类单继承,接口多实现。
  • 抽象类可包含普通方法,接口中只能有抽象方法。
  • 抽象类中的构造方法和静态方法不可用abstract修饰。
  • 抽象类中的方法可以是public、protected;接口方法只有public。
  • 接口中默认成员变量修饰符:public static final,默认方法修饰符:public abstract。
  • 抽象类和接口反应的设计理念不同,抽象类表示的是“is - a”关系,接口表示的是“lile - a”关系。
  • 实现接口的类必须实现其中的所有的方法,继承自抽象类的子类实现所有的抽象方法。
  • 继承抽象类用 extends 关键字;实现接口用 implements 关键字。继承写在前面,实现接口写在后面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值