java基础中的基础

1,各种变量的初始值:封装的基本就是NULL,8大基本类型除了boolean都是0,
8大基本类型:int , short , char , byte ,float , double ,boolean , long以及他们构成数组,list的成员都是0;
封装的:Long , Double等的直接初始值是NULL;

2,排序和去重
数组的排序:Array.sort()
list的排序:Collection.sort()
去重(除了用循环): list.stream().distinct.collect(Collectors.toList());

3,ArrarList和linkedlist的区别:
ArrarList(线性表),是基于数组实现的,是线性表,因此从中删除一个元素会需要移动很多元素。
linkedlist(是链表),基于结点实现的,是链表,就是为了解决线性表删除元素需要大量移动的问题的,这个只需要改动结点指向即可。
方法的区别:
get() : ArrarList直接读取第i个下标,linkedlist获取第几个元素,依次遍历。时间复杂度O(1)?(n)
add(a) : ArrarList直接后面添加元素,linkedlist添加到末尾。时间复杂度O(1)?(1)
add(index a) : ArrarList在index后面插入,后面的元素需要向后移动,linkedlist在index处添加,指针指向。时间复杂度O(n)?(n)
remove() ArrarList删除元素,后面的需要移动,linkedlist删除元素,指针指向。O(n)?(1)

4,讲讲map/set,各自生成各自的,map系列的起源是map,set系列的起源是
综合3,4讲讲,list,set,map对比记忆。
接口Collection下有List和Set,map接口下有map
接口List : 有序可重复,删除、插入低效率。
》》》:其实类:ArrarList,linkedlist,Vector(线程安全)。区别3中已经说过。
接口Set : 无序不可重复,删除、插入效率高。
》》》:HashSet , TreeSet ;
HashSet 是哈希表实现的,可以唯一一个NULL,通常为了快速查找而用;
TreeSet 是基于红黑树实现的,自动排序不为空。性能没有HashSet好。
接口Map : 存储键值对形式的
HashMap : 这两者和上面的HashSet /TreeSet 的实现原理是一样的。差距:有调优方法,适合于插入和查找
TreeMap : 该map总是处于平衡状态,有自然顺序。
HashTable : 线程安全,键值不允许为空。

HashMap和LinkedHashMap
大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。
这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。
如果需要输出的顺序和输入的相同,请选用LinkedHashMap
一定参考:https://www.cnblogs.com/xiaoxi/p/6170590.html

5, 四大修饰限定符的作用域:public , protected , default , private
private : 只作用于该类
protected : 1,基类的protected成员时包类可见的,并且对其子类可见;2,子类和基类在不同包,那么子类实例可以访问从基类继承而来的protected的方法 ,而不能访问基类实例的protected方法。另外附上自己理解的附加一点:两个类同时集成一个父类,子类只能在自己的作用域中去访问父类方法。不能僭越。好比:猫和狗都是动物,你无法通过狗找到动物,从而找到猫。

6 , 问题来源?super没有父类的情况下也可以用。其实这个观点是错的,因为所有的类最终父类都是Object类。那么问题又来了java中类的继承是单继承的,这样子不是很奇怪吗?那么就是你根本没有搞清java的继承原则:单继承多实现多重继承。有了多重继承这一点就可以解释这一点了。
理解了这个,对this和super就也能够理解了。关于this从Java字节码去理解更好理解。

7 , 类实在被new的时候被加载或者调用时被加载。这里解释下static final、static和final
static final可以修饰方法,表示该方法不能重写(**),可以在不new对象的情况下调用;修饰常量,不可修改,并且可以通过类名访问;
static : 经由static修饰的,那么它只属于类。不属于某个对象。
final : 不可修改,切必须初始化。

8 ,java8,对时间的新定义,The class file version is 52.0 (only 45.3, 46.0 and 47.0 are supported)

LocalDateTime dateTime = LocalDateTime.now();
    System.out.println(dateTime);

运行结果:
在这里插入图片描述
前面讲了关于java8的时间,这里补充几点。

Instant instant = Instant.now();     // 2019-04-16T12:48:28.473Z 以下都精确到纳秒
LocalDate localDate = LocalDate.now(); // 2019-04-16 日期
LocalTime localTime = LocalTime.now(); // 21:48:28.584 时间
LocalDateTime localDateTime = LocalDateTime.now(); // 2019-04-16T21:48:28.584 时间 + 日期
ZonedDateTime zonedDateTime = ZonedDateTime.now(); // 2019-04-16T21:48:28.585+09:00[Asia/Tokyo]  时间 +日期 + 时区

