1)八个基本数据类型的包装类java
基本数据类型 包装类web
byte Byte编程
boolean Boolean数组
short Shorttomcat
char Character安全
int Integer服务器
long Long网络
float Float多线程
double Double并发
2)为何为基本类型引入包装类
基本数据类型有方便之处,简单、高效。
可是Java中的基本数据类型倒是不面向对象的(没有属性、方法),这在实际使用时存在不少的不便(好比集合的元素只能是Object)。
为了解决这个不足,在设计类时为每一个基本数据类型设计了一个对应的类进行包装,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
3) 包装类和基本数据类型之间的转换
包装类------ wrapperInstance.xxxValue() ----------->基本数据类型
包装类<-----new WrapperClass(primitive) new WrapperClass(string)------基本数据类型
4)自动装箱和自动拆箱
JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 从而实现了包装类和基本数据类型之间的自动转换
5)、包装类还能够实现基本类型变量和字符串之间的转换
基本类型变量------------String.valueof()------------>字符串
基本类型变量<------------WrapperClass.parseXxx(string)------------字符串
int是java提供的8种原始数据类型之一。Java为每一个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer能够区分出未赋值和值为0的区别,int则没法表达出未赋值的状况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,因此用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,因此用el表达式在文本框中显示时,结果为0,因此,int不适合做为web层的表单数据的类型。
在Hibernate中,若是将OID定义为Integer类型,那么Hibernate就能够根据其值是否为null而判断一个对象是不是临时的,若是将OID定义为了int类型,还须要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操做方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
Collection 接口存储一组不惟一,无序的对象
List 接口存储一组不惟一,有序(插入顺序)的对象
Set 接口存储一组惟一,无序的对象
Map接口存储一组键值对象,提供key到value的映射。Key无序,惟一。value不要求有序,容许重复。(若是只使用key存储,而不使用value,那就是Set)
Vector和ArrayList的区别和联系
实现原理相同,功能相同,都是长度可变的数组结构,不少状况下能够互用
二者的主要区别以下
ArrayList和LinkedList的区别和联系
ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;
LinkedList采用链表存储方式。插入、删除元素时效率比较高
实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在不少状况下能够互用
二者的主要区别以下
1) 哈希表的查询速度特别快,时间复杂度为O(1)。
2) HashMap、Hashtable、HashSet这些集合采用的是哈希表结构,须要用到hashCode哈希码,hashCode是一个整数值。
3) 系统类已经覆盖了hashCode方法 自定义类若是要放入hash类集合,必须重写hashcode。若是不重写,调用的是Object的hashcode,而Object的hashCode其实是地址。
4) 向哈希表中添加数据的原理:当向集合Set中增长对象时,首先集合计算要增长对象的hashCode码,根据该值来获得一个位置用来存放当前对象,如在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增长进去。若是在该位置有一个对象存在的话,接着将准备增长到集合中的对象与该位置上的对象进行equals方法比较,若是该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里。若是equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增长到集合中了。
5) 在哈希表中判断两个元素是否重复要使用到hashCode()和equals()。hashCode决定数据在表中的存储位置,而equals判断是否存在相同数据。
6) Y=K(X) :K是函数,X是哈希码,Y是地址
一、TreeSet中的元素不容许重复,可是有序
二、TreeSet采用树结构存储数据,存入元素时须要和树中元素进行对比,须要指定比较策略。能够经过Comparable和Comparator来指定比较策略。
三、实现了Comparable的系统类能够顺利存入TreeSet。自定义类能够实现Comparable接口来指定比较策略。
四、可建立Comparator接口实现类来指定比较策略,并经过TreeSet构造方法参数传入。这种方式尤为对系统类很是适用。
数组不是面向对象的,存在明显的缺陷,集合彻底弥补了数组的一些缺点,比数组更灵活更实用,可大大提升软件的开发效率并且不一样的集合框架类可适用于不一样场合。具体以下:
1:数组的效率高于集合类.
2:数组能存放基本数据类型和对象,而集合类中只能放对象。
3: 数组容量固定且没法动态改变,集合类容量动态改变。
4:数组没法判断其中实际存有多少元素,length只告诉了array的容量。
5:集合有多种实现方式和不一样的适用场合,而不像数组仅采用顺序表方式。
6:集合以类的形式存在,具备封装、继承、多态等类的特性,经过简单的方法和属性调用便可实现各类复杂操做,大大提升软件的开发效率。
Collection是Java提供的集合接口,存储一组不惟一,无序的对象。它有两个子接口List和Set。
Java中还有一个Collections类,专门用来操做集合类 ,它提供一系列静态方法实现对各类集合的搜索、排序、线程安全化等操做。
1.定义:
1) 进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
2) 线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程能够建立和撤销另外一个线程;
2.进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程能够有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的全部线程共享该进程的全部资源。
(3)线程在执行过程当中,须要协做同步。不一样进程的线程间要利用消息通讯的办法实现同步。
(4)处理机分给线程,即真正在处理机上运行的是线程。
(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。
3.线程与进程的区别:
(1)调度:线程做为调度和分配的基本单位,进程做为拥有资源的基本单位。
(2)并发性:不只进程之间能够并发执行,同一个进程的多个线程之间也能够并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但能够访问隶属于进程的资源。
(4)系统开销:在建立或撤销进程的时候,因为系统都要为之分配和回收资源,致使系统的明显大于建立或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其余的进程产生影响,而线程只是一个进程中的不一样的执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,可是在进程切换时,耗费的资源较大,效率要差些
方式1:继承Java.lang.Thread类,并覆盖run() 方法。优点:编写简单;劣势:没法继承其它父类
public class ThreadDemo1 {
public static void main(String args[]) {
MyThread1 t = new MyThread1();
t.start();
while (true) {
System.out.println("兔子领先了,别骄傲");
}
}
}
class MyThread1 extends Thread {
public void run() {
while (true) {
System.out.println("乌龟领先了,加油");
}
}
}
方式2:实现Java.lang.Runnable接口,并实现run()方法。优点:可继承其它类,多线程可共享同一个Thread对象;劣势:编程方式稍微复杂,如需访问当前线程,需调用Thread.currentThread()方法
public class ThreadDemo2 {
public static void main(String args[]) {
MyThread2 mt = new MyThread2();
Thread t = new Thread(mt);
t.start();
while (true) {
System.out.println("兔子领先了,加油");
}
}
}
class MyThread2 implements Runnable {
public void run() {
while (true) {
System.out.println("乌龟超过了,再接再砺");
}
}
}
当多个线程访问同一个数据时,容易出现线程安全问题,须要某种方式来确保资源在某一时刻只被一个线程使用。须要让线程同步,保证数据安全
线程同步的实现方案:同步代码块和同步方法,均须要使用synchronized关键字
同步代码块:public void makeWithdrawal(int amt) {
synchronized (acct) { }
}
同步方法:public synchronized void makeWithdrawal(int amt) { }
线程同步的好处:解决了线程安全问题
线程同步的缺点:性能降低,可能会带来死锁
Java提供了3个方法解决线程之间的通讯问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,不然会抛出异常。
方法名 |
做 用 |
final void wait() |
表示线程一直等待,直到其它线程通知 |
void wait(long timeout) |
线程等待指定毫秒参数的时间 |
final void wait(long timeout,int nanos) |
线程等待指定毫秒、微妙的时间 |
final void notify() |
唤醒一个处于等待状态的线程。注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM肯定唤醒哪一个线程,并且不是按优先级。 |
final void notifyAll() |
唤醒同一个对象上全部调用wait()方法的线程,注意并非给全部唤醒线程一个对象的锁,而是让它们竞争 |
咱们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其余计算机,这个过程咱们能够本身写代码去把一个java对象变成某个格式的字节流再传输,可是,jre自己就提供了这种支持,咱们能够调用OutputStream的writeObject方法来作,若是要让java 帮咱们作,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才能够被writeObject方法操做,这就是所谓的序列化。须要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有须要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,若是对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。若是对象要通过分布式系统进行网络传输或经过rmi等远程调用,这就须要在网络上传输对象,被传输的对象就必须实现Serializable接口。
TCP和UDP是TCP/IP协议栈中传输层的两个协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供网络服务。TCP传输原理相似电话通讯系统,而UDP传输原理相似电报通讯系统。具体区别以下:
什么是Socket编程
所谓socket一般也称做"套接字",用于描述IP地址和端口,是一个通讯链的句柄。应用程序一般经过"套接字"向网络发出请求或者应答网络请求。
Socket套接字用于在主机和Internet之间创建可靠的、双向的、持续的、点对点的流式链接。一个套接字能够用来创建Java的输入输出系统到其余的驻留在本地机或Internet上的任何机器的程序的链接。应用程序经过Socket向网络发出请求或者应答网络请求,Socket隐藏了数据流传输中的复杂性。
能够把Socket比做是一个港口码头,应用程序只要将数据交给Socket,就算完成了数据的发送,具体细节由Socket来完成,细节没必要了解。同理,对于接收方,应用程序也要建立一个码头,等待数据的到达,并获取数据。
Java分别为TCP和UDP 两种通讯协议提供了相应的Socket编程类,这些类存放在java.net包中,与TCP对应的是服务器的ServerSocket和客户端的Socket,与UDP对应的是DatagramSocket。
基于TCP协议的Socket编程的主要步骤