三.三种方式的对比
由于Java的类只能继承一个类而可以实现很多接口,
所以实现Runnable和Callable接口则可以更好地扩展(留了一条可以继承类的后路),
当继承Thread时,this指向的就是当前线程即Thread.currentThread
四.面试中可能会问的一些问题(真的有用,亲身经历)
1.run和start区别
run方法只是实现Thread类时需要重写的一个方法,注意,他只是一个方法,
就跟你去创建一个类然后写一个方法没什么不同,在执行run时仍在主线程(当前线程)中
而start则是标志着线程的启动,
不执行start方法则创建的线程无法执行(在主线程创建了新的线程,执行start则去启动创建的线程,也会执行线程中的run方法)
2.Runnable和Callable区别
Runnable从Jdk1.0就有了,run方法无返回值不能抛出异常
Callable从Jdk1.5引入,call方法可以有返回值和抛出异常
3.notify和notifyAll
Notify()只能随机唤醒一个线程,不能具体的去唤醒
,
NotifyAll()唤醒所有的正在wait的线程并允许它们争夺锁保证了至少有一个线程能继续运行
4.interrupted和isInterrupted区别
interrupted静态方法,检查中断状态后会将中断状态清零
isInterrupted非静态方法,
检查中断状态后不会改变中断状态标识
5.yield方法作用?
暂停当前正在执行的线程对象,使其他具有相同优先级的线程执行
6.如何使得线程顺序执行(以后准备专门写一篇来讲这个,暂时一掠而过)
两种方法:join()和newSingleThreadExecutor()--------单线程池(线程池以后一定介绍)
7.wait和sleep区别
Wait方法会释放锁,释放持有的资源,
Sleep一直持有锁,不会释放资源,也有睡眠当前线程的作用,毫秒为单位.
8.创建线程的三种方式的对比
. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。
. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。
9.线程的几个主要概念
线程同步
线程间通信
线程死锁
线程控制:挂起、停止和恢复
//JVM知识
27.什么情况下会发生栈内存溢出。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。
如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
//在一个数组中查找某一个值--
3)使用一个简单的循环
public static boolean useLoop(String[] arr, String targetValue) {
for (String s : arr) {
if (s.equals(targetValue))
return true;
}
return false;
}
//判断导入的发票号码列是否有重复值
Map
//判断是否为空,blank忽略空格
empty --
String a = " "; false
String b = ""; true
String c = null; true
blank --
String a = " "; true
String b = ""; true
String c = null; trues
//是否不为空
if(StringUtils.isNotBlank(entryMoney)){
costAmountInfo.setRZJE(entryMoney);
}
//exists检测targetFilePath路径下的文件是否存在
File targetFile = new File(targetFilePath);
if (!targetFile.exists()){
targetFile.mkdir();
}
//随机数,ceil向上取整,floor向下取整
Random r = new Random () ;
r.nextInt (201) ; // 这个是0 - 200 201代表个数,从0开始
Random r = new Random () ;
r.nextInt (171) + 30 ; // 这个是30 到 200. 171代表个数,从30开始
ceil(1.2) = 2;
ceil(-1.2) = 1;
//截取(>= <)
//beginIndex -- 起始索引(包括), 索引从 0 开始。
//endIndex -- 结束索引(不包括)。
public class RunoobTest {
public static void main(String args[]) {
String Str = new String("This is text");
System.out.print("返回值 :" );
System.out.println(Str.substring(4) );
System.out.print("返回值 :" );
System.out.println(Str.substring(4, 10) );
}
}
以上程序执行结果为:
返回值 : is text
返回值 : is te
s
//Mybatis中$和#的区别
$一般传进什么就是什么,不做任何处理,容易被攻击
#一般传进来,当成字符串,安全,
//
1、Maven默认处理策略
最短路径优先
Maven 面对 D1 和 D2 时,会默认选择最短路径的那个jar包,
即 D2。E->F->D2 比 A->B->C->D1 路径短
2、
最先声明优先
如果路径一样的话,如: A->B->C1, E->F->C2 ,两个依赖路径长度都是 2,
那么就选择最先声明。
//(2)手动排除
或者手动在pom.xml中使用
(上面利用插件Maven Helper中的execlude方法其实等同于该方法):
hibernate3-maven-plugin
seasNew_util
mvn分析包冲突命令:mvn dependency:tree
// Java如果在try,catch里面执行return,那么还会不会执行finally?
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,
而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。
也就是说方法的返回值是在finally运算之前就确定了的。
4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,
try中的return语句返回的就是在finally中改变后的该属性的值。
5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
.
先执行try中的语句,包括return后面的表达式,
(1)有异常时,先执行catch中的语句,包括return后面的表达式,
(2)然后执行finally中的语句,如果finally里面有return语句,会提前退出,
(3)最后执行try中的return,有异常时执行catch中的return。
(4)在执行try、catch中的return之前一定会执行finally中的代码(如果finally存在),
(5)如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句一定会被执行的。编译器把finally中的return语句标识为一个warning.
(6)在finally中修改try或者catch中的值返回的还是之前的try,catch中的值,
也就是说在finally中修改的值无效
//1、读取文件,并转换为字节流
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte [] infbytes = new byte [( int )fs.Length];
fs.Read(infbytes, 0 , infbytes.Length);
fs.Close();
return infbytes;
//2、将字节流写入文件
FileStream fs = new FileStream( " D:inf.dlv " , FileMode.Create, FileAccess.Write);
fs.Write(inf, 0 , inf.Length);
fs.Close();
//linux基本指令
tail:
-n 是显示行号;相当于nl命令;例子如下:
tail test.log # 默认显示最后 10 行
tail -f test.log 实时查看日志文件test.log
tail -100f test.log 实时查看日志文件最后一百行
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
shutdown -h now 立刻关机
shutdown -h 5 5分钟后关机
shutdown -r now 立刻重启
shutdown -r 5 5分钟后重启
cd / 切换到根目录
cd /user 切换到根目录下的user目录
pwd 查看当前目录路径
mkdir aaa 在当前目录下创建一个名为aaa的目录
mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录
touch aa.txt 在当前目录下创建一个名为aa.txt的文件
touch /user/aa.txt 在指定目录创建一个名为aa.txt的文件
rm -rf 目录/文件/压缩包 删除任何目录或文件,都直接使用
示例:将/usr/tmp 下的ab.tar解压到当前目录下
tar zxvf ab.tar------解压
示例:将/usr/tmp 下的ab.tar解压到根目录/usr下
tar -zxvf ab.tar -C /usr------C代表指定解压的位置
ps -ef | grep sshd 查找指定ssh服务进程
ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp身
ps -ef | grep sshd -c 查找指定进程个数
kill -9 pid (强制)结束进程
控制屏幕光标的移动,字符、字或行的删除,查找,移动复制某区段及进入Insert mode下,或者到 last line mode。
1)命令行模式下的常用命令:
【1】控制光标移动:↑,↓,j
【2】删除当前行:dd
【3】查找:/字符
【4】进入编辑模式:i o a
【5】进入底行模式::
【6】复制一行内容:yy
【7】粘贴复制的内容:p
2) 编辑模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
编辑模式下常用命令:
【1】ESC 退出编辑模式到命令行模式;
【2】进入底行模式 : :
3) 底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
底行模式下常用命令:
【1】退出编辑: : q
【2】强制退出: : q!
【3】保存并退出: : wq
//Linux项目部署
11.1 安装jdk1.8
先卸载open-jdk
java -version
rpm -qa | grep java
== ps aux | grep java
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64
开始安装:
mkdir /usr/local/src/java
rz 上传jdk tar包
tar -zxvf jdk-8u181-linux-x64.tar.gz
yum install glibc.i686
配置环境变量:
vi /etc/profile
在末尾行添加
#set java environment
JAVA_HOME=/usr/local/src/jdk8/jdk1.8.0_181
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出
source /etc/profile 使更改的配置立即生效
java -version 查看JDK版本信息,如果显示出1.8证明成功
//常用的注入方式主要有三种:
构造方法注入:
setter注入:
基于注解的注入:
Alter Table itsf_domain_sqbxx Add SQLB Varchar2(100);
1、增加一个字段:(增加字段时,只能排在已有字段的后面,不能插到已有字段之间)
Alter Table t_si_addr Add CHG_ADDR_FLAG number(1,0);
Alter Table 表名 Add 字段名称 字段类型;
2、增加两个字段;
Alter Table t_si_addr Add (CHG_ADDR_FLAG number(1,0),ADD_BY_IOM Varchar2(2));
Alter Table 表名 Add (字段名称 字段类型,字段名称 字段类型);
3、修改字段类型
alter table income_contract_conperinfo modify contractpro varchar2(2000);
Alter Table 表名 modify (字段名称 字段类型);
//重载(Overload)与重写(Overrid)的区别
***构造方法可以重载,不可以重写
重载:在同一类中,方法名相同,参数类型.个数.返回值类型和访问修饰符都可以不同;
重写:是指在派生类中(子类)重新对基类(父类)重新实现,
方法名相同,参数类型.个数.返回值类型和必须相同;
static方法不可以被重写;
//list.set.map是否可以为空
1、vector、arraylist、linkedlist可以存储多个null.
2、hashset、linkedhashset可以存储一个null.
treeset 不能存储null.
3、hashmap 、linkedhashmap key与value均可以为null.
treemap key不可以为null,value可以为null.
hashtable、concurrenthashmap key与value均不能为null.
Connection接口:
— List 有序,可重复
ArrayList
优点:
底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
linkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
—Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
linkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1.如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Map接口:
— HashMap和HashTable是无序的。
— linkedHashMap和TreeMap是有序的,
Hashtable(线程安全)的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
收入确认
//设置保留两位小数
DecimalFormat df = new DecimalFormat(".00");
df.format(参数);
例:revenueinfo9=revenueinfo9+Double.parseDouble(df.format(revenueinfo14));
//设置保留六位小数
DecimalFormat df6 = new DecimalFormat(".000000");
df6.format(参数);
例:revenueinfo9=revenueinfo9+Double.parseDouble(df6.format(revenueinfo14));
//int与Integer之间的比较,equlas值相等的话都是true;
int aa = 100;
int bb = 100;
Integer a = new Integer(100);
Integer b = new Integer(100);
Integer c = 100;
Integer d = 100;
Integer e = 128;
Integer f = 128;
Integer g = 127;
Integer h = 127;
a = b = false;
a = c = false;
c = d = true;
e = f = false;
g = h = true;
aa = bb = true;
aa = a = true;
aa = c = true;
//内连接自连接的区别
内连接取两张表完全匹配的数据,不去除重复的字段
自连接取两张表完全匹配的数据,去除重复的字段
inner join (内) a,b where a.id=b.pid and 其他条件 或者 a inner join b on a.id=b.pid where 条件
union all(不去除重复的行) (外) select * from a where a 条件 union all select * from b where b 条件
union (去除重复的行) (外)
//sql语句执行顺序
select * from a where 条件 group by a.字段 having (聚合函数条件) order by a.字段
执行顺序:from 表---where条件---group by分组---having条件---select *---order by desc(降序)
//
resourse 按名字来查再按数据类型来查 由j2ee提供
autowired 按数据类型来查 由spring提供
//重定向和请求转发的区别
1、从上面的一次重定向和一次转发的过程来看,我们可以得出第一个差别点,
就是转发是一次请求,重定向是两次请求(可能丢失数据),因此转发的速度要快于重定向。
2、第二个差别点也很明显,
转发之后地址栏上的地址不会变化,还是第一次请求的地址,
重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址。
3、跳转限制
转发只能跳转本站点资源,重定向可以跳转到任意URL。
4、发生行为不同
转发是服务器端行为,重定向是客户端行为。
5、是否可以传数据
转发可以传输数据,重定向不传(跳转界面用)
//HTTP,TCP,IP
(应用层)HTTP:GET于POST (HTTP未加密,明文,HTTPS加密,安全)
GET明文提交,传输数据小。
POST暗文提交,传输数据大,可以提交文件。
(传输层)TCP:传输控制协议,面向连接,可靠性强,传输效率低,速度慢;
三次握手:建立tcp连接,发送三个包来确认连接的建立。
四次挥手:断开连接,发送四个包来确认连接的断开。
UDP:用户数据报协议,无连接,可靠性弱,传输效率高,速度快;
(网络层)IP: 是无连接的通信协议,将消息(其它数据)分割为小的独立的包,将每个包路由至它的目的地。
(服务部) (客户部)
HTTP(服务器,转发) HTTP (客户端,重定向) (应用层)
↓ ↑
TCP(传输层) TCP (传输层) (传输层)
↓ ↑
IP(网络层) IP(网络层) (网络层)
↓ ↑
网络 →→→→→→ 网络 (数据链路层)
https://jingyan.baidu.com/article/6fb756eca4696b241858fbb8.html //代码量
http://cpsdev.neusoft.com:81/cps/
http://192.168.140.231:8051/itsf/domainTrackAction.do?method=domainManage
http://192.168.6.117:18080/svn/AHSourceCode/itsf2
http://192.168.6.120/BS/cims.git
// hosts路径
C:WindowsSystem32driversetc
//session登录拦截
https://blog.csdn.net/weixin_37891479/article/details/79530669
//见到如下错误,可以想到是不是jar包冲突
1.java.lang.NoSuchMethodError
2.java.lang.ClassNotFoundException
3.java.lang.NoClassDefFoundError
/b 回车 /n 换行 br/ 换行
//indexOf作用
String string = "aaa456ac";
//查找指定字符是在字符串中的下标。在则返回所在字符串下标;不在则返回-1.
System.out.println(string.indexOf("b")); // indexOf(String str); 返回结果:-1,"b"不存在
// 从第四个字符位置开始往后继续查找,包含当前位置
System.out.println(string.indexOf("a",3));//indexOf(String str, int fromIndex); 返回结果:6
//(与之前的差别:上面的参数是 String 类型,下面的参数是 int 类型)参考数据:a-97,b-98,c-99
// 从头开始查找是否存在指定的字符
System.out.println(string.indexOf(99));//indexOf(int ch);返回结果:7
System.out.println(string.indexOf('c'));//indexOf(int ch);返回结果:7
//从fromIndex查找ch,这个是字符型变量,不是字符串。字符a对应的数字就是97。
System.out.println(string.indexOf(97,3));//indexOf(int ch, int fromIndex); 返回结果:6
System.out.println(string.indexOf('a',3));//indexOf(int ch, int fromIndex); 返回结果:6
//普通索引
create index 索引名 on 表名(字段名1,字段名2,......,字段名n);
create index IDX_GIRL_3 on T_GIRL(keyid);
//唯一索引
create unique index 索引名 on 表名(字段名1,字段名2,......,字段名n);
create unique index IDX_GIRL_3 on T_GIRL(keyid);
//主建是唯一索引
不要为表的主建创建索引,因为Oracle自动为表的主建字段创建唯一索引。
//删除索引
drop index 索引名;
//字符串倒序输出
String a ="abcd";
//字符串转成字符数组
char[] array= a.toCharArray();
for (int i=array.length-1; i>=0; i--){
System.out.println(array[i]);
}
//8中基本数据类型
1、整数型:byte(8位)、short(16位)、int(32位)、long(64位)
2、浮点型:float(32位)单、double(64位)双,默认的浮点类型是double,如果要指明是float,须在后面加f
3、字符型:char(16位)
4、布尔型:boolean(1位)
//1.SSO服务是什么?
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,
即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,
这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,
辅助了用户管理,是目前比较流行的。
//添加已有表的字段
insert into 表(字段1,字段2,字段n)
select 字段1,字段2,字段n from 表
//文件
File file = new File(importUrl + SEPARATOR + file.getOriginalFilename());
//文件转成输入流
FileInputStream in = new FileInputStream(file);
//区分是xls还是xlsx结尾
Workbook wb = WorkbookFactory.create(in);
后续可以直接操作sheet,Row,Cell,也不用管文件类型。
//取值,poi
Sheet sheet =wb.getSheetAt(0);
//getSheetAt和getsheet参数不一样,
getSheetAt的参数应该是索引,引用第几个sheet;
getSheet的参数应该是sheet的名称,获取具体名称的sheet。
//获取服务器返回的输入流
getInputStream()方法可以获得网络连接输入,同时返回一个InputStream实例 。
//getInputStream于getOutputStream的区别
客户端上的使用
1.getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。
2.getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
服务器端上的使用
1.getInputStream方法得到的是一个输入流,服务端的Socket对象上的getInputStream方法得到的输入流其实就是从客户端发送给服务器端的数据流。
2.getOutputStream方法得到的是一个输出流,服务端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给客户端的数据。
//创建表格
//form表单一键提取数据
$("#form").serializeObject()
//通过一些参数查询数据。
$('#dg').datagrid(参数);
例: var options = $('#dataGrid').datagrid('options');
options.url = ctxPath + '/incomecriteria/getDataList';
options.queryParams = $("#form").serializeObject();
$('#dataGrid').datagrid(options);
//初始化表格
$('#dg').datagrid({
url:'datagrid_data.json',
columns:[[
{field:'code',title:'Code',width:100},
{field:'name',title:'Name',width:100},
{field:'price',title:'Price',width:100,align:'right'}
]]
});
//重置按钮
function cleanValues() {
$('#searchForm').form('clear');
}



