Java基础

集合

集合框架:

  • collection
  • map

collection:

  • list
  • set
  • queue:在两端出入的list,所以也可以用数组或链表实现

map:

  • hashmap:键不可重复,值可重复;底层哈希表;线程不安全;允许key值为null,value也可以为null

  • hashtable:键不可重复,值可重复;底层哈希表;线程安全;key,value都不允许为null

  • treemap:键不可重复,值可重复;底层二叉树

list:

  • arraylist:排列有序,可重复;底层使用数组;速度快,增删慢,getter()和setter()方法快;线程不安全
  • vector:排列有序,可重复;底层使用数组;速度快,增删慢;线程安全,效率低
  • linkedlist:排列有序,可重复;底层使用双向循环链表数据结构;查询速度慢,增删快,add()和remove()方法快;线程不安全

set:

  • hashset:排列无序,不可重复;底层使用hash表实现;存取速度快;内部是hashmap(首先判断两个元素的哈希值,如果一样,用equals方法,为true,则为同一个元素)
  • treeset:排列无序,不可重复;底层使用二叉树实现;排序存储;内部是treemap的sortedset
  • linkedhashset:采用hash表存储,并用双向链表记录插入顺序

hashmap

数组+链表+红黑树
hashmap根据键的hashcode值存储数据,具有很快的访问速度,遍历顺序不去确定。非线程安全,如果满足线程安全,可以用collections的synchronizedmap方法使hashmap具有线程安全的能力,或者使用concurrenthashmap。
java7: hashmap是一个数组,每个元素使一个单向链表。Entry:key、value、hash值、用于单向链表的next
java8:java7查找时,根据hash值能够快速定位到数组的具体下标,然后顺着下标一个一个比较,时间复杂度为O(n).java8当链表的元素超过8个以上,会将链表转换为红黑树,在这些位置查找的时候可以降低时间复杂度为O(logN)

线程安全

ConcurrentHashMap是一个Segment数组,Segment通过继承ReentrantLock(api)来进行加锁,只要保证每个Segment是线程安全,也就实现了全局的线程安全

Java异常

异常分类
throwable是java语言中所有错误或异常的超类,下一层为error和exception
error:java运行时系统的内部错误和资源耗尽错误。
exception:
运行时异常 RuntimeException:NullPointerException、ClassCastException;一个是 检查时异常 CheckedException, 如I/O导致的IOException、SQLException。
RuntimeException是那些可能在Java虚拟机正常运行期间抛出异常的超类,如果出现RuntimeException,是程序的问题。
检查异常是外部错误,发生在编译阶段,try catch,包括:

试图在文件尾部读取数据
打开一个错误格式的url
根据给定的字符串查找class对象,字符串表示的类不存在

异常的处理方式

抛出异常: throw,throws,系统自动抛出异常

throw和throws的区别

  • throws在函数上,后面跟异常类可以跟多个
    throw用在函数内,后面跟的是异常对象
  • throws声明异常,让调用者知道该功能出现的问题,给出预先的处理方式,throw抛出具体的问题对象,执行到throw,功能就结束,将问题给调用者。
  • throws表示异常出现的可能性,并不一定会发生。throw抛出异常
  • 两者只是抛出异常,不会由函数取处理异常,真正处理异常的由函数的上层调用处理

Java反射

加载:class文件读入内存,创建一个Class类,建立一个Class对象。
反射: 一种动态调用方法或者属性的一种机制,获取字节码文件对象,剖析该类中存在哪些构造方法, 哪些成员变量, 哪些成员方法。

获取class文件对象的三种方式

  • Object类的getClass()方法
Object obj = new Object();
Class aClass = obj.getClass();
  • 静态属性class
Class objectClass = Object.class;
  • Class类中静态方法forName()
Class studentClass = Class.forName(org.westos.demo.Student);
Class aClass3 = Class.forName(java.lang.Object);

创建对象的两种方式
1 class对象的newInstance()
2 调用constructor对象的newInstance()

Class c=Class.forName("rel=flection.Person");
Person p=(Person) c.newInstance();
Constructor cc-c.getDeclaredConstructor(String.class,String.class,int.class);
Person p1=(Person) cc.newInstance("lisi","nan",20);

内部类

静态内部类

  • 可以访问外部类所有的静态变量和方法,即使private的也一样
  • 其他类使用静态内部类需要使用"外部类.静态内部类"方式,如Out.Inner inner=new Out.Inner(); inner.print();
  • HashMap内部就有一个静态内部类Entry

成员内部类
非静态类
局部内部类
在方法中使用
匿名内部类
继承父类或实现接口

多态

静态变量、静态方法、成员变量
编译运行看左边
成员方法
编译看左边运行看右边

Java复制

直接赋值复制
浅复制:复制对象
深复制:复制对象,复制引用对象

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值