Java高级
懵逼是一种状态
坚持把学习点滴记录
展开
-
反射的初步理解
首先从基本的Class类对象的调用代码来初步理解,可以知道的是,在反射中,Person类本身也作为Class类对应着一个运行时类(运行时类是Person类编译后,生成字节码文件以".Class"结尾,然后使用javac.exe进行解释运行,使之加载到内存中)在这之后都是用clazz来进行操作,通过clazz调用操作构造器,方法,属性的方法,返回操作对象再调用具体的操作方法。@Test public void test() throws Exception { //创建反射类.原创 2022-05-22 21:07:40 · 115 阅读 · 0 评论 -
关于TreeSet集合的理解与使用
1、如何理解TreeSet集合?若向TreeSet集合中添加整型数据,再通过迭代器遍历,可以发现数据都已经进行排序,仔细可发现为中序排序,或者为小顶堆。 @Test public void test(){ TreeSet treeSet = new TreeSet(); treeSet.add(-11); treeSet.add(1); treeSet.add(16); treeSet.add(6);原创 2022-05-17 22:32:41 · 402 阅读 · 0 评论 -
Set集合(重写equals()与hashCode())的理解与使用
因为是Collection的子类,所以Set的方法使用上和Collection差异不大,可以使用Collection的所有方法。Set添加的元素是无需,不可重复的。在添加自定义对象元素时,若不重写equals()与hashCode()则会添加两个相同的对象元素。Person类(此时注释hashCode()方法):public class Person { private String name; private int age; public Person(String原创 2022-05-17 21:31:18 · 648 阅读 · 0 评论 -
关于List集合的使用
因为是Collection的子类,所以List的方法使用上和Collection差异不大,注意add()方法与addAll()方法的使用,此外,若想remove一个具体元素,比如remove元素“123”,不能写成list.remove(123);而是要通过包装类自动装箱为对象类型。@Test public void test(){ ArrayList list = new ArrayList(); list.add("tom"); list.原创 2022-05-17 16:09:50 · 534 阅读 · 0 评论 -
关于Collection接口声明中方法的使用
1、为什么要使用集合?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的变量。2、关注各种方法的使用①其中add()方法中的参数类型为Object类型,方便接受各种不同数据类型的数据。②值的注意的是contains()方法,当其中参数为自定义对象时,需要在自定义类中重写equals()方法,因为contains()方法中是通过equals()方法比较的对象内原创 2022-05-17 14:51:36 · 214 阅读 · 0 评论 -
Enum类的使用与理解
对Enum类的理解:对于一个物品或者事务而言,只有某几种特定状态,例如季节只有四种:春夏秋冬;人的性别只有两种:男和女;订单的状态:已付款与未付款。诸如此类,可以将其中的状态抽取出来使用Enum类来刻画其状态。在开发当中,以四季状态为例,这些状态的个数、状态类型从始至终都保持不变,也不需要改变,完全可以把它们看做成一个个“常量”。于是考虑设置这些状态为: public static final String SPRING = "春天"; public static final S原创 2022-05-16 16:35:37 · 154 阅读 · 0 评论 -
关于Comparable与comparator接口的使用与理解
1、什么时候考虑使用这两个接口?Java中的对象,正常情况下,只能通过== 或 != 进行比较,且此时比较的还是地址是否相同,不能使用 > 或 < 的,但是在开发场景中,我们需要对多个对象进行排序,比如一个商品中,我需要根据它的价格或者销量进行排序,这就需要比较对象的大小。此时就需要使用两个接口中的其中一个:Comparable 或 Comparator2、两者的区别Comparable接口位于java.lang包下,可以看做是定义好了后,在各种位置都普遍使用,Compa...原创 2022-05-16 15:06:09 · 500 阅读 · 0 评论 -
关于Date类及相关类的使用与理解
1、时间戳,因为将时间点刻画到毫秒级,所以数值具有很大程度上的唯一性,通常被使用在生成商品订单号上,当并发量较大时,可在时间戳上再加上特定的随机生成数,从而得到唯一的订单号。2、修改时间格式,一般通过SimpleDateFormat(时间格式)构造器实现,生成对象后,通过对象.format实现时间格式转化。3、得到一个时间点后,可以通过getTime()方法生成毫秒数,一般在时间类型转化时能用到,因为不同格式的时间设置,中间的转化桥梁需要它们共同的属性:毫秒总数。public cla..原创 2022-05-15 10:35:29 · 119 阅读 · 0 评论 -
关于String类中的类型转换一些方法
public class StringTest { //String类型转变为char类型 @Test public void test1(){ String str = "abc"; char[] chars = str.toCharArray(); for (int i = 0; i <chars.length ; i++) { System.out.println(chars[i]); .原创 2022-05-14 15:11:49 · 224 阅读 · 0 评论 -
Callable与线程池创建多线程
Callable创建多线程:实现Callable接口的方式创建多线程要比实现Runnable接口创建多线程方式更加强大。首先重写的call()方法中是可以有返回值的,其次,call()方法可以抛出异常,被外面的操作捕获到,从而获取到异常信息。最后Callable是支持泛型的。class Callabel1 implements Callable{ @Override public Object call() throws Exception { //遍历100原创 2022-05-13 11:52:03 · 530 阅读 · 0 评论 -
创建线程问题的实例
一、甲乙两人每次一千,分三次分别向同一个账号各自存入三千:思路:①提取共同数据②编写用于创建多线程对象的继承类③创建测试类,通过线程对象.start()方法创建线程其中将账号单独提取出来构建一个类,可以有效的减少账号与人之间的耦合性。账号需要编写余额属性,一个带参的构造方法(需要通过在测试类中创建账号类型的引用类型数据对象,将账号对象通过引用类型方式作为人构造器中的形参传入,从而将账号与人联系起来),以及一个存钱的方法。//构建共享数据class Account{ privat.原创 2022-05-12 17:07:37 · 179 阅读 · 0 评论 -
解决线程安全问题之Lock锁
synchronized与lock的异同:相同点:二者都可以解决线程安全问题不同点:synchronized机制为执行完相应同步代码块后,自动释放同步监视器,而lock则需要手动启动同步(使用lock()方法),并且结束同步也需要手动实现(使用unlock()方法)使用lock锁解决线程安全问题:class Windows implements Runnable { private int ticket = 100; //1、实例化ReentrantLock对象 .原创 2022-05-11 19:19:53 · 307 阅读 · 0 评论 -
线程安全之单例模式之懒汉模式
在单例模式中的懒汉模式存在一定的线程安全,通过前面的线程安全处理可以应用到此处public class BankTest { public static void main(String[] args) { Bank bank = Bank.getInstance(); System.out.println(bank.getClass()); }}class Bank{ private Bank(){} private static原创 2022-05-11 09:49:14 · 970 阅读 · 0 评论 -
关于线程安全问题(同步代码块与同步方法)
1、什么是线程安全问题?根据上篇文章中的购票代码可知,若出现重票,错票等问题,这都属于出现了线程安全问题。2、出现线程安全问题的原因:当某个线程还在操作车票的过程中,核心步骤还没有操作完成时,其他线程就参与进来也对车票进行了操作,这就导致了如上的线程安全问题。举个不太好但是形象的例子,某个公共厕所总共三个位置,你只能等里面的人解决完问题出来,下一个才能进去,如果里边的人还在解决,而下一个就强行进去了,岂不是乱套了?3、如何去解决线程安全问题?当一个线程a在操作ticket时,其原创 2022-05-10 21:52:38 · 219 阅读 · 0 评论 -
不同方式的售票线程的创建(Thread与Runnable)
1、利用子类继承Thread类创建线程,模拟三个线程购票:class Windows extends Thread{ private int ticket = 100; @Override public void run() { while (true){ if (ticket > 0){ System.out.println("您购买的票号为:" +ticket);原创 2022-05-10 14:46:49 · 322 阅读 · 0 评论 -
线程优先级调度的使用与理解
Java的调度方法:相同优先级线程之间组成先进先出队列,使用时间片策略;而对高优先级线程采用优先调度的抢占式策略。线程的优先级等级:MAX_PRIORTY:10 //最高优先级MIN_PRIORTY:5 //默认优先级NORM_PRIORTY:1 //最低优先级如何设置线程的优先级?使用 getPriority()获取线程的优先级数值,使用setPriority()设置线程的优先级数值。有一个注意点,在设置为线程为最高优先级后,并不意味着线程一定是最先原创 2022-05-10 10:25:08 · 177 阅读 · 0 评论 -
关于多线程与多线程中常用方法的使用与理解
创建一个线程:一般而言需要创建一个线程时,需要使用一个子类继承Thread类,并且重写里面的run()方法,在run()里可以写入需要执行的操作功能,当需要创建线程时,可以new出子类的对象,然后使用子类对象调用start()方法,注意:不能直接调用run()方法,否则只是简单的方法调用,而不是线程调用。start()方法中自带对run()方法的调用,线程通过子类对象.start()开始。创建多个线程:只需要new多个对象调用start()方法即可。创建多个不同功能对象:此时需原创 2022-05-09 23:33:11 · 120 阅读 · 0 评论