首页编程java编程java数组去重(java数组用for循环去重)

java数组去重(java数组用for循环去重)

编程之家2026-05-28882次浏览

老铁们,大家好,相信还有很多朋友对于java数组去重和java数组用for循环去重的相关问题不太懂,没关系,今天就由我来为大家分享分享java数组去重以及java数组用for循环去重的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

java数组去重(java数组用for循环去重)

Java实现热加载的三种方式

基于java agent方式新建一个maven工程

publicstaticvoidpremain(StringagentArgs,Instrumentationinst){Trace.info("HotAgent-premain-start");Trace.info("isReadefineClassesSupported:"+inst.isRedefineClassesSupported());newReloader(inst).reload();}publicstaticvoidagentmain(StringagentArgs,Instrumentationinst){premain(agentArgs,inst);}

再pom中增加一下

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><configuration><archive><manifestEntries><Can-Redefine-Classes>true</Can-Redefine-Classes><Premain-Class>com.reload.HotAgent</Premain-Class><Agent-Class>com.reload.HotAgent</Agent-Class></manifestEntries></archive></configuration></plugin></plugins></build>

核心代码如下\主要是利用JDK中Instrument的redefine方法去重定义class,去重新加载了Class.

for(ClassDefinitionWraprWrap:redefineClassWrap){Trace.info("redefineclass"+rWrap.getClassname());inst.redefineClasses(newClassDefinition(rWrap.getCls(),rWrap.getBs()));result.appendMsg("热加载类:?"+rWrap.getClassname()+"成功");}

java数组去重(java数组用for循环去重)

基于Classloader方式热加载就是利用新建自定义Classloader去加载Class,让后利用Thread的contexClassloader去替换老的classloader加载的class,这样就能实现热加载。以下是demo的代码:

TestClassLoadertestClassLoader=newTestClassLoader();System.out.println("parentclassloader:"+testClassLoader.getParent());Thread.currentThread().setContextClassLoader(testClassLoader);Classclazz=testClassLoader.loadClass("com.plugin.AutoReload");System.out.println(clazz.hashCode());System.out.println(clazz.getClassLoader());System.out.println(testClassLoader);TestClassLoadernewClassLoader=newTestClassLoader(Thread.currentThread().getContextClassLoader());Thread.currentThread().setContextClassLoader(newClassLoader);System.out.println(newClassLoader);Classclazz1=newClassLoader.loadClass("com.plugin.AutoReload");System.out.println(clazz1.hashCode());System.out.println(clazz1.getClassLoader());

自定义Classloader的示例代码:

