1.String一些方法?
答:length()方法是获取字符串长度,charAt(int index)是返回指定索引的字符,equals(Object anther)比较两个字符串的内容是否完全相同,compareTo(String s)按照字典顺序比较两个字符串,相等是0,小于为负数,否者是正数。contains(CharSequence s)检查字符串中是否包含某个字符,replace(CharSequence s,CharSequence sb)用新的字符替换旧的字符,substring(int begin,int end)截取字符,获取新的字符。
2.抽象类和接口有什么区别?
答:抽象类主要是规定了所继承的它的子类必须要实现具体的方法,但是不涉及该方法的具体实现。而接口通常是涉及了到了方法的具体实现。一个类可以实现多个接口,但是只能继承一个抽象类,抽象类可以包含各种类型的成员变量,但是接口只能包含常量,不能有变量,在抽象类中可以有多种访问修饰符,比如说private、protected或public,而接口中的方法和变量默认都是public。直到jdk8引入了private方法,但是场景有限。
3.Java容器有哪些?
答:Java容器主要是指Java集合框架中的类和接口,它们主要用于存储对象的集合。主要是分成四个部分,列表(List),集合(Set),队列(Queue),映射(Map)。每个部分都有他们的具体实现。首先是列表List:特点是有序(存取顺序),有索引,可以包含重复元素。主要的实现类是ArrayList:基于动态数组的实现,因为有索引所以可以快速的进行随机访问和高效的遍历。LinkedList是基于双向链表实现的,因为每个元素节点包含三部分,数据部分和两个指针,所以在执行新增或者是删除的时候只需要修改元素的前后两个指针即可时间复杂度是O(1)。Vector(迭代器):和ArrayList相似,但是他是同步的,用于多线程环境,其内部通过在关键的方法上使用synchronized关键字来实现线程安全。然后,是集合Set:其特点是无序的,元素不可重复的,无索引,其实现类有HashSet:基于哈希表实现的,提供高效的遍历,但是不保证存取元素的顺序,LinkedHashSet基于哈希表和链表的实现,维护了元素的插入顺序。底层的数据结构依然是哈希表,只是每个元素又额外的多了一个链表的机制记录存储的顺序。最后的话是TreeSet:基于红黑树实现,元素按照自然排序或者自定义比较器去排序。自然排序的话基本数据类型是从小到大的顺序,字符串是按照字符在ASCLL码表中的数字升序进行排序,自定义规则的话是实现重写compareTo接口进行自定义。
然后就是队列(Queue),按照指定顺序处理元素的集合,主要的实现类包括LinkedList、PriorityQueue等,LinkedList:基于优先级堆实现,元素按照自然顺序或者自定义的比较器进行排序。最后是映射(Map)存储键值对的对象,主要实现类包括HashMap、LinkedHashMap,TreeMap和Hashtable。HashMap:基于哈希表的Map接口实现,不保证顺序。LinkedHashMap:基于哈希表和链表实现,保持了键值对的插入顺序,TreeMap:基于红黑数实现,按照键的自然排序或自定义排序。HashTable和HashMao类似但是他是同步的。
4.创建线程的方式?
在Java中一共有四种常见的创建线程的方式,第一种是继承Thread类,需要创建一个继承Thread类的子类,并且在子类中重写run()方法定义线程执行的操作,然后创建该子类的实例并且调用其start()方法来启动线程。
class MyThread extends Thread {
public void run() {
System.out.println("Thread running by extending Thread class.");
}
}
// 使用示例
public class ThreadExample {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
第二种是实现runnable接口的run方法,然后将Runnanle实例传递给Thread类的构造器,并且通过Thread对象的start()方法启动线程,