Java基础
文章平均质量分 68
沙漠一只雕得儿得儿
沙漠一只雕,白月光与朱砂痣
展开
-
面试:List 如何根据对象的属性去重?
或使用Java8的写法:二、List中对象去重比如现在有一个 Person类:重写Person对象的方法和方法:下面对象去重的代码:List 的方法底层实现使用对象的equals方法去比较的,其实重写就好,但重写了equals最好将hashCode也重写了。我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。可以参见:下面要根据Person对象的id去重,那该怎么做呢?写一个方法吧:通过Comparator比较器,比较对象原创 2022-06-22 15:48:07 · 442 阅读 · 0 评论 -
java中for和foreach的区别
for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。foreach不可以删除/修改集合元素,而for可以foreach和for都可以修改元素里面的属性foreach会引发并发修改异常ConcurrentModificationException所以相比较下来for循环更为灵活。之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此;首先,我们一一段代码为例:遍历后结果原创 2022-06-22 15:21:44 · 2886 阅读 · 0 评论 -
面试官:Java 实现线程安全的三种方式
一个程序在运行起来的时候会转换成进程,通常含有多个线程。通常情况下,一个进程中的比较耗时的操作(如长循环、文件上传下载、网络资源获取等),往往会采用多线程来解决。比如显示生活中,银行取钱问题、火车票多个售票窗口的问题,通常会涉及到并发的问题,从而需要多线程的技术。当进程中有多个并发线程进入一个重要数据的代码块时,在修改数据的过程中,很有可能引发线程安全问题,从而造成数据异常。例如,正常逻辑下,同一个编号的火车票只能售出一次,却由于线程安全问题而被多次售出,从而引起实际业务异常。现在我们就以售票问题来演示线程原创 2022-06-22 15:09:41 · 196 阅读 · 0 评论 -
java基础:IO、NIO
Java NIO、IOhttps://lrh1993.gitbooks.io/android_interview_guide/content/java/basis/java-nio.html轻松理解java中的IO与NIOhttps://zhuanlan.zhihu.com/p/27204492BIO,AIO,NIO理解:https://baijiahao.baidu.com/s?id=1666632547627347318&wfr=spider&for=pc..原创 2021-03-29 11:26:29 · 1159 阅读 · 0 评论 -
匿名内部类访问的局部变量要用final修饰原因
除了匿名内部类内部,方法和作用域内的内部类内部使用的外部变量也必须是 final 的。原因如下:内部类会自动拷贝外部变量的引用,为了避免:1. 外部方法修改引用,而导致内部类得到的引用值不一致 2.内部类修改引用,而导致外部方法的参数值在修改前和修改后不一致。于是就用 final 来让该引用不可改变。https://blog.csdn.net/tianjindong0804/article/details/81710268...原创 2021-02-07 15:55:15 · 819 阅读 · 1 评论 -
二进制和java对象的相互转换
序列化存储对象数据需要将数据需要转换成二进制:private static <T> byte[] toByteArray(T body) { ByteArrayOutputStream baos = null; ObjectOutputStream oos = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutp原创 2021-02-02 23:07:48 · 2397 阅读 · 1 评论 -
Android蓝牙连接状态检测
private void checkConnectState() { ArrayList<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>(); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); Class<BluetoothAdapter> bluetoothAdapt.原创 2020-09-11 15:06:53 · 2228 阅读 · 1 评论 -
java不同线程中的try...catch
有些人为了图方便,直接在代码引用的最外层放上一个try catch,以为可以捕获一切异常,降低崩溃率。事实上,如果try的是新开启的一个线程,那么这个线程里面出现的异常是catch不到。也就是说在A线程中new B线程,B线程中出现的crash跟A线程无关,A也catch不到。public class TheadExceptionTest { public static void main(String[] args) { try { new Thread(new Runnable()原创 2020-05-29 17:28:38 · 1554 阅读 · 1 评论 -
java父类获取子类对象、调用子类方法
1.Java中父类能调用子类的方法吗?答案:能1.1 实现方式描述(1)父类中的抽象方法让子类实现并返回(2)通过注册监听,然后通过回调接口调用子类相关方法(3)在父类中通过反射调用子类的相关方法(4)在父类中直接new子类相关对象或者通过构造函数传入子类对象,然后调用其方法(5)将子类相关方法声明为static,在父类中调用子类的static方法1.2 四种实现方式...原创 2020-01-17 14:24:39 · 30543 阅读 · 4 评论 -
Java反射基础以及扩展使用
导语反射是一种具有与Java类进行动态交互能力的一种机制,在Java和Android开发中,一般需要访问隐藏属性或者调用方法改变程序原来的逻辑时会用到,这个比较常见,由于一些原因,系统并没有开放一些接口出来,这个时候利用反射是一个有效的解决方法,这个下文会有案例去讲;另外常见的注解框架也是在运行时利用反射机制来获取的。在模块化和插件化开发中更离不开反射,离开了反射它什么也做不了。一...原创 2020-01-01 11:44:48 · 336 阅读 · 0 评论 -
java精确的乘法和除法
import java.math.BigDecimal;public class 乘除 { public static void main(String[] args) { double a = 4.123; double b = 2; System.out.println(hehe(a,b)); } private static String hehe(double a,原创 2017-01-05 21:54:49 · 6297 阅读 · 0 评论 -
理解多态--边看例子边画内存(二)
本篇开始列举几个小程序帮助理解总结的几条多态特性: (1)成员变量:编译看左边,运行看左边 (2)成员方法:编译看左边,运行看右边 (动态绑定) (3)静态方法:编译看左边,运行看左边 (4)父类引用指向子类变量,引用不能使用子类特有的属性和方法例一:package java多态;class A { public Str原创 2016-11-27 14:22:51 · 495 阅读 · 1 评论 -
面试:ThreadLoacal原理以及引起的内存泄露
threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法. 在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用. 每个t原创 2017-04-09 10:14:35 · 872 阅读 · 0 评论 -
Treeset保证元素唯一且排序的代码示例
TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。 按照实际的需求,可以对元素进行排序。并且保证唯一。怎么保证的呢? 排序:底层结构是二叉树。按照树节点进行存储和取出。 两种实现: A:自然排序(元素具备比较性) TreeSet的无参构造,要求对象所属的类实现Comparable接口。 B:比较器排序(集合具备比较性) TreeSet的带参构造,要求构原创 2017-04-05 21:02:18 · 382 阅读 · 0 评论 -
Java的各种内部类
1.内部类的基本结构class Out { private int age = 12; class In { private int age = 13; public void print() { int age = 14; System.out.println("局部变量:" + ag原创 2017-05-10 16:17:22 · 359 阅读 · 0 评论 -
多态弊端与强制类型转换
1.多态弊端 多态的弊端是不能使用子类的属性和行为。因为对成员方法访问时编译要看父类是否有该方法,否则编译无法通过,而在运行期间调用的是子类中的该方法(详见边看例子边画内存)。2.强制类型转换 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要原创 2017-05-09 18:25:19 · 1544 阅读 · 0 评论 -
i++与++i的结果分析
i++与++i结果是多少?这个问题总被提及,答案也是五花八门,今天就来总结下他们的执行过程。首先上结论,根据结论我们依次推导每段代码的执行结果:1.++在前,则先自增后推入栈;++在后,则先推入栈顶,后自增;2.如果++操作是针对同一个变量,那么不管是在前还是在后,其自增的值都会对后面的操作起到影响。代码1:public class Test{ public stati原创 2017-05-22 09:43:21 · 1996 阅读 · 1 评论 -
java解析Excel表格数据
我们使用的包为jxl.jar,可以实现从Excel文件中读取指定的行和列的值。java代码、Excel表格和jar包已经提交到Git上:https://github.com/buder-cp/base_component_learn/tree/master/get_excel_valuesExcel表格:java代码演示:1.获取表格中name列的值效果:[game_lo...原创 2018-09-18 21:03:05 · 105496 阅读 · 7 评论 -
Timer、ScheduleThreadPool区分
参考鸿阳博客:https://blog.csdn.net/lmj623565791/article/details/27109467timer是单线程任务,ScheduledExecutorService可以自定定义线程数,是并发执行的:1、Timer管理延时任务的缺陷以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗;然而Timer是存在...原创 2019-03-14 08:53:27 · 917 阅读 · 0 评论 -
面试:java基础hashcode、equal、==的区别
1.‘==’基本类型如int就直接判断值相等,引用类型判断地址值是否相等,即是否为同一个对象'=='是用来比较两个变量(基本类型和对象类型)的值是否相等的, 如果两个变量是基本类型的,那很容易,直接比较值就可以了。如果两个变量是对象类型的,那么它还是比较值,只是它比较的是这两个对象在栈中的引用(即地址)。 对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的...原创 2019-08-04 11:26:29 · 716 阅读 · 0 评论 -
java多线程的三种方式
方式一:继承Thread重写run()方法方式二:实现runnable接口,并实现run()方法方式三:实现callable接口,重写call()方法三种方式的代码如下:import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.con...原创 2019-08-05 00:24:45 · 110 阅读 · 0 评论 -
CyclicBarrier和CountDownLatch的使用
CountDownLatch:一个或者多个线程,等待其他多个线程完成某件事情之后才能执行; CyclicBarrier:多个线程互相等待,直到到达同一个同步点,再继续一起执行。对于CountDownLatch来说,重点是“一个线程(多个线程)等待”,而其他的N个线程在完成“某件事情”之后,可以终止,也可以等待。而对于CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程...原创 2019-08-26 15:04:04 · 314 阅读 · 0 评论 -
String,StringBuffer,StringBuilder的区分与应用
应用场景:如果使用少量的字符串操作,使用 (+运算符)连接字符串;如果频繁的对大量字符串进行操作,则使用1:全局变量或者需要多线程支持则使用StringBuffer;2:局部变量或者单线程不涉及线程安全则使有StringBuilder。 Java对象的引用,用来操纵内存元素。例如:String s;//创建一个String类型的引用对象的引用与对象关联——初始化,例如转载 2016-09-26 16:52:10 · 295 阅读 · 0 评论 -
理解多态--边看例子边画内存(一)
本文参考总结了某马培训机构和其他博客上面的一些例子。多态的前提: a.要有继承关系 b.要有方法重写 c.父类引用指向子类对象多态中的成员访问特点: (1)成员变量:编译看左边,运行看左边 (2)成员方法:编译看左边,运行看右边 (动态绑定) (3)静态方法:编译看左原创 2016-11-26 22:54:55 · 1831 阅读 · 1 评论 -
Java1.5语法糖的味道--增强for循环
增强for循环的实现原理是实现了Iterable接口下面我们自己写一个demo类去实现接口。package _JDK1_5新特性;import java.util.Iterator;/** * 原理 : * 任何实现了iterable接口的类,都有返回iterator的方法, * 也就是说其实增强for循环的底层是迭代器,任何实现了iterable接口的类都可以使用增强for原创 2016-11-24 23:23:09 · 460 阅读 · 0 评论 -
Java 8中HashMap冲突解决
在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。在最坏的情况下,这种方式会将HashMap的get方法的性能从O(1)降低到O(n)。为了解决在频繁冲突时hashmap性能降低的问题,Java 8中使用平衡树来替代链表存储冲突的元素。这意味着我们可以将最坏情况下的性能从O(n)提高到O(logn)。在Java 8中使用常原创 2016-10-06 16:39:36 · 13206 阅读 · 1 评论 -
JVM垃圾回收--年轻代、年老点和持久代
虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。 年轻代: 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生转载 2016-04-27 17:32:25 · 19980 阅读 · 7 评论 -
Java中的数组变量问题
数组是否必须初始化对于这个问题,关键在于要弄清楚数组变量和数组对象的差别。数组变量是存放在栈内存中的,数组对象是存放在堆内存中的。数组变量只是一个引用变量,他能够指向实际的数组对象。所谓的数组初始化并非对数组变量初始化,而是对数组对象进行初始化。public static void main(String[] args) { int [] num1 = new int[]{11,2原创 2016-10-05 11:00:20 · 1847 阅读 · 0 评论 -
快速判断整数二进制1的个数
int func(int x){int countx = 0;while(x){countx++;x = x&(x-1);}return countx;}原创 2016-09-18 16:03:18 · 505 阅读 · 0 评论 -
Java创建对象的四种方式
1.new2.clone3.newInstance4.反序列化5.String s = "abc"(这个是比较特殊的)以String类为例String sring = null; Class class1 = String.class;// 该方法最为安全可靠,程序性能更高。 Class class2 = string.getClass转载 2016-05-09 16:47:56 · 41949 阅读 · 2 评论 -
Java中List Set Map 是否有序等总结
1.Collection List Set Map 区别记忆这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否允许元素重复否Collection否是List是转载 2016-05-03 10:38:16 · 675 阅读 · 0 评论 -
Java数组复制五种方法
package 数组;import java.util.Arrays;public class 数组复制四种方法 { public static void main(String[] args) { /** * 方法一:效率最高,使用System.arraycopy(); public static void arraycopy(Object * src, int src原创 2016-11-20 11:40:05 · 628 阅读 · 0 评论 -
静态代码块、代码块、构造函数的初始化顺序
1. 单一类中:静态变量、静态块、普通变量、普通块、构造方法;2. 有继承的子类中:先父后子。子类的静态变量和静态块会插队在父类静态块的后面,以后才严格尊重父亲大人。创建顺序:1。按照顺序执行父类静态变量、静态块2。按照顺序执行子类静态变量、静态块3。构造父类:按照顺序执行父类的普通变量、普通块执行父类的构造函数4。构造子类:按照顺序执行原创 2016-10-08 09:13:24 · 323 阅读 · 0 评论 -
Java中的异常学习
如下程序会输出什么结果:package 异常部分;public class Test { public static void main(String[] args) { Demo d = new Demo(); System.out.println(d.method()); }}class Demo { public int method() { int x =原创 2016-10-07 16:48:20 · 302 阅读 · 0 评论