大学女生都会的Java拿offer的偏方!
我好像掌握了JAVA 拿offer的偏方
java中的集合框架用过哪些
java中的集合分为单列集合和双列集合, 单列集合顶接口为Collection, 双列集合顶级接口为Map-
collection的子接口有两个:List和Se to
List接口的特点; 无素可重复, 有序(存取顺序) ,
list接口的实现类:
ArrayList:底层实现是数组, 查询快, 增删慢, 线程不安全, 效丰高;
LinkedList:底层实现是谜表, 增删快, 查询慢, 线程不安全, 效率高;
set接口的特点:元素唯一, 不可重复, 无序,
set接口实现具:
HashSet:底层实现hashMap, 数组十链表实现, 不允许元素重复, 无序。
Tree Set:底层实现红黑二叉树, 实现元素排序
Map-接口的特点:key-value健值对形式存储数据
Map接口实现类;
Hash Nap:底层数组十链表实现, 线程不安全效率高:
TreeMap:底层红黑二叉树实现, 可实现元素的排序;
Linked Hash Nap:底层hash nap+linkedList实现, 通过hashmap实现key-value键值对存锗, 通过徒表实现元素有序。
说一下你对Spring的理解
Spring这个框架做项目一直都在用吧, 现在月的最多的是Spring Boot和Spring Cloud Alibaba里那些组
件。我先说一下Spring, Spring的核心主要的就三个点吧I0C, D 1和AOP。
10C控制反转, 不用Spring框架的话如果想创建一个对象, 就new一个。用了Spring以后直接把类交
给Spring来管理, 让Spring给创建对象, Spring就是一个大工厂模式, 底层创建对象的方式是通过配置文
件+反射的方式
D 1就是依赖注入, 把Spring框架创建好的对象注入到使用的地方, 我们项目中都是用O Auto Mired照
类型注入的方式, 直接获取到这个类的对象。还有AOP, 就是面向切面编程, 它的原理的话, 我看过
它的底层代码,它实际上就是实现了动态代理权制,以前的话用这个做过事务的控制,现在的话我们
都用e Transaction nal注解来控制事务, 其实他底层实现还是aop那一套。
哪些场景不适用索引
大概分三种情况吧:
第一种情况是:做查询的时候很少用到的列、某个列中包含的数据很少
第二种情况是; 数据类型的宇段是TEXT、BLOB、BIT等数据类型的宇段、
第三种情况是:当在数据表中修改数据的频率大于查询数据频率时等,这些场景不适合创建索引,还有
查询宇投不会做为where条件或者order by字段时也不适合创建索引
什么是死锁
打个比方,低设有P1和P2两个进程,都需要A和B两个资源,现在P1持有A等待B资源,而P2持有B等持
A资源,两个都等持另一个资源而不肯释放资源,就这样无限等持中,这就形成死锁,这也是无锁的一
种情,给死镇下个定义,如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发
的事件,那么读组进程是死镇的。竞争不可抢占资源引起死镇,也就是我们说的第一种情况,而这都在
等待对方占有的不可捡古的资源。
mysql内部西数多了解一下
concat, trim, replace, substringcur date 0#返回当前日期, cur time 0#返回当前时间, now 0#返回当前
日期十时间i(value, true, false) #如果value值为真, 则回true, 否则, 返田false
select if(salary>3000, 'Hight', 'Low') fron salary;
select id, salary, if(salary<=>NULL, 'NULL', 'NDT NULL') fron salary;
2、if null(value 1, value 2) #如果value 1不为空, 则延四value l, 不然返回value z
#可以用来进行空值替换
select if null(salary, 000) from salary; 等等,
如果数据库误操作,如何执行数据恢复
看你ny sql有没有开启那个binlog, 然后用mysql自常的mysqlbinlog工具找到最近误操作时间节点的
binlog, 重放到临时数据库里, 然后选择误删的数据节点, 恢复一下。
主库从库数据延迟的问题有遇到过吗
主要原回:数据库在业务上读写压力太大, CPU井算负砖大, 网卡负荷大, 硬盆随机10太高(本要原回:读写binlog带来的性能影响, 网络传输延迟My5al数据库从库同步的延迟解决方案:
架构方面
1) 业务的持久层采用分库架构, ny sql服务能力水平扩展, 分散压力
2)单个库读写分离,一主多从,主写读从,分散压力。这样从库比主库压力高,保护主库
3) 服务在业务和DB之间加入ner cache和red is的cache层, 降低读的压力
4) ·不同业务的mysql放在不同的物理机, 降低压力
5) , 使用比主库更好的硬件设备, Mq sql压力小, 适迅就减少了
使用Red is缓存有没有遇到什么问题
你是说的那个缓存雪崩和缓存穿, 我知道暖存雪崩是国为red is中多个key同时失效后, 又透到高井发后就会造成大量的请求直接请求数据库, 导致数据库服务器宏机的情况, 一般这种情况我们会给red is中的key设置不同的生命周期就能解决, 或者是我们给使用分布式锁来解决; 还有缓存穿透的话就是大并发请求过来,查询一个连数据库都没有的数据,频繁的请求数据库导致数据库宏机,这种解决方靠是我们会存到red is一个key值value为null, 给个失效时间, 也可以避免这种问题,
说一下red is集群吗
Red is本身支持集群操作red is_a luster, 另外red is还支持主从复制, 以前的老版本中有一个哨兵模式, 在主服务器机时, 从服务器可以自动转换为主服务器, 我们公司搭建的red is集群是用的ruby脚本配合搭建的,我们一去茶建了6台服务器,3主3备,他们之间通信的原理是有一个乒乓协议进行通信的,他们判断一个节点的状态是用投票选举机制判断的,半数以上判断一个接口是宏机了的话,备用节点就会启动对, 我再给你说下一他们往里存储数据的机制, 其实这个red is搭建好集群以后每个节点都存放着一个hash槽, 每次往里存储数据的时候, red is都会根据存储进来的key值算出一个hash值, 通过这个hash值可以判断到底应该存诸到哪一个哈希槽中, 取的时候包是这么取的, 这就是我了解的red is集群。
简单说一下Spring MVC与Spring是如何整合的
简单的说spring MVC在ssm中整合就是在webxml边配置spring MVC豹核心控制器:Dispatch-
er servlet, 它就是对指定后纸进行柜截; 然后在spring NVCx nl里边配置扫描器, 可以扫插到带a control-ler注解的这些类, 现在用spring NVC都是基与注解式开发, 像e service, Repository B Request nap-
ping, O response body啦这些注解标整等等都是开发时用的, 每个注解标签都有自己的作用; 它还配置一个视图解析器, 主要就是对处理之后的转进行统一配置, 大致就是这些, 如何使用spring MVC获取表早里的数据通过形参和表单里的nane值保持一致就能获取到,
说一下Spring Boot吧
Spring Boot:的定大于配置:同样通过自动配置, 引入依赖后, 加载默认配置文件, 如果要自定义的话可以通过java类实现, 也可以在全局配置文件(applicationproperties, applicationyml) 中定义;Spring Boot优点
1快速创建独立运行的Spring项因以及与主流框架集成
2使用嵌入式的Servlet容器应用无需打成WAR包(jar)
3Starters(场景启动器) 自动依赖与版本控制
4大量的自动配置,简化开发,也可修改默认值
55无需配置大量的X NL, 无代码生成, 开箱即用
简单说一下sql语句是怎么优化的
我们一般在开发的时候需要注意SOL规范, 比如说最基本的不要用查询所有字段, 还要是经常用表别名, 经常corm it提交事务尽量让及时释放国滚点, 如果使用函数的话尽量使用内部的函数, 还有一个优化的地方是项目上线后,产生大量数据后,由测试人员发现某些的功能点响应比较慢,反镜给我们开发人员,我们开发人员找到这个功能点对应的sql语句, 如果这个sql语句写的比较复杂, 我们就得用explain去分析-下5QL语句的执行计划,看下是不是索引失效了,或者是执行到某一个子查询的语向执行比较慢,然后我们去优化达些个sql, 优化方式是什么比如说加索引, 或者创建视图。
很多使用Zookeeper的情景是需要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务,此时我们需要通过程序的方式来启动Zookeeper。此时可以通过Zookeeper API的ZooKeeperServerMain类来启动Zookeeper服务。
下面是一个集群模式下启动Zookeeper服务的例子
这里假定我们运行Zookeeper集群的三台机器名分别为fanbinx1,fanbinx2,fanbinx3
首先是zoocfg配置文件
[plain] view plain copy print
tickTime=2000
dataDir=/tmp/zookeeper/data
clientPort=2181
initLimit=10
syncLimit=5
server1=fanbinx1:2888:3888
server2=fanbinx2:2888:3888
server3=fanbinx3:2888:3888
启动Zookeeper集群服务的类,如下
这个类同时使用同一个zoocfg配置文件来启动Zookeeper服务。
在每台机器上启动Zookeeper服务的时候判断当前机器是不是定义在zoocfg文件里,如果是获取其中的ID号,然后生成myid文件并将ID写入其中。
最后启动Zookeeper服务。
[java] view plain copy print
package myzookeeperstudyserver;
import orgapachecommonsioFileUtils;
import orgapachezookeeperserverServerConfig;
import orgapachezookeeperserverZooKeeperServerMain;
import orgapachezookeeperserverquorumQuorumPeerConfig;
import javaioFile;
import javaioInputStream;
import javanetInetAddress;
import javautilProperties;
import javautilregexMatcher;
import javautilregexPattern;
public class ClusteredZKServer {
public static void main(String[] args) throws Exception {
InputStream is = ClusteredZKServerclassgetResourceAsStream("/my/zookeeperstudy/server/zoocfg");
Properties props = new Properties();
try {
propsload(is);
} finally {
isclose();
}
for (String key : propsstringPropertyNames()) {
Pattern pKey = Patterncompile("^server\\(\\d)");
Pattern pValue = Patterncompile("([\\w|]):\\d:\\d");
Matcher mKey = pKeymatcher(key);
Matcher mValue = pValuematcher(propsgetProperty(key));
if (mKeyfind() && mValuefind()) {
String id = mKeygroup(1);
String host = mValuegroup(1);
String thisHostName = InetAddressgetLocalHost()getHostName();
String thisHostAddress = InetAddressgetLocalHost()getHostAddress();
if (hostequals(thisHostName) || hostequals(thisHostAddress)) {
//Systemoutprintln(new File(propsgetProperty("dataDir"), "myid")getAbsolutePath());
FileUtilswrite(new File(propsgetProperty("dataDir"), "myid"), id);
QuorumPeerConfig quorumConfig = new QuorumPeerConfig();
quorumConfigparseProperties(props);
final ZooKeeperServerMain zkServer = new ZooKeeperServerMain();
final ServerConfig config = new ServerConfig();
configreadFrom(quorumConfig);
zkServerrunFromConfig(config);
}
}
}
}
}
客户端测试代码如下,这里可以修改hostname为集群中的任意一台机器
[java] view plain copy print
package myzookeeperstudyserver;
import orgapachezookeeper;
import javautilList;
public class Client {
public static void main(String[] args) throws Exception {
ZooKeeper zk = new ZooKeeper("fanbinx1:2181,fanbinx2:2181,fanbinx3:2181", 10000,
new Watcher() {
public void process(WatchedEvent event) {
Systemoutprintln("event: " + eventgetType());
}
});
Systemoutprintln(zkgetState());
zkcreate("/myApps", "myAppsData"getBytes(), ZooDefsIdsOPEN_ACL_UNSAFE, CreateModePERSISTENT);
zkcreate("/myApps/App1", "App1Data"getBytes(), ZooDefsIdsOPEN_ACL_UNSAFE, CreateModePERSISTENT);
zkcreate("/myApps/App2", "App2Data"getBytes(), ZooDefsIdsOPEN_ACL_UNSAFE, CreateModePERSISTENT);
zkcreate("/myApps/App3", ""getBytes(), ZooDefsIdsOPEN_ACL_UNSAFE, CreateModePERSISTENT);
zksetData("/myApps/App3","App3Data"getBytes(), -1);
Systemoutprintln(zkexists("/myApps", true));
Systemoutprintln(new String(zkgetData("/myApps", true, null)));
List<String> children = zkgetChildren("/myApps", true);
for (String child : children) {
Systemoutprintln(new String(zkgetData("/myApps/" + child, true, null)));
zkdelete("/myApps/" + child,-1);
}
zkdelete("/myApps",-1);
zkclose();
}
}
测试
在集群中的各个机器上分别运行ClusteredZKServer类来启动Zookeeper服务。
然后在任意一台机器上运行Client类来连接Zookeeper并操作数据。
正确的做法就是不要考虑集群,你的程序应该只关注于分析自己所属服务器的日志。以后需要集群的时候就服务器各自独立分析。如果数据需要合并,则应该是由你的持久层,而不是程序来完成,比如使用同一个数据库或者是分布式的数据库。
DB存成什么格式应该是按照现有需求来。本身日志记录在文件里也是一种持久化,数据库只是多了数据管理的功能,所以本质上原始数据已经都记录下来了。之所以记录在文件里本身是考虑到数据库存储的效率问题,分析之后存储在数据库里也是为了查询能够更方便。所以如果不是很明朗,就不要去推测以后这些数据能干什么的,这种推测几乎是没有意义的。记录在数据库里的数据应该体现成现有需求里的数据,待到以后有新需求,在程序中加入新的分析功能也不是很麻烦。
Java是IT领域的常青树做为一门编程语言,Java的应用场景广泛,决定了其在实际当中有着很多的应用。而且,涉及的到各类IT项目的开发,注定少不了Java相关的开发人员。目前,因为Java行业的从业者过多,竞争十分激烈,且Java开发在3/4线城市就业薪资并不高,一二线城市的就业薪资也在不断的降低,当然,企业对于Java从业者的要求也在不断的提高。
大数据行业人才稀缺作为一个新兴的行业,大数据领域内的人才非常的稀缺,据相关数据显示,未来几年内大数据人才的需求量将达到200万左右,这就决定了未来大数据的人才必定非常的抢手。大数据行业的薪资水平大数据行业的薪资如今已经开始向IT领域的Top1进军,整个行业的平均薪资已经达到了17k左右,而且,随着大数据应用场景的不断增多,未来大数据创造的价值将会越来越大,与之对应的大数据人才的薪资水平将会再次登上一个新的台阶。大数据行业的未来大数据作为一个新兴的大数据行业,其发展前景非常的巨大,而且,其不仅仅是在与AI、云计算对接的很紧密,与其他工业、农业、商业,甚至是第三产业、智慧城市的规划等都有着深刻的对接,而这,就必将会给从业者带来更多的就业机会。
大数据和Java的区别:1架构层面:
javaee:三层架构 表现层(web)业务层(service)持久层(dao)
大数据:围绕数据 数据采集 --数据存储–数据计算(分析)–数据展示
2技术层面:
javaee:成熟 解决方案多 技术点集中
大数据:相对年轻 迭代更新快 解决方案相对少 技术相当繁琐 杂 /碎
3开发层面:
javaee:代码量很大 偏向业务 运维等任务较少 固定搭配 习惯用法较多
大数据:代码量很少,偏向技术(原理和知识) 运维任务略多(集群服务器等)sql 数据分析 类sql hql
4市场层面:
javaee:很成熟 有自己的行业规范 如日中天
大数据:市场起步阶段 规范有待健全 朝阳产业(结合人工智能和机器学习等)
Java8种值得学习优秀技能
1 Git
Git 是 Java 开发人员需要掌握的基础工具之一,每一位 Java 从业者都应该学会用它。Git 使用一套版本控制系统来管理各种项目集合。这是一个完全免费的开源系统,专注干非线性工作流、完整性和速度。分布式扩展:存储库可用来创建开发历史的副本。链接方法: Git 具有基于工具箱的设计,可提供定义明确的模型。
基干工具箱的设计:基于工具箱的设计可减少复合组件。
分布式扩展: 存储库可用来创建开发历史的副本。链接方法:Git 具有基于工具箱的设计,可提供定义明确的模型。
基干工具箱的设计:基于工具箱的设计可减少复合组件。
2Selenium
Java 中的 Selenium Web 驱动程序是 Java 开发人员在 2021 年应该了解的重要技术之一。
Selenium 提供了使用测试框架测试 Web 应用程序的一组工具; Selenium Web 驱动提供了一个开源API。它包括了用于 Web 应用程序的一些自动化特性。Selenium 的关键元素包括:
IDE(集成开发环境)
远程控制 /Selenium10
Web 控制器 /Selenium20/30
Selenium网格
3Jenkins
Jenkins 是源自 JAVA 编程的技术,其开源自动化的持续交付和集成可以自动化软件开发流程,支持多种版本控制工具。
Jenkins的插件可与另一种语言编写的代码集成。以下是你应该选择 Jenkins 的三大原因: 它提供了比其他软件更好的质量;其自动化系统可以管理集成;Jenkins的开发速度要快得多。
4用户友好的 Web 服务
REST 的全称是Representative Translation ofState(表述性状态转移),它代表了一种架构风格,是Java 开发人员必须掌握的知识。它提升了 Web 服务性能,还定义了可伸缩性和性能约束。这是 2022年Java 开发人员最理想的选项之一。
它的可重建 API用于 Web 服务开发中的通信需求。如果你了解 HTML、CSS 等,那么你将从RESTfulWeb 服务中获益匪浅。以下是 RESTful 服务的特性:
基干客户端 - 服务器的架构提供了服务器的管理、部署和托管等特性,还可以帮助用户使用服务和资源。它本质上是一种共享资源的共享计算模型。
5 Spring security
它的主要功能是应用程序身份验证。其 J2EE servlet规范和 EJB规范是JAVA 开发人员常用的两个关键安全特性。
Spring Security 支持多种身份验证模型,并与HTTP、Kerberos、JOSSO、CAS、LDAP 等技术集成。Spring Security 与 Java 深度关联,强烈建议Java 开发人员学习它。
6SpringBoot2
Spring Boot 发布了一个名为 Spring Boot 2的新版本。其中 Spring 框架负责控制,Spring Boot 负责生成具有常规配置的独立解决方案。
它主要依赖JAVA Baseline、BOM 材质和 cradle插件,其自动配置可提供安全性和响应性。它还提供了技术支持并改善了开发体验。它是 JAVA 程序员应了解的基本工具之一,其关键特性包括:
直接部署 Undertow、Jetty 或 Tomcat
减少构建配置,提供依赖项
在 Spring 中创建独立的应用程序
7Angular 或响应式 JS
ReactJS 是一个专门用于 UI开发的 JavaScript库,而 Angular 是一个框架。JAVA 开发人员应该很熟悉这两大关键技术了。微信搜索readdot,关注后回复编程资源,领取各种经典学习资料
Angular 2是开源 We 应用程序框架,Angular 的主要特性包括指令、范围、模板、注解、高级依赖项注入和子路由器: ReactJS 用于开发移动应用程序。ReactJS的主要特性包括与服务器的免费开源侧通信功能等。
8ApacheSpark 和 Kafka
Apache Spark 和 Kafka 是2021年Java开发人员一定要掌握的两项技术;它们在 2018 年底已发布稳定版本。Apache Spark 是用于集群计算的框架已开源。
Spark 提供了用于执行基本 1/0、调度和分派等任务的应用程序接口,并提供了同样开源的流处理平台。特别要提的是 Apache Kafka 代码是 Java 和 Scala 编写的。
Kafka 可以使用一些基本 API,例如 Producer APIConsumer APl、Connector API 和 Stream APl。
public class Cnn { / 静态连接数据库函数 @return Connection / public static Connection getConn() { // String dbDriver="sunjdbcodbcJdbcOdbcDriver"; // String url="jdbc:odbc:driver={Microsoft Access Driver (mdb)};DBQ=JICQ2006mdb"; // String user=""; // String password=""; String dbDriver="commicrosoftjdbcsqlserverSQLServerDriver"; String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=chat"; String user="yong"; String password="yong"; Connection con=null; try { ClassforName(dbDriver)newInstance(); con=DriverManagergetConnection(url,user,password); } catch(Exception ex) { exprintStackTrace(); } return con; } }
以Tomcat6 jre6 Ubuntu为例
第一、集群中所有的服务器要时间同步
不同组内服务器的时间差不但影响session过期判断,时间差过大时,根本就无法建立集群。Linux下同步时间通常采用ntp协议。可以在每个服务器上增加自动运行脚本文件,每天时间服务器自动同步,如/etc/crondaily下增加脚本,内容为
Sh代码
/usr/sbin/ntpdate -s timenistgov
第二、修改需要同步的应用web应用的配置文件webxml,增加应用的分步标识,即在web-app结点下增加:
Xml代码
<distributable/>
第三、为实现会话自动在组内服务器迁移,所有放在session里的对象都要实现javaioSerializable接口
第四、打开tomcat下serverxml的注释,这是一种最简单的集群配置方式,适合组内服务器数量不多的情况(少于10台)
Xml代码
<Cluster className="orgapachecatalinahatcpSimpleTcpCluster"/>
第五、各台服务器上,通过javanetInetAddressgetLocalHost()getHostAddress()一定能够获得非127001的ip地址,用来收听集群消息。
可用以下代码进行测试
Java代码
public class test {
public static void main(String[] args) throws Exception {
Systemoutprintln("ip:"+javanetInetAddressgetLocalHost()getHostAddress());
}
}
将上面的代码保存成testjava
在相应的机器上执行
0条评论