Javaaaaaaaa

JAVA修饰符
访问控制修饰符:

  • default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
  • public : 对所有类可见。使用对象:类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

非访问修饰符:

  • static 修饰符,用来修饰类方法和类变量。
  • final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
  • abstract 修饰符,用来创建抽象类和抽象方法。
  • synchronized 和 volatile 修饰符,主要用于线程的编程。

在这里插入图片描述
HashMap遍历方式:
1.遍历HashMap的键值对:根据entrySet()获取HashMap的“键值对”的Set集合,通过Iterator迭代器遍历“第一步”得到的集合。
2.遍历HashMap的键:根据keySet()获取HashMap的“键”的Set集合,通过Iterator迭代器遍历“第一步”得到的集合。
3.遍历HashMap的值:根据value()获取HashMap的“值”的集合,通过Iterator迭代器遍历“第一步”得到的集合。
switch 语句中的变量类型可以是
byte、short、int 或者 char。
内部类
成员内部类\静态内部类\局部内部类\匿名内部类

比较 GET 与 POST:
在这里插入图片描述

抽象类和接口的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
3.抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法(X,default方法)。
4.接口支持lambda表达式@FunctionInterface,抽象类不支持。
5.接口所有变量都是public static final 不可变, 抽象类可以使用任意权限修饰符修饰变量。
6.抽象类抽象方法可以被public, protected修饰,接口抽象类只能被public 修饰。
运行时异常和一般异常的区别:
在这里插入图片描述
运行时异常开发人员可以不处理它,但是当程序出现异常的时候会中断当前线程;而受检时异常,系统在编译的时候就要求我们必须进行捕获,所以要么我们try-catch它,要么往上抛throws,我们可以一直往上抛不处理,但是当程序出现异常的时候会中断当前线程。
深拷贝和浅拷贝:
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
equals()和hashcode()的联系
首先equals()和hashcode()这两个方法都是从object类中继承过来的
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
集合结构
在这里插入图片描述
list和set的区别
(1)重复对象
list方法可以允许重复的对象,而set方法不允许重复对象
(2)null元素
list可以插入多个null元素,而set只允许插入一个null元素
(3)容器是否有序
list是一个有序的容器,保持了每个元素的插入顺序。
即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序
ArrayList和Vector
arrayList和vector的相同之处:
1.它们都是List,都继承AbstractList,并且实现List接口。
2.它们都实现了RandomAccess和Cloneable接口;实现RandomAccess接口,意味着它们都支持快速随机访问;实现Cloneable接口,意味着它们能克隆自己。
3. 它们都是通过数组实现的,本质上都是动态数组,且默认数组容量是10
4.它们都支持Iterator和listIterator遍历,都继承于AbstractList,而AbstractList中分别实现了 “iterator()接口返回Iterator迭代器” 和 “listIterator()返回ListIterator迭代器”
arrayList和vector的不同之处:
1.Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2. 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
3.对序列化支持不同:ArrayList支持序列化,而Vector不支持;即ArrayList实现java.io.Serializable接口,而Vector没有实现该接口。
4.Vector支持通过Enumeration去遍历,而List不支持
HashMap和 HashTabel的区别:
1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同
Hashtable 中的方法是Synchronize的,而HashMap中的方法是非Synchronize的。
3、key和value是否允许null值
Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。
HashMap中,null可以作为键,这样的键只有一个(在Entry[0]);当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。
4、两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5、hash值不同
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

HashMap原理
xxxxxxxxxxxxx
xxxxx

TreeSet原理

xxxxxxxxxxxxx
xxxxx

线程的状态:
在这里插入图片描述
线程同步的方式有哪些

  1. synchronized关键字修饰的方法
  2. synchronized关键字修饰的语句块
  3. 使用重入锁Lock类实现线程同步
  4. 使用ThreadLocal管理变量实现线程同步
  5. 使用阻塞队列实现线程同步
  6. 使用原子变量实现线程同步

线程局部变量ThreadLocal
同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本,每个使用该变量的线程都会初始化一个完全独立的实例副本
原理:ThreadLocalMap是ThreadLocal类的一个静态内部类,它实现了键值对的设置和获取,每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改。ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。还有一点就是,ThreadLocalMap存储的键值对中的键是this对象指向的ThreadLocal对象,而值就是你所设置的对象了。
ThreadLocal不能替代同步机制,两者面向的问题领域不同
同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将简化你的程序,使程序更加易读、简洁。
创建对象的五种方式:
1、new 关键字
这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();
2、通过 Class 类的 newInstance() 方法
这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName(“com.ys.test.Person”).newInstance();
3、通过 Constructor 类的 newInstance 方法
这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的 newInstance() 方法指定某个构造器来创建对象。
Person p3 = (Person) Person.class.getConstructors()[0].newInstance();
实际上第二种方法利用 Class 的 newInstance() 方法创建对象,其内部调用还是 Constructor 的 newInstance() 方法。
4、利用 Clone 方法
Clone 是 Object 类中的一个方法,通过 对象A.clone() 方法会创建一个内容和对象 A 一模一样的对象 B,clone 克隆,顾名思义就是创建一个一模一样的对象出来。
Person p4 = (Person) p3.clone();
5、反序列化
序列化是把堆内存中的 Java 对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络节点(在网络上传输)。而反序列化则是把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象模型的过程。
final的用法:
1.修饰类时,表明该类不能被其他类继承。
2.修饰方法时,可防止继承类对其进行更改(不可重写)
3.修饰变量时,只能被赋值一次,赋值后其值不再改变
4.修饰方法入参
被final修饰的变量:三种赋值方式
1.在定义时直接赋值。
2.声明时不赋值,在constructor中赋值(最常用的方式)
3.声明时不赋值,在构造代码块中赋值
被final static修饰的变量:两种赋值方式
1.在定义时直接赋值.
2.在静态代码块里赋值
try catch finally return执行顺序
情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。
情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。
情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分两种情况。
wait和sleep方法有何不同
1.sleep属于Thread类,表示让一个线程进入睡眠状态,wait属于Object
2.sleep方法没有释放锁,wait方法释放了锁
3.sleep必须捕获异常,wait不需要捕获异常
4.sleep可以在 任何地方使用,wait、notify和notifyAll只能在同步控制方法或者同步控制块里面使用
Volatile变量
volatile是轻量级的synchronize,如果volatile变量修饰符使用恰当的话,它比synchronize的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。
1.保证此变量对所有线程的可见性,即当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。
2.禁止指令重排序优化。普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。
volatile能保证原子性吗?
volatile并不能保证原子性,导致volatile变量的运算在并发下一样是不安全的。要保证运算的原子性可以使用java.util.concurrent.atomic包下的一些原子操作类。例如最常见的: AtomicInteger
Java设计模式
七大原则:
单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特原则、合成复用原则
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值