剑指Offer(更新)之JavaSE(一)

1.Object类自带哪些方法?
  • toString()
  • equals(Object obj)
  • hashcode()
  • 5个线程的方法:
    wait()、 wait(long timeout)、wait(long timeout,int nanos)
    notify()、notifyall()
  • clone()
    对象的浅克隆和深克隆
  • finalize()
    垃圾回收机制
  • getClass()
    getClass()经常用于java反射机制
2.String类
  • String类代表字符串,一旦创建不能更改
  • String对象是不可改变的,所以可以共享
  • 两种赋值方法:1.直接赋值,创建对象是在方法区的常量池 2.通过构造方法:创建对象是在堆内存
  • Striing类对象改变的只是地址,原来的字符串还是存在的,并且产生垃圾
  • String的equals()方法:
 	boolean equals(Object obj):比较字符串的内容是否相同
  boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
  boolean startsWith(String str): 判断字符串对象是否以指定的str开头
  boolean endsWith(String str): 判断字符串对象是否以指定的str结尾
3.String、StringBuffer、StringBuilder的区别
  • 线程安全:String、StringBuffer;线程不安全:StringBulider
  • 效率:StringBulider>StringBuffer>String
  • 存储空间:
    (1)String是不可变,每次对String的操作都会生成新的String对象,效率低耗费大量存储空间,引起GC
    (2)StringBulider和StringBuffer都是可变的
  • 应用场景:
    1.操作少量的数据用String
    2.单线程操作字符串缓冲区下操作大量数据使用StringBuilder
    3.多线程操作字符串缓冲区下操作大量数据使用StringBuffer
  • 为什么StringBuilder的效率高
    将String类型的字符串存放在char[]数组当中,append()方法;如果数组的长度不够,就会自动扩容。
4.collection和collections的区别
  • collections是一个集合框架的帮助类,常用方法(collections.sort排序、collections.copy复制、collections.shuffle打乱)
  • collection是接口,里面有List、Set、Queue接口组成
5.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

HashSet的底层数据结构是哈希表,底层实现是HashMap,HashMap存储方式是<K,V>,HashSet存在HashMap中的K中,HashMap中的key是不能重复的。
==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。

6.从底层区分下ArrayList和LinkedList,Arraylist、LinkedList、HashMap的初始大小以及如何扩容

ArrayList和LinkedList区别:

  • ArrayList底层是数组+顺序结构,LinkedList底层是数组+链表
  • ArrayList查询快,增删慢;LinkedList查询慢,增删快
  • 两者都是线程不安全的,都允许有null值

Arraylist、LinkedList、HashMap的初始大小以及如何扩容

  • ArrayList 初始化大小是 10,扩容规则:新增的时候发现容量不够用了,就去扩容
    扩容大小规则是,扩容后的大小= 原始大小*1.5
  • linkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好
  • HashMap 初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子)
    扩容机制:当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容;resize()方式进行扩容
7.HashMap、Hashtable的区别
  • 继承的父类:HashMap实现AbstractMap类,HashTable继承Dictionary类
  • 对外实现的接口不同:HashTable多了elments()方法、cotains()方法
  • HashMap中key-value都允许为null值,key只能有一个null值;HashTable中key-value都不允许为null值
  • HashMap线程不安全,HashTable线程安全
  • 扩容机制:HashMap初始容量16,扩容为2n;HashTable初始容量11,扩容为2n+1
  • HashMap适合单线程环境,HashTable适合多线程环境
8.HashMap的底层
  • HashMap底层结构是数组+链表
  • HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
  • 如果在存储对象的过程中他们的hashcode值相同,就会发生碰撞;因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。
  • 当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。
9.HashMap、LinkedHashMap、ConcurrentHashMap的异同
  • 线程不安全:HashMap、LinkedHashMap;线程安全:ConcurrentHashMap采用锁分离技术
  • HashMap的底层是哈希表;LinkedHashMap是HashMap的子类,底层是链表+哈希表;ConcurrentHashMap的底层是数组+链表
  • HashMap允许有key和value都为null,但是key只能存在一个null;LinkedHashMap允许有key和value都为null;ConcurrentHashMap不允许key和value为null,key是唯一的,value值可变
  • ConcurrentHashMap:
    (1)底层是数组+链表;
    (2)不允许key和value为null,key是唯一的,value值可变
    (3)ConcurrentHashMap采用锁分离技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
    (4)由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock
    (5)ConcurrentHashMap包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
    (6)Concurrenthashmap如何扩容。扩容的时候首先会创建一个两倍于原容量的数组,然后将原数组里的元素进行再hash后插入到新的数组里。为了高效ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。
10.Java中HashMap的key值要是为类对象,则该类需要满足什么条件?

重写equals()和hashcode()方法
hashcode:计算键的hashcode值作为存储键信息的数组下标用于查找键对象的存储位置。
equals:HashMap使用equals()判断当前的键是否与表中的键相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值