9 ,子类默认就是调父类的空参构造器。

10,final 修饰符 可以修饰 类、属性、方法
修饰时 表示该类不能被继承 其他特征 跟普通的类一样
修饰 属性时 表示 改属性不能改变 并且 必须赋初始值
修饰方法时 表示该方法不能被重写

11,为什么要使用抽象类?
当我们在写继承时 一般实现时用不到父类 不需要实例化对象 这个时候我们就把这个父类定义为抽象类
也就是说抽象类本身没有实际意义 但是在编写继承或者多态程序时 又不得不定义父类 所有这个时候我们就把父类定义为抽象类俗称抽象父类。抽象类是用abstract 来修饰 抽象类的特点就是不能实例化对象 但是抽象类跟其他类一样 可以被继承
抽象方法,抽象类中中的方法 这个时候我们就将该方法定义为抽象方法。

11,接口也是多态的另一种表现形式。
接口中的属性默认必须修饰符为public、static、final 缺哪个jvm会自动补哪个
接口中没有构造方法 不能被实例化 抽象类也是不能被实例化
接口中的所有方法必须是public、abstract 缺少哪个补哪个
接口之间可以多继承
一个类可以实现多个接口
接口没有继承object类

12,关于null和equal的使用

public class Test {
public static void main(String[] args) {
    String stt = null;
    String aaa = "51";

    if (!(aaa.equals(stt))) {
        System.out.println("ok");
    }

    if (!(stt.equals(aaa))) {
        System.out.println("ok");
    }
}
}

运行结果:
在这里插入图片描述

13,可以参考:https://www.cnblogs.com/keyi/p/7119825.html
hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?
hascode和equals的对比:
① equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
② hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
这就延伸处一种思维:先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同,这样对比的效率就很高了。
像hashset,hashmap,hashtable等等,比如hashset里要求对象不能重复,大量使用这种思维。

14,String.valueOf强转和String,toString的强转
① String标准转换,比如Integer转String就会报错
② toStrin按道理一切都可以调用它,但是null去转化时,会报错
③ String.valueOf这是String的静态方法,他完全的避免了上面的两种情况

15,clone方法和Cloneable接口
① clone方法是个空方法。
② Cloneable接口实现,会克隆你想想要的,这里分为深度克隆和浅度克隆。
深度克隆和浅度克隆参考:https://www.cnblogs.com/kejicjk/p/7044786.html

16,StringBuffer和StringBuilder的区别。
① String是字符串常量,StringBuffer和StringBuilder是字符串变量。
②StringBuffer:效率低、线程安全;StringBuilder:可变字符序列、效率高、线程不安全;
参考缘由:https://blog.csdn.net/weixin_41101173/article/details/79677982

17,关于递归的本质:是利用了栈的压栈和出栈的原理,先进后出

18,看源码对于接口interface和abstract的再次认识:在这里插入图片描述
19,try catch finally中都有return?
结果:始终是返回finally中的内容。
执行顺序:先执行try中,但是执行return不返回,在执行性finally,最终返回。

package io.stu.com;

public class Method {

private static String print() {
    try {
        return "try";
    } catch (Exception e) {
        return "catch";
    } finally {
        return "finally";
    }
}

public static void main(String[] args) {
   System.out.println(Method.print());
}
}

20,什么是hash碰撞?为什么长度始终是2的次方?
相同的hashcode就是hash碰撞。2的次方也是为了减少hash碰撞。

21,如何保证Hashtable和ConcurrentHashMap线程安全的。(查看源码可知)
Hashtable:里面底层的方法加了synchornized。所有线程都来竞争这把锁。效率很低下。
ConcurrentHashMap:(高并发)极其复杂)借助了volatile、ReentrantLock、Unsafe,借助CAS取代synchornized,实现乐观锁。
额外说明:transient修饰符,被它修饰的变量不持久化。

22,java.lang.Character类是处理字符操作的,单个字符用‘’引用。详细可参考letcode的String to Integer (atoi) 题目中对字符的处理操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值