io关系图

本文深入讲解Java中的数据类型、IO流、并发数据库设计、数据结构、时间类、网络协议、锁机制、多态及单例模式,涵盖核心知识点,解析算法实现与异常处理。

java-四型八种
在这里插入图片描述
byte 1字节
short 2字节
int 4字节
long 8字节
float 4字节
double 8字节

java-io在这里插入图片描述
流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
转载 https://www.cnblogs.com/runningTurtle/p/7088125.html

如何设计一个高并发的数据库
1.系统拆分,将一个系统拆分成多个子系统,每个系统连接一个数据库,查分多个库可以抗住高并发
2.读写分离设计一个主从数据库,主数据库写入,从数据库读取,当读流量更多的时候可以加入更多的从库,此时主库是高可用,从数据库有进一步划分,将select操作适当的平衡到不同的slaves上。
3.读请求使用redis如果是读多写少则完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存
4.写请求使用kafka如果写多读少则完全可以在数据库前面加上一个消息队列自己控制消费速度主要是用来流量削峰
5.Elasticsearch,es本就是分布式非关系型数据库,分布式天然支持高并发,因为动不动就可以添加机器横向扩展来,对于比较简单的查询,统计类等操作可以考虑还有全文搜索类的操作

java的数据结构:
分为List,Set,和Map
List的话 下面有arraylist,linkedlist,vector,和stack(堆栈)
下面具体说一下各自的特点:
arraylist的话是基于数组,非线程安全,数组容量不够时会进行一次数组的复制自动扩充1.5倍,所以设置好容量参数是非常有必要的避免频繁的扩容导致影响系统,特点的话是查询快,增删慢因为改动一个就会全下标改动,而数组是一块连续的内存,如果随意的插入一个位置,则后续的元素需要重新排序.其效率就相对较低,如果仅仅是在末尾增加元素是比linkedList快.,
inkedlist:基于双向链表,也是非线程安全,相对于arraylist他的特点是增删快,查找慢,因为linkedlist是遍历一遍数组才可以得知数据,对于linkedlist的插入话无论是尾端还是其他位置都不会导致linked效率低下,所以当不确定要插入哪里的话就用linkedlist,内存是链式存储
vector(向量)的特点就是arraylist的线程安全,当容量不够时会自动扩充2倍,也是查询快,增删慢
stack(堆栈),先进后出的数据结构,继承自vector

set的话有hashset,linkedhashset,treeset
特点:作为Set集合的一种,首先是无序的,不可重复的;允许存放null值;底层封装HashMap;实现是不同步的,线程不安全;

map的话有hashmap,treemap,hashtable,linkedhashmap
hashmap的主体是数组,其存储位置=f(关键字),f:hash函数,非线程安全!!!
hashmap的结构为entry<k,v>数组+链表,每个entry<k,v>的k是根据hash取模拿到内存地址,当内存地址发生冲突时会在此数组上添加链表,第一个元素是添加链表头部,随着第二个元素的添加 第一个会移至链表尾部,第二个元素为链表的头部
hash冲突:即通过hash算法得到的地址已被占用了,对于添加操作,首先遍历链表,存在即覆盖否则在链表头部新增,最先加入的在链表尾部,新加入的在链表头部
对于查找操作则遍历链表,通过key的对象的equals方法,逐一对比查找,所以性能考虑hashmap链表出现的越少越好,当发生冲突时,并且size大于阈值时,需要进行数组的扩容,会复制当前的数组,扩容后的数组为当前的二倍,所以尽可能少的扩容
hashtable:和hashmap一样只不过是线程安全的
hashtable的的结构为 entry<k,v>和链表组成,每个k都是依据hash(k)的取模运算出来拿到的内存地址,当第二个元素进行取模时确定的内存地址相同则在此entry<k,v>数组上添加链表,已解决hash冲突,在解决hash冲突的时候需要重写equals方法和hashcode,当数组容量不够时则扩容数组为之前的二倍 尽可能减少扩容的次数 .

