java基础篇
1,函数的封装是单独一个类内的操作,而成员方法和构造方法是两个类之间的操作,Demo类调用自定义类里的东西。
2,构造方法和成员方法区别:
返回值:构造方法没有返回值,public+类名。成员方法必须有返回值,如果没有用void填充。
方法名:构造方法名必须为类名。成员方法方法名见名知意。
作用:构造方法作用是初始化成员变量。成员方法是对类的行为描述,或是对一些功能的体现。
调用方式:构造方法是通过new关键字调用。成员方法是通过对象调用的。
3,重载和重写区别:
精华:
重写是方法名,参数(类型,顺序,数量)都不变,方法体可以改变,一般是在父类中声明方法,在子类中重写。
重载是方法名不变,参数(类型,顺序,数量)要改变,而且重载的方法一般都写在同一个类中。
重载理解:
重载,是指方法名相同,参数列表或参数类型不同;
class void show(){
}
class void show(int age){
}
class void show(String age){}
这三个是重载,方法名相同,1,2参数列表不同,2,3,参数类型不同都是重载
class int a(){}
class double a(){}
这两个不是重载,只有参数类型不同,不是重载
重写是外壳不变,核心改变。也就是说方法名不变,参数不变,具体实现(方法体)可以改变,一般是父类中的声明方法,在子类中重写。
重载是方法名不变,但参数一定要变,而且重载的方法一般都写在一个类中。
Override:方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系
Overload是重载:方法名称不变,其余的都是可以变更的。它的关系是同一个类,同一个方法名,不同的方法参数或返回值。
4,java八种数据类型和所占的字节
byte 1,char 2,short 2,int 4,float 4,double 8,long 8,boolean 1.
5,抽象类和接口区别联系
一,抽象类只能单继承,接口能够多实现。
二,抽象类中可以有普通成员变量,接口中没有普通成员变量,接口中是全局变量,即public static final修饰。
三,抽象类中可以包含抽象方法和非抽象方法,接口中的所有方法必须都是抽象的
四,使用动机不同,定义抽象类是为了使用这个类的属性和行为,定义接口是为了规范某一事物的行为。
抽象类为什么不能被实例化:
打个比方:
抽象类: 人类
子类: 我们每个人抽象方法:吃饭
因为我们每个人都继承了抽象类人类,故我们都会吃饭,但是我们吃饭时候吃的东西不一样,
人类这个抽象类只是强制我们要吃饭,但是我们想吃啥,它就管不着了。
补充:这才是重点
抽象类之所以存在就是要子类去实现他的所有的抽象方法,既然是抽象的,创建它的对象后调用它的方法
什么都不会产生,所以毫无意义。没有意义做它干什么,所以不可以。
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。
接口:对某一行为抽象。
所以,个人觉得,两者最核心的区别是:使用动机。实现接口是为了使用他规范的某一个行为; 继承抽象类是为了使用这个类属性和行为.
6,list set map
线程安全(同步)和非安全(非同步)
同步比如过独木桥,一个人去抢火车票,线程安全。异步好比是有两条桥都可以过,两个人一起去抢火车票。线程不安全。
假设你在火车上,只有一个厕所。ABC都在排队。
简单来说,线程同步就是 A进去了,门锁上。BC只能在外面干等着。这是线程安全的,不会产生问题。
线程不同步就是 A进去的同时,没关门,B也进去了。这是线程不安全。
collection里面有什么子类:list,set。list set实现了collection接口
List:
1,存储数据方式:元素有插入顺序,可以重复。
2,是否可以加入null元素:可以插入多个null元素。
3,常用的实现类:有 ArrayList、LinkedList 。ArrayList 查询快增删慢,底层维护了一个 个Object类型的数组,可以使用数组的下标机制来访问数据,这种访问形式是非常快的。增删慢的原因:涉及到数组扩容,数据复制问题。而 LinkedList 查询慢增删快。 底层维护一个链表。TreeMap:
1、往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就按照键的自然顺序特性进行排序存储;
2、往TreeMap添加元素的时候,如果元素的键不具备自然顺序,那么键所属的类就必须要实现Comparable接口,
并重写 compareTo()方法,将自定义比较规则定义在该方法中;
3、往TreeMap添加元素的时候,如果元素的键不具备自然顺序,而且键所属的类也没有实现Comparable接口,
那么就必须在创建TreeMap对象的时候,传入一个比较器,并且比较器中定义了比较规则;
HashTable:与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线
适用场景:当需要同步时,用Hashtable,反之用HashMap。
7,set无序和TreeSet有序的解释
首先要搞清楚java中有序和无序的概念
有序指的是存储顺序与添加顺序相同,并且可以通过下标访问,List就是这样
无序刚好相反,指的是存储顺序与添加顺序无关,没有下标,当然也不可能通过下标访问,Set就是如此。
这里需要注意的是,有序、无序中的“序”与我们平常所说的“顺序”无关。而TreeSet是无序,但又是排好序的。即添加顺序与存储顺序无关,但是其中的对象实现了排序。
8,String,StringBuffer,StringBuilder的区别
1,string是字符串常量,stringbuilder和stringbuffer是字符串变量。
2,说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
3,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
4,
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
9,wait和sleep的区别,必须理解
1,sleep()是Thread类中的方法,而wait()则是Object类中的方法。
2,wait常用于线程交互,sleep通常被用于暂停执行。
3,
sleep()方法导致了程序暂停,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。wait()方法会导致线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。(sleep和wait区别,脚本之家)
10,char型变量能不能存储一个汉字
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
11,==和equals方法的区别
1,==是操作符,equals是object类中的方法。
2,==常用于比较基本数据类型,它比较的是值,如果用==号比较两个对象时比较的是两个对象的地址值。
equals一般用来比较对象,如果比较的对象没有重写equals方法,则比较的是地址,如果重写了equals方法,则比较的是内容。
12,Integer和int的区别
1、Integer是int封装类,而int是Java的基本数据类型;(类在堆区,基本数据类型在栈区)
2、Integer默认值是null,而int默认值是0;
3、声明为Integer的变量需要实例化,而声明为int的变量不需要实例化;(如果直接赋值的话有那个自动装箱的操作)
int i = 127;
4、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
int i = 127;
Integer i2 = 127; //自动装箱,Integer i2=Integer.valueOf(127);
Integer i3 = new Integer(127);
System.out.println(i == i2); //ture ,在进行比较时,i2会自动拆箱为int
System.out.println(i == i3); //ture ,在进行比较时,i3会自动拆箱为int
System.out.println(i2 == i3); //false ,两个对象比较,一个存在于常量池,一个存在于堆中。
int n = 128;
Integer n2 = 128;
Integer n3 = new Integer(128);
System.out.println(n == n2); //ture ,同上
System.out.println(n == n3); //ture
System.out.println(n2 == n3); //false
Integer o = 127;
Integer m = 128;
System.out.println(i2 == o); //ture ,127存在于常量池中,是同一个值
System.out.println(n2 == m); //false ,128不存在常量池中,n2和m代表不同的对象,其值分别存储在堆中不同位置。
结论:
1.new出来的Integer相比较,均为false,代表两个不同的对象,存储在堆中的位置不一样。
2.非new出来的Integer相比较,如果数在-128到127之间,则是true,否则为false 。
3.int和Integer相比较,均为ture,因为Integer会先自动拆箱为int,再进行比较。
4.Integer和new Integer相比较,均为false。
如果值在-128到127之间,Integer的值存在于常量池,new Integer的值存在于堆中;
如果没在-128到127之间,那么均视为new Integer,同结论1。
13,Math.round()的使用
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
14,构造器是否可以被重写
构造器就是构造方法,
构造器Constructor不能被继承,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。
又由于构造器不能继承,所以就不能被重写。因此不能重写Override,但可以被重载Overload。可以被调用。
15,新建对象的方式:
1. 使用new关键字
2. 使用反射,调用newInstance
3. 使用clone方法
4. 使用序列化与反序列化
5. 动态代理(Proxy类和CGLIB)
16,&和&&的区别
&和&&都可以用作逻辑与的运算符,&&为短路与,&不是短路与。
解释:如果判断条件比较多的话&会将条件里面语句预算完,&&当遇到一个非真条件,就会停止运算。
另外&可以做为整数的位运算符例1:对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
例2:If(x==33 &++y>0) y会增长,if(x==33 && ++y>0)不会增长。
17,java特性和面向对象特性:
java特性:简单,可移植,面向对象,分布式,高性能,健壮,安全,动态。
面向对象:继承,封装,多态。
18,线程和进程的区别
1,进程代表一个程序,一个进程可以有多个线程。
2,进程之间不会相互影响; 一个线程挂掉会导致整个进程挂掉。
19,内存泄露和内存溢出
内存泄露 (memory leak),是指应用程序在申请内存后,无法释放已经申请的内存空间。一次内存泄露危害可以忽略,但如果任其发展最终会导致内存溢出(out of memory)。如读取文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(out of memory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。
20,
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
21,java Exception体系结构
1、Error与Exception
Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常
a)运行时异常: 都是RuntimeException类及其子类异常:
i.IndexOutOfBoundsException 索引越界异常
ii.ArithmeticException:数学计算异常
iii.NullPointerException:空指针异常
iv.ArrayOutOfBoundsException:数组索引越界异常
v.ClassNotFoundException:类文件未找到异常
vi.ClassCastException:造型异常(类型转换异常)
这些异常是不检查异常(Unchecked Exception),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的。
非运行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如:
IOException、文件读写异常
FileNotFoundException:文件未找到异常
EOFException:读写文件尾异常
MalformedURLException:URL格式错误异常
举例最常用的五个运行时异常:
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。】
22,1.28HashMap和Hashtable的区别
1、HashMap和Hashtable是Map接口下的两个实现类,因为Map对象是键值对的,所以此两类也是键值对的。
2、HashMap是线程非安全的,Hashtable是线程安全的,所以HashMap的效率高于Hashtable。
3、HashMap允许键或值为null,键最多只可以有一个为null,值不受限制。而Hashtable键或值都不许为null。
23,多线程有几种实现方式
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡:
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个事件的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
实现并启动线程有两种方法:
1、写一个类继承自Thread类,重写run方法。用start方法启动线程
2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnable target).start()方法来启动
多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。
调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。
1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发
24:堆和栈的区别
Java的内存分为两类,一类是栈内存,一类是堆内存。栈中存储的是当前线程的方法调用、基本数据类型和对象的引用,栈是有序的。
堆中存储的是对象的值,堆是无序的。
方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
25,一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
26,Java有没有goto?
java中的保留字,现在没有在java中使用。
27,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
28,静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
29,请说出作用域public,private,protected,以及不写时的区别
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
作用域 当前类 同一package 子孙类其他 package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
30,是否可以继承String类?String类是final类故不可以继承。
31,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
32,final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用,
33,同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
34,多线程有几种实现方法?同步有几种实现方法?(不懂得)
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
35,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(不会)
分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
36,说出一些常用的类,包,接口,请各举5个
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
java.util.Date,System,Class,List,HashMap
常用的包:java.lang java.io java.util java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate
常用的接口:
Remote List Map Document NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
37,GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。