1 数据的请求方式?和数据的解析,和显示?
2 ArrayList 和 LinkedList区别 ? List 和 set 区别 ?
3 TCP与UDP的区别。( 当时那个人对这个问题,问的比较细致 )
4 Http的了解 ?? http 与https 的整体区别 ??
5 集合? IO流?
6 Java中实现多线程的两种方式之间的区别 ??
7 Java 弱引用 强引用 软引用 ?
8 堆 栈 方法区 ??
9 线程池都有那几种方法,分别是什么 ??
10 什么是 Socket 对 Socket的理解
11 Java StringBuffer 和 StringBuilder 区别??
12 ***线程和多线程,和死锁 线程安全
13 单例模式两种的区别 ?
=========================================================================
(2)ArrayList 和 LinkedLis 区别
相同:都是List接口的实现,可以对元素进行删除和添加等等。
不同:
1 ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
2 前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列。
3.对于随机访问get和set,ArrayList觉得优于LinkedList,ArrayList再内存中分配连续空间,遍历元素和随机访问效率高,
而LinkedList要移动指针。 (插入或删除第一个和最后一个效率高)
4.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
5.LinkedList比ArrayList更占内存
List,set, 区别:
List:
1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:
1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
(3)TCP UDP 的区别
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个连接的一端称为一个 socket
面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接,就像打电话一样必须先拨号建立一条
连接,打完。后挂机释放连接。
全双工通信:即一旦建立了TCP连接,通信双方可以在任何时候都能发送数据。
可靠的:指的是通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
双向通讯连接 实现数据的交换 这样的一个连接的一端称为一个 socket
UDP协议
特点:无连接的、不可靠的、面向报文、没有拥塞控制
(4)HTTP 详解 ? HTTPS 和 HTTP的 区别 ?
1 什么是Get请求方式
2 什么是Post请求方式
3 get和post 的区别
是客户端向服务器发出一条HTTP请求,服务器收到之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。
get将参数拼接成URL放到头部消息里传递
post直接一建值对的形式放到消息中传递
Post一般用于更新或者添加资源信息 Get一般用于查询操作
Post更加安全 Get会把请求的信息放到URL的后面
Post传输量一般无大小限制 Get不能大于2KB
Post执行效率低 Get执行效率略高
get在url中相对来些不是很安全
post相对来说比较安全
向服务器发索取数据的一种请求 (get)
向服务器提交数据的一种请求 (post)
HTTPS 和 HTTP的 区别
1、HTTPS是加密传输协议,HTTP是名文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全,对搜索引擎dao更友好,利于SEO;
4、 HTTPS标准端口443,HTTP标准端口80;
5、 HTTPS基于传输层,HTTP基于应用层;
6、 HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
要实现https加密,需要到CA机构申请SSL证书,目前市面有免费的SSL证书有沃通免费SSL证书,startssl免费证书。
(5)io 流的一个操作,输入和输出是怎么一个操作??
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
(1)读写单位不同:字节流以字节(8bit)为单位,字特流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据如图片、avi等,而字特流只能处理字符类型的数据,
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字特流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用
广泛。
字特流与字节流转换
转换流的特点:
(1)其是字符流和字节流之间的桥梁
(2)可对读取到的字节数据经过指定编码转换成字符
(3)可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
当字节和字符之间有转换动作时;
流操作的数据需要编码或解码时。
具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
(6)Java中实现多线程的两种方式之间的区别?
Runnable和Thread比较
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
也就是说使用Runnable实现多线程可以达到资源共享目的。
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
可见,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
(7)强引用 软引用 弱引用
强引用: 就是一个正常的状态,超出对象的生命周期,此时就可以回收这个对象
软引用: 如果一个对象只具有软引用,在内存足够时,垃圾回收器不会回收它;如果内存不足,就会回收这个对象的内存。
弱引用: 不管当前内存空间是否足够,都会回收内存。
虚引用:
虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。
(8) 堆、栈 和 方法区 详解??
JAVA是在NM所虚拟出的内存环境中运行的,内存分为三个区:堆、栈和方法区。
栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放。优点:速度快。
堆(heap):用于存放由new创建的对象和数组。在堆中分配的内存,一方面由java虚拟机自动垃圾回收器来管理,另一方面还需要程序员提供修养,防
止内存泄露问题。
方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
(9) 线程池 ???
线程数量不固定(可无限大)
任何线程任务到来都会立刻执行,不需要等待
灵活回收空闲线程(具备超时机制,全部回收时几乎不占系统资源)
使用:通过Executors.newCachedThreadPool()创建
示例:
// 1. 创建可缓存线程池对象
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 2. 创建好Runnable类线程对象 & 需执行的任务
Runnable task =new Runnable(){
public void run(){
System.out.println("执行任务啦");
}
};
// 3. 向线程池提交任务:execute()
cachedThreadPool.execute(task);
// 4. 关闭线程池
cachedThreadPool.shutdown();
如果某个地方需要开启大量的线程。创建线程和销毁线程是需要时间的,这样会导致性能不足
线程无法管理,相互竞争导致卡顿或者oom
所以针对这些问题,我们需要重用线程,使用线程池
(10)socket 详解
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
面向连接、面向字节流、全双工通信、可靠
TCP建立连接
必须进行三次握手
一条TCP连接建立完成 = 可以开始发送数据
1 三次握手期间任何一次未收到对面回复都要重发。
Http:采用 请求—响应 方式。
即建立网络连接后,当 客户端 向 服务器 发送请求后,服务器端才能向客户端返回数据。
可理解为:是客户端有需要才进行通信
Socket:采用 服务器主动发送数据 的方式
即建立网络连接后,服务器可主动发送消息给客户端,而不需要由客户端向服务器发送请求
可理解为:是服务器端有需要才进行通信
(11)Java StringBuffer 和 StringBuilder 区别??
StringBuilder:适用于单线程在字符缓冲区
进行大量操作的情况
在线程安全上,StringBuilder是线程不安全的
StringBuffer:适用于多线程在字符缓冲区
进行大量操作的情况
而StringBuffer是线程安全的
为了性能更好,构造StringBuffer或StringBuilder时应指定它们的容量,默认构造的容量为16个字符;
StringBuilder最好在方法内部来完成字符串拼接,因为是线程不安全的,所以用完以后可以丢弃。而StringBuffer主要用在全局变量中;
(12)线程和多线程,和死锁
进程
进程就是正在运行的程序,它是系统资源调度的独立单位,并且一个进程可以执行多个任务,而线程就是程序执行的任务,
它是程序使用CPU的基本单位,因此也可以说线程是依赖于进程的。
进程
进程就是正在运行的程序,它是系统资源调度的独立单位,各个进程之间不会相互影响,因为系统给它们分配了不同的空间和资源,
它分为单进程和多进程。
单进程与多进程的概述
单进程的计算机一次只能做一件事情,而多进程的计算机可以做到一次做不同的事情,比如一边听音乐,一边听打游戏,这两件事情
虽然感觉起来是在同时一起进行的,但其实是CPU在做着程序间的高效切换,这才让我们觉得是同时进行的。
单线程与多线程的概述:
单线程也就是做的事情专一,不会分神去做别的事,也就是程序只有一条执行路径;
多线程就是可以分出多条路去做同一件事情,也就是程序有多条执行路径,比如三个伙伴迷路了,大家分别去问路人路线,最后大家在目的地集合,
因此多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率,也可以说程序的执行其实都是在抢CPU的资源,也就是抢CPU的执行权,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权,但这一过程是随机的,不知道哪一个线程会在哪一个时刻占到这个资源,所以线程的执行有随机性。
死锁问题:
死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象,这个问题和同步代码块的嵌套有关,如果出现了同步嵌套,就容易产生死锁问题。
线程安全:
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
线程不安全产生的主要原因:
因为多个线程共享一个内存,所以当多个线程共享一个全局变量的时候,可能会受到其他干扰。如线程更新会先在本地内存更新,然后再同步到共享内存中,当多个线程同时读写的时候,数据会出现错误,就产生了线程不安全的现象。
本次主要为大家简单介绍两种锁:
synchronized(自动锁)
lock (JDK1.5并发包,手动锁,即需要手动进行加锁以及解锁的操作)
使用 synchronized(obj) 对象锁,表示一次只有一个obj对象内被调用。
缺点是效率非常低。
总结:
线程安全解决办法:
问:如何解决 多线程之间 线程安全问题?
答:使用多线程之间同步 synchronized 或使用锁 (lock)。
问:为什么使用线程同步 或使用锁能解 决线程安全问题呢?
答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。
问:什么是多线程之间同步?
答:当多个线程共享同一个资源,不会受到其他线程的干扰。
同步意思 :同时起步,协调一致
同步代码块
- 什么是同步代码块?
- 答:就是将可能会发生线程安全问题的代码,给包括起来。
13 单例模式两种的区别 ?
两者的区别:
字面意思上:
懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了
线程安全:
饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题,
懒汉式本身是非线程安全的(双重检查锁定方式解决并发问题)
资源加载和性能:
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成.
懒汉式,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。