中科软一面
java里面的时间类
java.util.Date,和java.util.Calendar 是 java 的主要的时间类型
现阶段已经由java.util.Calendar代替了Date类
首先得到Calendar日历对象的获取并不用是new Calendar( );的方式获得。
它使用的工厂的方式来获得对象,通过Calendar.getInstance();这个方法获得Calendar日历对象。
在这里插入图片描述
里面calendar有很多方法
首先Calendar也有获取long类型时间方法,也有获取Date类型时间方法,通过setTime( )方法,可以将一个Date类型的时间设置给它,也通过setTimeInMillis()方法,可以将一个long类型的时间设置给它,或者通过set( )方法,可以将年月日时分秒一一设置给它,通过get方法可以获得年月日时分秒,还能得到当前年有多少天,当前月有多少天等等,很强大。这里参数选择是枚举的。
calendar.add()这个add( );日期的运算方法也是很常用的哦,需要传入两个参数给它,第一个参数你要设置的单位(是年或者月还是分,这个还是枚举选择的方式),第二个参数就是你要加上的数值(如果要减去,那给它加上个负数就是减去了)。
TCP和UDP的区别:
1.TCP面向连接(如打电话要先拨号建立连接,也就是三次握手);UDP是无连接的,即发送数据之前不需要建立连接(腾讯的通讯传输都是基于UDP实现比如:微信断网发送多个图片,当连上网之后他会不分顺序的发到另一方)
2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3.TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP一般应用在网页连接的三次握手,UDP一般应用在通信消息如腾讯
https://www.cnblogs.com/williamjie/p/9390164.html

高并发情况下的悲观锁:
悲观锁,正如其名,当数据被外界修改时,此时被选中的数据处于锁定状态,外界的任何操作都无法对其修改
例子:一个典型的倚赖数据库的悲观锁调用:
select * from account where name=”Erica” for update
这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的记录。
本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
转自 https://www.cnblogs.com/huojg-21442/p/7120173.html

java中的sleep()和wait()的区别,
这两个方法来自不同的类分别是Thread和Object
最主要是sleep方法没有释放锁,而wait方法释放了锁,且wait方法只能在同步控制方法或者同步控制块使用,而sleep可以再任何地方使用
sleep必须捕获异常,而wait不需要捕获异常

java-多态
多态就是指一个方法在不同的情况下实现的多种形态
例如最简单的就是java里面的“+”操作,也仅仅只有“+”号操作有多态的形式,“+”号在字符里面是一个拼接的操作,在数字运算就是加法操作,这就是多态的一种表现。
在scala里面+,-,*,/,都是一个方法,那么这些方法都可以重载实现自定义的方法这就是一种多态的表现。
还有就是java里面的重载:在同一个类中方法名相同,参数列表不同(参数类型,参数个数,参数顺序),就是说他们可以有多种实现
另一个就是java里面重写:在子父类关系中,子类重写父类的方法也算是一种多态的体现

单例模式的实现
public class SingleTon(){

//首先需要一个静态私有的变量
	private static SingleTon Instinct();
	
//私有空构造方法要显示的建立出来 这个郝老师说过的谨记!!
	private SingleTon(){}
	
//创建一个方法用来返回Instinct的实例
	public static SingleTon getInstinct(){
	
		if(Instinct==null){
			Instinct=new SingleTon();			
		}
		return Instinct;//这里使我们要返回的实例 ojbk
	}
}	
冒泡算法的实现
public class Buddle {

    public void bubbleSort(int[] arr){

        int temp=0;

/**
 *      931865272 第一次 9-1=8,循环8次
 *      if 8>1-7 then 8--
 *
 */
        //控制循环的次数,表示趟数
        for(int i=0;i<arr.length-1;i++){//这里循环8次

            //对比俩俩相邻数的大小 然后一次将最大或者最小的数排在最右侧
            for(int j=arr.length-1;j>i;j--){//外层for一次循环 这里就走7次 

                if(arr[j]<arr[j-1]){//如果 8号位小于7号为则 交换位置 每次循环拿出最小的放入最左侧

                    temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }
            }
        }
    }
}

在这里插入图片描述
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions),可查异常一般都是编译时期异常要求必须处理,不可查异常要求用try catch捕获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值