科学健康资讯 · 内容仅供参考,不替代专业诊疗 联系我们|疾病百科
操作系统

javaarraylist(javaarraylist<String>用法)

2023-06-06 操作系统 本文链接

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面

[黑线]

面试时写代码感觉是真的难[捂脸]

本文内容仅供健康科普参考,不能替代专业医疗诊断和治疗建议。如有身体不适,请及时就医并遵从医师指导。

相关阅读