StringBuffer 和 StringBuilder的区别
区别1:线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰。
区别2:性能
既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。
String声明的是不可变的对象,每次操作必然产生一个新的对象
StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder
集合线程中的问题
Collection是对象的集合,Collection有两个子接口List和Set。
List可以通过下标(1,2…)来取得值,值可以重复,而Set只能通过游标来取值,并且值是不能重复的
ArrayList,vector,LinkedList是List的实现类
ArrayList是线程不安全的,Vector是线程的安全的,这两个类底层都是由数组实现的
LinkedList是线程不安全的,底层是由链表实现的
Map是键值对集合
HashTable和HashMap是Map的实现类
HashTable是线程安全的,不能存储null值
HashMap不是线程安全的,可以存储null值
线程
线程具有声明周期,其中包含了7种状态:
1.出生状态:线程被创建时处于的状态,在用户使用该线程实例调用start()方法之前线程都处于出生状态
2.就绪状态:当用户调用start()方法后,线程处于就绪状态(又被称为可执行状态)
3.运行状态:当线程得到系统资源后就进入运行状态。
一旦线程进入到就绪状态,他会在就绪与运行状态下转换,同时也有可能进入等待,休眠,阻塞或死亡状态
4.等待状态:当处于运行状态下的线程调用Thread类中的wait()方法时,该线程便进入到等待状态;
进入等待状态的线程必须调用Thread类中的notify()方法才被唤醒,唤醒后进入到就绪状态;
而notifyAll()方法是将所有处于等待状态下的线程唤醒,唤醒后进入到就绪状态;
5.休眠状态:当线程调用Thread类中的sleep()方法时,则会进入休眠状态;
6.阻塞状态:如果一个线程在运行状态下发出输入/输出请求,该线程进入到阻塞状态;
在等待输入/输出结束时线程进入就绪状态,对于阻塞的线程来说,即使系统资源关闭,线程依然不能
回到运行状态;
7.死亡状态:当线程的run()方法执行完毕时,线程进入死亡状态;
虽然多线程看起来像同时执行,但事实上在同一时间点上只有一个线程被执行,只是线程之间的切换
较快,所以才会使人产生线程是同时执行进行的假象,在Windows系统中,系统会为每个线程分配一
小段CPU时间片,一旦CPU时间片结束就会将当前线程换为下一个线程,即使该线程没有结束。
使线程处于就绪状态有以下几种方法:
调用sleep()方法
调用wait()方法
等待输入/输出完成。
当线程处于就绪状态后,可以用以下几种方法使线程再次进入运行状态:
线程调用notify()方法。
线程调用notifyAll()方法;
线程调用中断interrupt()方法:
线程的休眠时间结束
输入/输出结束
Git
**从远程仓库克隆代码:**git clone 从仓库复制的地址
**查看日志文件:**git log
**查看工作目录当前状态:**git status
**增加文件到缓存区:**git add
**提交代码到本地仓库:**git commit -m ‘此处填写修改的信息’
**将代码提交到远程仓库:**git push
**从远程仓库拉取代码:**git pull
跨域
什么是跨域?
当一个页面请求的url的协议、域名、端口三者之间任何一者与当前页面url不同即为跨域。
案例:
当前页面url | 被请求页面url | 是否跨域 | ** 原因** |
---|---|---|---|
http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(协议、域名、端口号相同) |
http://www.test.com/ | https://www.test.com/index.html | 跨域 | 协议不同(http/https) |
http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 端口号不同(8080/7001) |
**解决办法:**在controller层加一个@CrossOrigin注解
网络
**局域网:**如宿舍在一起打游戏的网络
**广域网:**典型的因特网,想要在网络中通信是必须用到网络协议的
**协议分为:**TCP协议和UDP协议
**TCP协议:**需要创建连接请求,连接成功后发送数据(发送数据有一个验证的过程,效率低),可以反馈数据是否送达,比较可靠
TCP网路传输控制协议,TCP是面向连接的通信协议,即传输数据之前在发送端与接收端之间建立连接,然后再传输数据,再传输数据之前进行三次握手来建立连接:
**第一次握手:**客户端向服务器发出连接请求,等待服务器确认
**第二次握手:**服务器向客户端发送响应,通知客户端收到连接请求
**第三次握手:**客户端再次向服务器端确认请求
完成三次握手建立连接后,客户端与服务器端之间就可以进行数据传输了,TCP协议可以保证数据传输的安全性,比如日常生活中的下载文件
四次挥手:(终止协议)
第一次,客户端像服务端发送FIN结束报文段,准备关闭连接
第二次,服务端确认客户端的FIN,表示自己已经收到对方关闭连接的请求
中间这段时间,客户端停止向服务端发送数据,但是服务端可以向客户端发送数据,要将自己未处理完任务处理完
第三次,服务端向客户端发送FIN结束报文段,准备关闭连接
**第四次,**客户端确认服务端的FIN,进入TIME_WAIT状态,此时客户端进程已经退出,但是连接还在
**UDP协议:**不创建连接请求,直接发送数据(效率高,适合开发视频聊天等应用)
无任何反馈,数据传输上来说不可靠,他可以同时发送多条消息,但是不知道对方是否收到了,也可以接收多条消息
**端口:**网络服务请求不同的端口
如果HTTP服务就请求80端口,HTTPS服务就请求443端口,FTP就请求21端口,Tomcat请求8080端口,mysql请求3306端口
电脑里的端口有0–65535个,通常0–1023之间的端口数用于一些知名的网络服务和应用,写程序的端口应该在1024端口以上,也就是用于普通网络程序
套接字:(socket)提供给程序可以对外进行连接的接口
**IP:**格式192.168.0.1 它是32位无符号的数字,他由四位数字组成,每组数字的取值范围都是0–255,他被成为(IPV4)
特殊的IP:本地回送地址:127.0.0.1 不会进行网络传输,立即返回本地
IP地址的四段数字:192.168.219.1
第一组:网络类型,第二组:网络范围,第三组:网络位,第四组:主机位
IP地址是由32位的二进制数字组成,每8位表示一个10进制数范围0–255,IP地址是由网络地址与主机地址两部分组成,网络地址可用来识别设备所在的网络,主机地址位于IP地址的后段,可用来识别网络上设备
1、http:// (应用层) TCP,UDP(传输层) IP(网络层)
http://www.baidu.com每一组都代表什么?
1、http://
代表超文本传输协议,通知microsoft.com服务器显示Web页,通常不用输入。
2、www.
代表万维网,是基于客户机/服务器方式的信息发现技术和超文本技术的综合。WWW服务器通过超文本标记语言(HTML)把信息组织成为图文并茂的超文本,利用链接从一个站点跳到另个站点。
3、baidu.
百度公司的外名名称。
4、com
通用域名格式,为commercial简称,表示表明由商业组织注册此域名的原始意图。
== 和 equals的区别
1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
3.==指引用是否相同, equals()指的是值是否相同
java基本数据类型
java中的基本数据类型(八种)
一个字节等于八位
byte 占1字节 (-27–27-1) -128~127
boolean 占1字节 有两个值: true false
short 占2字节 (-215–215-1) -32768~32767
char 占2字节 只能存放一个字符
int 占4字节 (-231—231-1) -2147483648~2147483647
float 占4字节 定义一个单精度浮点类型,要在后面加上F 否则默认为双精度浮点类型
long 占8字节 (-263–263-1) -9223372036854775808~~9223372036854775807
double 占8字节 双精度浮点类型
ASCII常用字符:
‘0’-‘9’: 48 ~ 57
‘a’-‘z’: 97 ~ 122
‘A’-‘Z’: 65 ~ 90
集合中常见的问题
list接口
List接口允许其集合中的元素可以重复,并且也是有序的,通过索引来标识(第一个添加元素的索引值为0)
List中不能放基本数据类型的数据,数组中是可以的
常用的实现类ArrayList和LinkedList
ArrayList使用数组作为容器,因此如果需要删除元素,开销很大。但是适合查找元素
LinkedList使用双向链表作为容器,因此如果需要获取元素,开销很大。但是适合添加和删除
set接口
两者中的值都不能重复,就如数据库中的唯一约束。
1.TreeSet是二叉树实现的,TreeSet中的数据是自动排序好的,不允许放入null值。
要想指定集合的存放顺序,被排序的对象需实现Comparable接口。 ComparableTo的三个返回值:负数,正数,0
2.HashSet是哈希表实现的,HashSet中的数据是无序的,可以放入null值,但只能放入一个null。
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象, hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。
Map接口
1.Map根据键值对存放,键不可以重复,值是可以重复的。
2.HashMap的是随机存储的,TreeMap是根据键的升序排序
3.HashMap适合插入和删除,TreeMap适合自然排序
4.HashMap中通过get()来获取value,通过put来插入value
代码块的执行顺序
静态代码块
-
在类中成员方法之外,用Static修饰代码区域可以称之为静态代码块
-
静态代码块运行顺序:静态代码 > 非静态代码 > 构造方法 > 成员方法(成员方法只有在调用的时候才能运行)
-
注意:java静态代码块在类加载时就执行,但是只执行一次
`public class Static{` `static {` `System.out.println("这里是静态代码块");` `}` `{` `System.out.println("这里是非静态代码块");` `}` `public Static() {` `System.out.println("这里是构造方法");` `}` `public void method(){` `System.out.println("这里是成员方法");` `}` `public static void main(String[] args) {` `Static ss = new Static();` `// ss.method(); 成员方法只有在调用的时候才能运行` `}` }
面向对象的初始化过程
Student s = new Student(); 在内存中做了哪些事情呢?
1:加载Student.class文件
2:在栈内存为s开辟空间
3:在堆内存为学生对象开辟空间
4:对学生对象的成员变量进行默认初始化
5:对学生对象的成员变量进行显示初始化
6:通过构造方法对学生对象的成员变量赋值
7:学生对象初始化完毕,把对象地址赋值给s变量