牛客网错题本之JAVA_第二期

来源:互联网 发布:homer软件视频 编辑:程序博客网 时间:2024/04/30 12:17

1.ClassLoader

Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
ClassLoader使用的是双亲委托模型来搜索类的
JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。
ClassLoader就是用来动态加载class文件到内存当中用的
2.面向对象五大基本原则
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。 依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口
3.Collection与Collections
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
Collection是单列集合的顶层接口,Map是双列集合的顶层接口Collections是一个集合的工具类,提供了排序、查找等操作集合的一些常用方法
4.位运算
>>为带符号右移,右移后左边的空位被填充为符号位>>>为不带符号右移,右移后左边的空位被填充为0没有<<< 因为<<后右边总是补0
5.内部类
静态内部类才能包含静态方法,并且静态方法中的参数必须也是静态,因为静态方法不能访问非静态成员变量
如果外部类是public类的话,内部类不能被定义为public
6.集合类默认大小
StringBuffer和StringBuilder的默认大小为16ArrayList和LinkedList的默认大小10
7.Java中的子类赋值给父类的引用
Base base=new Son(); 是多态的表示形式。父类对象调用了子类创建了Son对象。base调用的method()方法就是调用了子类重写的method()方法。而此时base还是属于Base对象,base调用methodB()时Base对象里没有这个方法,所以编译不通过。要想调用的话需要先通过SON son=(SON)base;强制转换,然后用son.methodB()调用就可以了。
8.HashMap
源码程序中用到了一个重要的内部接口:Map.Entry,每个 Map.Entry 其实就是一个 key-value 对。当系统决定存储 HashMap 中的 key-value 对时,完全没有考虑 Entry 中的 value,仅仅只是根据 key 来计算并决定每个 Entry 的存储位置。Entry是数组,数组中的每个元素上挂这个一条链表。。链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。很显然我们使用的不是开放地址法。
9.Java中的main方法
java中可以有多个重载的main方法,只有public static void main(String[] args){}是函数入口
Appletviewer.exe 就是用来解释执行java applet应用程序的,能被Appletviewer成功运行的java class文件没有main()方法
10.枚举类型
枚举类型中有几个数,其私有的构造方法就调用几次
11.抽象类与接口
抽象类中可以有构造方法,接口中不能有构造方法
java8中接口可以有default方法,所以现在来说接口中其实也是可以包含普通方法的
接口允许定义成员,但必须是常量。
抽象类中可以有普通成员变量,接口中不能有
抽象类中可以有静态方法,接口中不能有静态方法
12.Integer之间的数的比较
首先常量池这个概念,原来以为只要是一个整型,都会放进到常量池,比如,0,1,12222222等。查找后发现,Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127并且大于等于-128时才可使用常量池,因为他们至占用一个字节(-128~127);
给Integer直接赋值,例如Integer i = 42 其实就是执行了valueOf方法
两个不是new出来的Integer比较,如果在-128~127之间,就是相等,否则就是不相等
两个都是new出来的Integer比较,结果是不相等
int和Integer比较,肯定是相等,因为Integer会执行拆箱操作
13.JDBC
JDBC的设计模式用了桥接模式
14.Math.floor()
Math.floor(x) 返回小于等于x的最接近整数,类型为double
15.父类引用指向子类对象的问题
public class Base{    private String baseName = "base";    public Base()    {        callName();    }     public void callName()    {        System. out. println(baseName);    }     static class Sub extends Base    {        private String baseName = "sub";        public void callName()        {            System. out. println (baseName) ;        }    }    public static void main(String[] args)    {        Base b = new Sub();    }}
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null


16.Java中声明常量
需要用final关键字修饰,并且常量必须要在声明的同时进行赋值
17.Java中的前自增和后自增以及自增运算
public class test{static{   int x=5;}static int x,y;public static void main(String args[]){   x--;   myMethod( );   System.out.println(x+y+ ++x);}public static void myMethod( ){  y=x++ + ++x; }}
1.静态语句块中x为局部变量,不影响静态变量x的值2.x和y为静态变量,默认初始值为0,属于当前类,其值得改变会影响整个类运行。3.java中自增操作非原子性的 main方法中:执行x--后 x=-1调用myMethod方法,x执行x++结果为-1(后++),但x=0,++x结果1,x=1 ,则y=0x+y+ ++x,先执行x+y,结果为1,执行++x结果为2,得到最终结果为3


18.final修饰的类
fianl修饰的类是不能被继承的,其中不能包含abstract方法
19.Statement与PreparedStatement
Statement sta=con.createStatement();
ResultSet rst=sta.executeQuery(“select * from book”);
PreparedStatement pst=con.prepareStatement(“select * from book”);ResultSet rst=pst.executeQuery();
创建Statement是不传参的,PreparedStatement是需要传入sql语句
在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。   
PreparedStatement 接口继承 Statement,PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。 
Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句 select colume from table where colume=1;select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! 
PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划,可以重用

20.ArrayList与LinkedList
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。这里的所谓动态数组并不是那个“ 有多少元素就申请多少空间 ”的意思,通过查看源码,可以发现,这个动态数组是这样实现的,如果没指定数组大小,则申请默认大小为10的数组,当元素个数增加,数组无法存储时,系统会另个申请一个长度为当前长度1.5倍的数组,然后,把之前的数据拷贝到新建的数组
ArrayList list=new ArrayList();   这种是默认创建大小为10的数组,每次扩容大小为1.5倍ArrayList list=new ArrayList(20);  这种是指定数组大小的创建,没有扩充
LinkedList不是现场安全的

25

2.

1 0
原创粉丝点击