javaarraylist(javaarraylist<String>用法)
JAVA基础:Array 和 ArrayList 的区别?
Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。
Java数组去重复之迭代器版,这种方式是利用List数据结构的Iterator特性来遍历去重复。
这种方式,对于同时要对List做其他操作时很有用。很简单易懂,可以不断取下一项。
1、将数组转为List
2、建立一个新List,用来存储去重后的结果
3、通过迭代器遍历List,逐项往新List添加
4、通过List 的contains方法检查新List是否已经包含了该项
5、如果不存在则追加到新List中
6、最后将新List按照数组返回
不同的方式锻炼不同的思维,基本上我把所有可能的方式都穷尽了。
这是第15种,前面14种可以从主页逐个查看,后面还有几种方式。敬请关注。[心]
#编程# #java# #算法# #编程真的能改变人的思维方式吗#
Java面试整理的一份详细的资料让你跟面试官有得"撩骚"
技术面试中的几个注意点
1 面试时,你熟悉的问题要和面试官多聊,不要为了回答问题而回答问题
2 一个问题的沟通时间最好能多聊一会儿,简单问题说3/5分钟,如果问题的规模比较大,10分钟左右也是可以的
3 回答问题时不要为了凑时间而凑时间,聊的内容一定要和问的问题相关,知识点可以连续的引入
4 了解的东西多聊,不了解的少说
5 对于知识可以有一些自己的见解,自己的想法,清晰表述出来,虽然自己的看法有时候不会特别的恰当
面试场景的基础面试点
集合类是怎么解决高并发中的问题?
思路 先说一下那些是非安全
普通的安全的集合类
JUC中高并发的集合类
线程非安全的集合类 ArrayList LinkedList HashSet TreeSet HashMap TreeMap 实际开发中我们自己用这样的集合最多,因为一般我们自己写的业务代码中,不太涉及到多线程共享同一个集合的问题
线程安全的集合类 Vector HashTable 虽然效率没有JUC中的高性能集合高,但是也能够适应大部分环境
高性能线程安全的集合类
1.ConcurrentHashMap
2.ConcurrentHashMap和HashTable的区别
3.ConcurrentHashMap线程安全的具体实现方式/底层具体实现
4.说说CopyOnWriteArrayList
ConcurrentHashMap 介绍
java5.0在juc包中提供了大量支持并发的容器类,采用“锁分段”机制, Concurrentlevel分段级别,默认16,就是有16个段(segment),每个段默认又有16个哈希表(table),每个又有链表连着
在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争。
JDK1.8的时候ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(log(N)))
synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。
ConcurrentSkipListMap是线程安全的有序的哈希表(相当于线程安全的TreeMap); 它继承于AbstractMap类,并且实现ConcurrentNavigableMap接口。ConcurrentSkipListMap是通过“跳表”来实现的,
ConcurrentSkipListSet是线程安全的有序的集合(相当于线程安全的TreeSet);它继承于AbstractSet,并实现了NavigableSet接口。ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,它也支持并发。
CopyOnWriteArraySet addIfAbsent和 CopyOnWriteArrayList(写入并复制)也是juc里面的,它解决了并发修改异常,每当有写入的时候,就在底层重新复制一个新容器写入,最后把新容器的引用地址赋给旧的容器,在别人写入的时候,其他线程读数据,依然是旧容器的线程。这样是开销很大的,所以不适合频繁写入的操作。适合并发迭代操作多的场景。只能保证数据的最终一致性
我有一个前端同学,工作5年,现在分不清list,array,map,set,stack还有queue的区别,她说月薪2w+,这个可信吗? #程序员#程序员#
开发1到3年JAVA面试总结
java 基础
java数据类型
谈一谈 “==” 跟 “equals” 的区别
jvm 的性能调优(三年以上的工作经历问的比较多)最好多掌握
集合是个重灾区: 回答的好,基本面试官会觉得你的基础怎么样的 天平
arrayList LinkedList Vector 的区别 底层问的多
红叉树数据结构考试题出的多
Set
hashset 跟 treeset
treeset 两种实现排序的底层方法
Map 问的是最多的
HashMap HashTable 区别 HashMap 的底层实现原理
ConcurrentHashMap 的实现原理
HashMap 跟 ConcurrentHashMap 底层问的偏多
TreeMap LinkedHashMap HashMap 的区别
java 中的线程问题
synchronized 跟 volatile 区别
实现创建新线程的方法 3种 有返回值实现方式好处
面试官喜欢问你 有没有用过线程池,有没有设计过线程池方面的代码
三年以上工作经历 常见的设计模式(多说设计模式种类) 最好能说出我们的spring、 tomcat中底层的一些实现那些功能 用到哪几种设计模式(bean 的注入跟管理)
spring中的两大核心 依赖注入aop 跟 控制反转 ioc 需要仔细琢磨透
springmvc 跟 struts2.0 区别
mybatis 跟 hibernate、 jdbc 的区别 优缺点
springmvc 的流程 一个请求request请求, 经历了那些 ; 最好能画出 springmvc的流程图
我们都知道spring 是单利 如果实现多利; 怎么做?
spring中问的东西 对你的面试效果权重很高;
applicationContext通常实现什么
bean工厂
spring 那些注解 需要掌握
spring事务管理机制
spring底层原理 需要掌握;3年以上
动态代理 跟 继承jdk 两种实现 最好能写其中一种动态代理的代码。
java IO 跟NIO的区别 我面试过程没有遇到过, 可以相应的了解
java8的新特性 需要掌握
mysql的存储过程
sql 语句
分页问的特别多; mysql orcle也要知道
sql底层些东西 最好了解
一般面试官会问你 简单的介绍下 redis
对redis的很熟悉面试官 基本会问这些
redis的存储策略
redis的集中数据类型 (需要很熟)
redis的容灾机制
redis的有个map 数据类型 key 是否可以是任意类型 还有它的长度有无限制
redis在业务上 可以实现那些功能 不单单是 作为非关系型数据库的作用 还有其他作用;可以响应 的去了解
redis的基本操作命令 设置过期时间 expir等
redis 问的频率很高; 需要多了解
电商方面问题(由于我写了电商项目)
dubbo+zookeeper(zookeeper最少三台因为它有投票机制) 面试官当时问我这个电商项目用到几台
zookeeper ;都是奇数;最少3台
dubbo + zookeeper的底层能掌握多少; 就看你自己了
单点登入
session共享
js跨域问题
静态缓存的问题; 你们项目是怎么很好的解决静态资源缓存问题
solr全文检索问到过一次
两点一线 得需要知道是什么
cookie 跟 session的区别
cookie 的值 在网页中的请求头 请求体 还是 在哪儿
nginx 问的不多 我们了解足够应付过去(nginx这个东西实在是太优秀了)
运维方面上的就是 linux一些操作命令 设置权限等
#35岁码农#
我相信大部分人都遇见过这么一个场景:
有些表的数据随着时间的推移,数据越积越多,而且老的数据压根就没用了,这个时候你就会考虑删除过期的数据,比如我只保留半年的数据即可。
对于后端的同学,就开始写个定时任务,可以每天大半夜去执行删除动作。
在实际经验中,我发现大家的思路也是非常广泛的,最粗鲁的应该算是:
delete from tableName where dateCreated < "2022-01-01 00:00:00";
把某一天前的数据直接删除。
咋一看,没什么大毛病,能满足实际需求。
仔细一分析,问题还是很多的。
当做删除的时候,会锁表。
如果数据量大,直接删除,必然会影响业务的开展。
那么如何优雅地删除过期数据而不会影响业务呢?(MySQL 主键id是自增长的)
以下是我觉得比较优雅的删除过期数据的代码:
public int removeData(Date endDate) {
int totalCount = 0;
int startId = 0;
int max = 200;
List<TableBean> allTableBeans = new ArrayList<TableBean>();
while(true) {
List<TableBean> temp = tableBeanMapper.getBean(endDate, startId, max);
if(CollectionUtils.isEmpty(temp)) {
break;
}
for(TableBean tableBean : temp) {
int id = tableBean.getId();
if(maxId < id) {
maxId = id;
}
allTableBeans.add(tableBean);
}
if(allTableBeans.size() >= 2000) {
totalCount += removeData(allTableBeans);
allTableBeans.clear();
}
}
if(allTableBeans.size() > 0) {
totalCount += removeData(allTableBeans);
allTableBeans.clear();
}
return totalCount;
}
private int removeData(List<TableBean> tableBeans) {
int totalCount = 0;
for(TableBean tableBean : temp) {
int id = tableBean.getId();
if(tableBeanMapper.removeById(id)) {
totalCount++;
}
}
return totalCount;
}
备注:
1)tableBeanMapper.getBean(endDate, startId, max);
select id, xx, dateCreated from tableBean where dateCreated < #{endDate} and id > #{startId} order by id asc limit 0, max;
2)ableBeanMapper.removeById(id);
delete from tableBean where id = #{id};
如果你有更好的方案,不妨拿出来讨论讨论。
一起讨论一起研究一起进步!
关注我,每天学一点,进步一直在。
这样的面试场景你遇到过吗?要是你是面试官,你回录用这位求职者吗?
面试官:ArrayList是不是线程安全的?
应聘者:不是。
面试官:那如何实现线程安全?
我:在ArrayList add方法上面加上关键字synchronized,需要注意的是elementData[size++]并不是一个原子操作,因为它是由elementData[size] = e;size = size + 1;两部分组成,在单线程下执行没有问题,但在多线程可能发生一个线程的值覆盖掉另外的线程添加的值。
面试官:那在多线程下该怎么办?
应聘者:可以考虑使用Collections.synchronizedList()
面试官:会不会影响到效率?
应聘者:肯定会啊!
面试官:那怎么去保证他的效率呢?
应聘者:既要保证线程安全又要保证效率,那就不能使用Collections.synchronizedList(),可以考虑写时复制容器,多线程的情况下,每一个线程进行添加的时候都会复制一个新的容器给这个线程,保证一个容器只有一个线程,这样就保证了线程安全,还不影响效率,但内存的占用会增加。
面试官:那有其它方法能够既保证线程安全又能够不占用太多内存吗?
应聘者:我……………………
@洪生鹏 用时间换空间,空间换时间思想不错,个人觉得这位应聘者技术基础还不错,可以考虑,要是你是面试官,你回录用这位求职者吗?
#职场达人说# #程序员# #职场直言#
今年29岁,出了社会7年混的一般,在三线城市月薪6500,在父母的帮助下买了房子,车是自己掏腰包买的,在去年听同学说,JAVA待遇挺不错,叫我转行JAVA,我听了他的建议,感觉程序员这行业还不错,就转行过去。
至于能不能找到,这个自己心里真的没有底,到时候,看看以前的同学是否拉一把入行,毕竟java学的人有点多。
目前我已经学习JAVA有10天,感觉java难度并不大,并非像网友说的那么难,相比我们机械行业真的太简单了。
以下就是我今天学习的内容(数据结构)
-------------------------------------------------------
泛型:它是一种类型参数,专门保存类型
没有指定泛型,默认是object类型
1.0-泛型类 public class 类名<E>{}
2.0-泛型接口:
第一种写法:确定类型
public interface 类名<E> {}
public class TINAJIA implements 类名<确定类型> {}
第二种写法:不确定类型
public class B<E> implements 类名<E>{}
3.0-泛型方法:形参类型不确定
private <T> void 参数名(T t) {}
4.0-通配符:一般通配符结合集合在参数中使用。
private 返回值 方法名(List<?> list) {}
注意:
1.0-被通配符修饰的集合,类型会变成object
2.0-这个集合不能删除,修改动作
5.0-受限泛型:在使用通配符的过程中,对泛型进行约束
泛型的下限:<? super 类型>?可以传类型的同类或者子类
ArrayList<? super Number> :?只能穿NUmber的父类或者NUmber类型
泛型的上限: <? extends 类型>:?可以传递类型的子类
ArrayList<? extends Number>:?可以传递Integer
---------------------------------------------------------------------
数据结构:
栈结构:线程运行时需要的内存空间(先进后出)
队列结构:先进先出
数组结构:
1.0-查询快:数组是连续的,可以通过索引查询该数组
2.0-增删慢:创建一个新数组,将源数组的内容复制到新数组中去,地址执行新的数组
链表结构:跟数组相反,查询慢(数组不是连续的,不能通过索引查找,效率较低),增删快(删除元素对链表没有影响)
1.0-单向链表:无序
2.0-双向链表:有序
红黑树:特点,查询效率贼高
1.0-每个节点最多有2个子节点
2.0-(每个左子节点的数据要比当前节点要小,每个右子节点要比当前节点要大)
-------------------------------------------------------------------
哈希值(hashCode):根据对象的地址算出来的值,用来判断对象加入链表/红黑树的位置。
1.0-同一个对象,哈希值是一样的
2.0-不同对象,哈希值是不一样的,需要重写equals跟hashCode方法,保证哈希值是一样的
哈希表:查询速度非常快
jdk1.7:数组+链表
jdk1.8:数组+链表/红黑树
数组:将相同的哈希值分成一组
链表/红黑树:把相同的哈希值元素连在一起。
------------------------------------------------------------------------
今天看到一段错误的代码和大家分享一下
List<Float> list = new ArrayList<Float>();
list.add(2.0f);
list.add(3.0f);
list.add(4.0f);
list.add(5.0f);
System.out.println( list.size());
// int k = 15 - list.size();
for(int i = 0; i <15 - list.size(); i++) {
list.add(8.0f);
}
for循环的时候使用了动态值导致list的add操作少了一些。大家一定注意这方面的问题哈[呲牙][呲牙]
[呲牙]
昨天面试经历
俺又躺床上了
今天早点儿
[我想静静]
受不了了啊
睡眠时间感觉太少啦
前两天每天就睡5个多小时吧
[泪奔]
今天就面试了一个候选人
[我想静静]
面试时
对方家里灯还坏掉了
[石化]
黑咕隆咚的
就跟恐怖片里面的场景似得
靠电脑屏幕照明
[偷笑]
让他简单介绍一下自己熟悉的项目
自己负责的模块
主要用spring boot➕mybatics
还涉及到了mq和多线程,jpa
他自己说的[我想静静]
我就从mybatics问起了
因为收到的信息是一年左右
所以也没有准备往深啦问
[震惊]
哪知道他个人介绍的时候竟然说是2年多快3年啦
[流泪]大意啦
问啦他有关$与#的区别
对复杂sql的处理和优化
Jpa多表查询
常用集合,hashmap,arraylist
都问的不深
[惊呆]
在他回答hashmap时
问啦他有没有递归实现过对菜单数据进行处理时
他竟然没听懂我得问题
[钱]
还是感觉很惊讶的
对java web开发流程熟悉的人竟然没有往前端返回过菜单数据[流泪]
接着问吧
开始问他多线程,实现方式有几种
你一般用哪种,有啥区别
有木有实现过异步线程
[钱]
他对异步这个是真没听懂
估计确实没做过吧
然后问他死锁是啥,
如何避免
syncronized是乐观锁还是悲观锁
[奸笑]
乐观锁是啥?悲观锁又是啥?
[红脸]
好啦不问java啦
时间已经不多啦,20多分钟过去啦
[钱]
安排的晚上6点40开始面试的
别人要么下班要么吃饭去啦
俺还得对着电脑面试别人
[红脸]
接着有问他
在mysql中,乐观锁和悲观锁又是怎么理解的?
[黑线]
对于sql优化你使用过哪些手段?
索引怎么去建?
设计表时应当注意哪些问题?
[求抱抱]
问答就到这里吧
总体他回答的还算可以
虽然有几个地方回答的不是很好吧
接下来开始写算法题
[笑]
共享我得屏幕让他把题目截下来
然后他再共享自己的屏幕
题目是力扣里面的三色球,
用012表示三种颜色,无序,原地排成有序的
然后他就开始思考啦
[捂脸]
这个环节就尴尬啦
问他的时候他始终不说话
让他说思路也不说
让他写注释也不写
最后还是给他说啦思路
[捂脸]
一直给他说数组两个下标值互换
他愣是写啦10分钟才写好!
就三行代码
[捂脸]
最后写出来了运行了2次结果都对
最后让他通过了
由领导去进行2面
[黑线]
面试时写代码感觉是真的难[捂脸]