publicclassTestClassLoaderextendsClassLoader{publicTestClassLoader(ClassLoaderparent){super(parent);}publicTestClassLoader(){}@OverridepublicClass<?>loadClass(Stringname)throwsClassNotFoundException{Classc=null;synchronized(getClassLoadingLock(name)){if(c==null){try{ClassLoaderparent=getParent();if(parent!=null){c=parent.loadClass(name);}}catch(ClassNotFoundExceptione){//ClassNotFoundExceptionthrownifclassnotfound//fromthenon-nullparentclassloader}}if(c!=null){returnc;}byte[]bytes=loadclassData(name);System.out.println("====="+name);if(bytes!=null){returndefineClass(name,bytes,0,bytes.length);}}thrownewClassNotFoundException(name);}privatebyte[]loadclassData(StringclassName){returngetContent(getResourceStream(className));}privateInputStreamgetResourceStream(StringtoLoadClassName){System.out.println("loadclassname"+toLoadClassName);try{JarFilejar=newJarFile(Constants.WATCH_PACKAGE+File.separator+"plugin-1.0-SNAPSHOT.jar");//包名Enumeration<JarEntry>entry=jar.entries();JarEntryjarEntry;Stringname;StringclassName;Classclazz=null;while(entry.hasMoreElements()){jarEntry=entry.nextElement();name=jarEntry.getName();if(name.startsWith("/")){name=name.substring(1);}if(jarEntry.isDirectory()||!name.endsWith(".class")){continue;}//去掉.classclassName=name.substring(0,name.length()-6).replace("/",".");System.out.println(className);if(className.equals(toLoadClassName)){returnjar.getInputStream(jarEntry);}}}catch(IOExceptione){e.printStackTrace();}returnnull;}publicbyte[]getContent(InputStreaminputStream){//读取Class文件呢ByteArrayOutputStreambyteSt=newByteArrayOutputStream();//写入byteStreamintlen=0;try(InputStreamin=inputStream){while((len=in.read())!=-1){byteSt.write(len);}}catch(IOExceptione){e.printStackTrace();}//转换为数组returnbyteSt.toByteArray();}}

基于groovy方式基于Groovy方式,就是利用GroovyClassLoader的重新加载脚本,重新生成一个Class,GroovyClassLoader每次调用parseClass都是新城一个新的Class,这样就能实现Class的热加载.

StringscriptContent="packagecom.reload

java数组去重(java数组用for循环去重)

"+"

"+"importorg.springframework.beans.factory.annotation.Autowired

"+"

"+"classHello{

"+"

"+"@Autowired

"+"HelloServiceservice;

"+"

"+"HelloServicegetService(){

"+"returnservice

"+"}

"+"

"+"defrun(){

"+"print(service.hello())

"+"}

"+"}";GroovyClassLoadergroovyClassLoader=newGroovyClassLoader();Classclazz=null;for(inti=0;i<3;i++){clazz=groovyClassLoader.parseClass(scriptContent);System.out.println(clazz.hashCode());}AnnotationConfigApplicationContextannotationConfigApplicationContext=newAnnotationConfigApplicationContext("com.reload");BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(clazz);BeanDefinitionbeanDefinition=beanDefinitionBuilder.getRawBeanDefinition();((DefaultListableBeanFactory)annotationConfigApplicationContext.getBeanFactory()).registerBeanDefinition("hello",beanDefinition);//annotationConfigApplicationContext.getAutowireCapableBeanFactory().applyBeanPostProcessorsAfterInitialization(beanDefinition,"hello");GroovyObjectobject=(GroovyObject)annotationConfigApplicationContext.getBean("hello");object.invokeMethod("run",null);

总结本文主要介绍了三种实现JAVA中Class的热加载的三种方式:

基于java agent方式,只能实现class的增加、修改、删除方法和属性等,不能实现Class的新增,

基于Classloader方式,可以实现class的增加、修改、删除方法和属性等,可以实现Class的新增,

基于Groovy方式,可以实现class的增加、修改、删除方法和属性等,可以实现Class的新增,

java去公司工作用到的是哪方面的知识

小公司做小项目一般都用SSH+jsp大公司做项目都是根据不同的项目采取不同的框架技术,比如银行大部分都用 EJB等

第一:先学习Java的核心库(JavaSE)

JavaSE的内容包括:环境搭建、基础语法、面向对象、数组、集合、常用类、IO流、反射机制、网络编程……..

第二:MySQL数据库

搞定一门数据库相关的课程,例如:MySQL、Oracle,搞定一个就可以了,目前互联网公司,例如:京东、阿里等,他们都在使用MySQL,所以建议大家学习MySQL数据库,小巧轻盈,免费,由于互联网公司的项目访问量比较大,所以一般会搭建数据库的集群,可以一个数据库不够,所以需要搭建数据库集群,为了应付高并发。(搭建的比较多的时候,免费就很重要了。)

第三:WEB前端

以后从事Java开发,从事JavaEE开发,主要开发的系统结构是B/S结构的,B指的是Browser,S指的是Server。要开发这种系统,B端要会,S端也要精通。WEB前端的学习就是学习B端技术。包括:HTML、CSS、JavaScript(JS)、jQuery框架(底层对JS进行了封装)…

第四:WEB后端(JavaWEB)

WEB后端其实可以是很多种不同的编程语言,例如:PHP、C、C++、Java,他们都可以进行WEB后端的开发,我们既然选择了比较火爆的Java,那么我们学习的后端一定是基于Java语言实现的,包括:Servlet、Filter、Jsp、EL、JSTL、MVC架构模式、数据库连接池(阿里巴巴的Druid连接池)、代理模式(动态代理)。另外后端学习了之后,还要学习一个异步编程技术AJAX。(完成网页的局部刷新,AJAX其实不属于后端,是前端浏览器上的程序。)

学习到这里为止,表示Java基本/基础的技术已经学完了。但是这些最基层的技术在实际的开发中不会使用的,一般为了开发效率,都会使用大量的提前封装好的框架。

第五:最好能够停留下来,做一个项目。

这个项目最好能将之前所学全部串起来。(对以前的知识点进行巩固。)

这个项目最好是基于:Servlet+ Jsp+AJAX+jQuery+MySQL….

在这个项目的开发过程中:大家一定要记住,目前比较好的项目自动构建工具:Maven是一定要精通的。还有一个就是团队协作开发:Git/SVN是一定要会用的。(目前使用Git比较多一些。)

第六:学习高级框架

Spring、SpringMVC、MyBatis(持久层框架,这个框架互联网公司使用比较多,因为互联网项目需要进行SQL优化,MyBatis的SQL优化很方便,所以大部分都是使用MyBatis)

Struts2(很少使用了,使用这个的肯定是很老的项目)、Hibernate(传统企业,还有政府等可能会使用Hibernate。)

SpringBoot(新项目大部分使用的都是boot了。所以在项目中遇到还在使用SSM的一般都是遗留项目。)

当你走到这里之后,基本上你可以出山了。(去找工作,8K的薪资应该问题不大,但前提是你学的好。学习的深度够了,广度够了。)

第七:最好能有一个大型项目是使用框架来完成的。

SpringBoot做一个项目。

Spring SpringMVC MyBatis做一个项目。

这个项目最好是找几个人搭伙做一下。体验一下团队协作。(尤其是使用一些协作的工具。怎么沟通,怎么写日报,怎么开会,怎么使用Git,等等….)

第八:如果你的薪资想达到15K的话,你可能需要还要学习一些分布式相关的一些技术。

能够应付高并发的一些技术,例如:分布式框架Dubbo、SpringCloud、MQ、Nginx、Redis…..

java的知识体系构架

....祝工作顺心哈哈

Java8 流操作

Java 8中的流(Stream)操作提供了一种高效且声明式的数据处理方式,支持链式调用和并行处理。以下是核心内容的分类总结与用法详解:

一、Stream操作分类

无状态操作:元素处理独立,如filter、map。有状态操作:需所有元素参与,如distinct、sorted。非短路操作:必须处理全部元素,如count、sum。短路操作:满足条件即终止,如findFirst、anyMatch。二、Stream创建方式通过集合创建List<String> list= new ArrayList<>();Stream<String> stream= list.stream();通过数组创建String[] array= new String[5];Stream<String> stream= Arrays.stream(array);通过静态方法创建Stream<Integer> stream1= Stream.of(1, 2, 3);Stream<Integer> stream2= Stream.iterate(0, x-> x+ 1).limit(3);Stream<Double> stream3= Stream.generate(Math::random).limit(4);三、中间操作(Intermediate Operations)中间操作返回新流,支持链式调用,分为以下类型:

1.筛选与切片filter:条件过滤list.stream().filter(x-> x.getYear()> 10)//保留年份>10的元素distinct:基于hashCode和equals去重list.stream().distinct()//对象去重skip(n):跳过前n个元素limit(n):取前n个元素list.stream().skip(2)//跳过前2条.limit(3);//取接下来的3条(实现分页)2.映射map:一对一转换List<String[]> mapResult= list.stream().map(x-> x.split(""))//字符串拆分为字符数组.collect(Collectors.toList());flatMap:一对多转换(合并嵌套流)List<String> flatMapResult= list.stream().flatMap(x-> Arrays.stream(x.split("")))//拆分后合并为单个流.collect(Collectors.toList());3.排序自然排序:元素需实现Comparable接口list.stream().sorted()//默认升序定制排序:通过Comparator指定规则list.stream().sorted((a, b)-> b.getAge()- a.getAge())//降序4.窥视(调试用)peek:对元素执行操作但不改变流list.stream().peek(x-> System.out.println(x.getName()))//打印每个元素的名字四、终止操作(Terminal Operations)终止操作触发实际计算,返回非流结果或副作用:

1.匹配与查找anyMatch:至少一个元素匹配条件boolean hasMatch= list.stream().anyMatch(x-> x.getId()> 1);findFirst:返回第一个元素(适合并行流)findAny:返回任意元素(性能更高)2.聚合计算count:统计元素数量long count= list.stream().filter(x-> x.getAge()> 3).count();max/min:求最值Integer maxAge= list.stream().mapToInt(Student::getAge).max().orElse(0);sum/average:求和与平均值Double avgAge= list.stream().collect(Collectors.averagingDouble(Student::getAge));3.数据收集转为集合List<Integer> ageList= list.stream().map(Student::getAge).collect(Collectors.toList());Set<Integer> ageSet= list.stream().map(Student::getAge).collect(Collectors.toSet());字符串拼接String result= list.stream().map(Student::getName).collect(Collectors.joining(",","(",")"));//输出:(aa,bb,cc)4.分组与分区groupingBy:按字段分组Map<Integer, List<Student>> ageMap= list.stream().collect(Collectors.groupingBy(Student::getAge));多重分组Map<Integer, Map<Integer, List<Student>>> sexAgeMap= list.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.groupingBy(Student::getAge)));partitioningBy:按条件分区Map<Boolean, List<Student>> partMap= list.stream().collect(Collectors.partitioningBy(x-> x.getAge()> 10));5.归并操作reduce:自定义聚合逻辑BigDecimal sumMoney= list.stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);//求和BigDecimal product= list.stream().map(Student::getMoney).reduce(BigDecimal.ONE,(x, y)-> x.multiply(y));//求积五、完整代码示例@Data@AllArgsConstructorclass Student{ private String name; private Integer age; private Integer sex; private BigDecimal money;}public class StreamDemo{ public static void main(String[] args){ Student s1= new Student("aa", 10, 1, new BigDecimal("1000")); Student s2= new Student("bb", 20, 1, new BigDecimal("2000")); List<Student> list= Arrays.asList(s1, s2);//聚合操作示例 long count= list.stream().filter(x-> x.getAge()> 3).count(); BigDecimal sumMoney= list.stream().map(Student::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);//分组示例 Map<Integer, List<Student>> ageMap= list.stream().collect(Collectors.groupingBy(Student::getAge));}}关键点总结链式调用:中间操作与终止操作组合使用,代码简洁。延迟执行:终止操作触发计算,中间操作仅记录操作步骤。并行流:通过parallelStream()提升大数据量处理性能。不可变性:流操作不修改源数据,返回新流或结果。通过合理组合这些操作,可以高效实现复杂的数据处理逻辑。

如果你还想了解更多这方面的信息,记得收藏关注本站。

ai图文小助手 怎么和vivo手机小助手聊天php开源论坛源码,iapp源码