age48(我76年剩女)

2023-07-16 06:10:03 14阅读

age48,我76年剩女?

女, 76年生人,今年已经46周岁,但还没有结婚,是标准的大龄剩女。因为疫情而想通了一件事,婚结不结无所谓,想先生个孩子。

这个想法不能算冲动,毕竟目的很明确,一方面为了给自己生个伴,另一方面为了在自己年老之后有人给养老送终。

赶巧了,我一个同学也做了类似的事。不过他是个男的,也是70后,一直没结婚。

几年前,他相好了一个女的,二人同居住在了一起。他原本以为终于找到老婆可以结婚了,但没想到,两人生下一个男孩之后,女的走了,不想再跟他同居了。

那女的走的时候,把孩子给他留下了,正中他下怀。他原本还打算与女的争取孩子的抚养权,这下到省事了。

现在他的儿子已经上小学了,上次一起吃饭时,他表示,今后能不能结婚都无所谓了,已经有个儿子可以给他养老送终了,一副很知足的样子。

现如今,想找一个适合结婚的对象确实没那么容易,先生个孩子倒是相对简单一些,只要有那么一个异性愿意配合就行。

尤其是已经46岁的一个大龄剩女,能找到的结婚对象至少基本已经是二婚的男人,而且肯定需要做别人的后妈,这就是把自己剩到大岭的后果。

想先给自己生个孩子,是一个理性的想法,也比较实际。但是,说实话,46岁的女人生孩子,是标准的高龄产妇。我把年龄达到35周岁的产妇就称之为高龄产妇,年龄越大,生孩子的危险系数就越高。

所以,尽管46岁的大龄剩女想生个孩子是好事,但这个年龄的高龄产妇生孩子需要考虑到相应的危险性。

高龄产妇发生妊娠期并发症的风险明显增加,比如妊娠期高血压,糖尿病等。

不仅对孕产妇的健康,安全有影响,对孩子也有影响。高龄产妇孕育的胎儿,发生染色体异常等疾病的风险增加。

另外,还有一点也需要考虑,46岁的大龄剩女,更年期已经在招手,卵巢质量是否还适合生孩子。

因此,想做46岁的高龄产妇,生个孩子,还是需要谨慎。

结语:

总的来讲,46岁的大龄剩女,想给自己生个养老送终的孩子,本身是一件好事,并非冲动。但要充分考虑到自己的年龄和身体素质,权衡一下是否适合生孩子,免得事与愿违。

大家觉得46岁的大龄剩女适合生孩子吗?

【谢谢朋友们耐心阅读,欢迎关注、评论等,发表看法,一起互动交流!】

Java后端高级开发?

1. JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

2. == 和 equals 的区别是什么?

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;

代码示例:

String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat { public Cat(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } Cat c1 = new Cat("王磊"); Cat c2 = new Cat("王磊"); System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) { return (this == obj); }

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王"); String s2 = new String("老王"); System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不对,两个对象的 hashCode()相同,equals()不一定 true。

代码示例:

String str1 = "通话"; String str2 = "重地"; System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode())); System.out.println(str1.equals(str2));

执行的结果:

str1:1179395 | str2:1179395 false

代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

4. final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

5. java 中的 Math.round(-1.5) 等于多少?

等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。

6. String 属于基础的数据类型吗?

String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

7. java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 2000 道 Java 高频面试题。

8. String str="i"与 String str=new String("i")一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

9. 如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代码:

// StringBuffer reverse StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("abcdefg"); System.out.println(stringBuffer.reverse()); // gfedcba // StringBuilder reverse StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("abcdefg"); System.out.println(stringBuilder.reverse()); // gfedcba

10. String 类的常用方法都有那些?

indexOf():返回指定字符的索引。charAt():返回指定索引处的字符。replace():字符串替换。trim():去除字符串两端空白。split():分割字符串,返回一个分割后的字符串数组。getBytes():返回字符串的 byte 类型数组。length():返回字符串长度。toLowerCase():将字符串转成小写字母。toUpperCase():将字符串转成大写字符。substring():截取字符串。equals():字符串比较。

11. 抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要有抽象方法。

示例代码:

abstract class Cat { public static void sayHi() { System.out.println("hi~"); } }

上面代码,抽象类并没有抽象方法但完全可以正常运行。

12. 普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。抽象类不能直接实例化,普通类可以直接实例化。

13. 抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

14. 接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。构造函数:抽象类可以有构造函数;接口不能有。main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。实现数量:类可以实现很多个接口;但是只能继承一个抽象类。访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

15. java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

16. BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

17. Files的常用方法都有哪些?

Files.exists():检测文件路径是否存在。Files.createFile():创建文件。Files.createDirectory():创建文件夹。Files.delete():删除一个文件或目录。Files.copy():复制文件。Files.move():移动文件。Files.size():查看文件个数。Files.read():读取文件。Files.write():写入文件。

二、容器

18. java 容器都有哪些?

常用容器的图录:

19. Collection 和 Collections 有什么区别?

java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

20. List、Set、Map 之间的区别是什么?

21. HashMap 和 Hashtable 有什么区别?

hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。hashMap允许空键值,而hashTable不允许。

22. 如何决定使用 HashMap 还是 TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

23. 说一下 HashMap 的实现原理?

HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

24. 说一下 HashSet 的实现原理?

HashSet底层由HashMap实现HashSet的值存放于HashMap的key上HashMap的value统一为PRESENT

25. ArrayList 和 LinkedList 的区别是什么?

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

26. 如何实现数组和 List 之间的转换?

List转换成为数组:调用ArrayList的toArray方法。数组转换成为List:调用Arrays的asList方法。

27. ArrayList 和 Vector 的区别是什么?

Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。ArrayList比Vector快,它因为有同步,不会过载。ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

28. Array 和 ArrayList 有何区别?

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。Array是指定大小的,而ArrayList大小是固定的。Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

29. 在 Queue 中 poll()和 remove()有什么区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

30. 哪些集合类是线程安全的?

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。statck:堆栈类,先进后出。hashtable:就比hashmap多了个线程安全。enumeration:枚举,相当于迭代器。

31. 迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

32. Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33. Iterator 和 ListIterator 有什么区别?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

三、多线程

35. 并行和并发有什么区别?

并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

36. 线程和进程的区别?

简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

37. 守护线程是什么?

守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。

38. 创建线程有哪几种方式?

①. 继承Thread类创建线程类

定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。创建Thread子类的实例,即创建了线程对象。调用线程对象的start()方法来启动该线程。

②. 通过Runnable接口创建线程类

定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。调用线程对象的start()方法来启动该线程。

③. 通过Callable和Future创建线程

创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。使用FutureTask对象作为Thread对象的target创建并启动新线程。调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

39. 说一下 runnable 和 callable 有什么区别?

有点深的问题了,也看出一个Java程序员学习知识的广度。

Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

40. 线程有哪些状态?

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

41. sleep() 和 wait() 有什么区别?

sleep():方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。

wait():wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程。

42. notify()和 notifyAll()有什么区别?

如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。

43. 线程的 run()和 start()有什么区别?

每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

start()方法来启动一个线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行状态, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。

run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用run(),其实就相当于是调用了一个普通函数而已,直接待用run()方法必须等待run()方法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用start()方法而不是run()方法。

44. 创建线程池有哪几种方式?

①. newFixedThreadPool(int nThreads)

创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

②. newCachedThreadPool()

创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

③. newSingleThreadExecutor()

这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。

④. newScheduledThreadPool(int corePoolSize)

创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

45. 线程池都有哪些状态?

线程池有5种状态:Running、ShutDown、Stop、Tidying、Terminated。

线程池各个状态切换框架图:

46. 线程池中 submit()和 execute()方法有什么区别?

接收的参数不一样submit有返回值,而execute没有submit方便Exception处理

47. 在 java 程序中怎么保证多线程的运行安全?

线程安全在三个方面体现:

原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。

48. 多线程锁的升级原理是什么?

在Java中,锁共有4种状态,级别从低到高依次为:无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。

锁升级的图示过程:

49. 什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。

50. 怎么防止死锁?

死锁的四个必要条件:

互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。

所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确 定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

51. ThreadLocal 是什么?有哪些使用场景?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

52.说一下 synchronized 底层实现原理?

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:

普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的class对象同步方法块,锁是括号里面的对象

53. synchronized 和 volatile 的区别是什么?

volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

54. synchronized 和 Lock 有什么区别?

首先synchronized是java内置关键字,在jvm层面,Lock是个java类;synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可);Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

55. synchronized 和 ReentrantLock 区别是什么?

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁ReentrantLock可以获取各种锁的信息ReentrantLock可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word。

56. 说一下 atomic 的原理?

Atomic包中的类基本的特性就是在多线程环境下,当有多个线程同时对单个(包括基本类型及引用类型)变量进行操作时,具有排他性,即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。

Atomic系列的类中的核心方法都会调用unsafe类中的几个本地方法。我们需要先知道一个东西就是Unsafe类,全名为:sun.misc.Unsafe,这个类包含了大量的对C代码的操作,包括很多直接内存分配以及原子操作的调用,而它之所以标记为非安全的,是告诉你这个里面大量的方法调用都会存在安全隐患,需要小心使用,否则会导致严重的后果,例如在通过unsafe分配内存的时候,如果自己指定某些区域可能会导致一些类似C++一样的指针越界到其他进程的问题。

四、反射

57. 什么是反射?

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

Java反射:

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法

Java反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。在运行时构造任意一个类的对象。在运行时判断任意一个类所具有的成员变量和方法。在运行时调用任意一个对象的方法。

58. 什么是 java 序列化?什么情况下需要序列化?

简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。 什么情况下需要序列化:

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过RMI传输对象的时候;

59. 动态代理是什么?有哪些应用?

动态代理:

当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:

Spring的AOP加事务加权限加日志

60. 怎么实现动态代理?

首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

五、对象拷贝

61. 为什么要使用克隆?

想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。

62. 如何实现对象克隆?

有两种方式:

1). 实现Cloneable接口并重写Object类中的clone()方法;

2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyUtil { private MyUtil() { throw new AssertionError(); } @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放 } }

下面是测试代码:

import java.io.Serializable; /** * 人类 * @author nnngu * */ class Person implements Serializable { private static final long serialVersionUID = -9102017020286042305L; private String name; // 姓名 private int age; // 年龄 private Car car; // 座驾 public Person(String name, int age, Car car) { this.name = name; this.age = age; this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", car=" + car + "]"; } }

/** * 小汽车类 * @author nnngu * */ class Car implements Serializable { private static final long serialVersionUID = -5713945027627603702L; private String brand; // 品牌 private int maxSpeed; // 最高时速 public Car(String brand, int maxSpeed) { this.brand = brand; this.maxSpeed = maxSpeed; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } @Override public String toString() { return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]"; } }

class CloneTest { public static void main(String[] args) { try { Person p1 = new Person("郭靖", 33, new Car("Benz", 300)); Person p2 = MyUtil.clone(p1); // 深度克隆 p2.getCar().setBrand("BYD"); // 修改克隆的Person对象p2关联的汽车对象的品牌属性 // 原来的Person对象p1关联的汽车不会受到任何影响 // 因为在克隆Person对象时其关联的汽车对象也被克隆了 System.out.println(p1); } catch (Exception e) { e.printStackTrace(); } } }

注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。

63. 深拷贝和浅拷贝区别是什么?

浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

尚硅谷Java大厂面试题第3季,跳槽必刷题目+必扫技术盲点(周阳主讲)_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1Hy4y1B78T?

尚硅谷Java大厂面试题第2季,面试必刷,跳槽大厂神器_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV18b411M7xz?

尚硅谷经典Java面试题第一季(java面试精讲)_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1Eb411P7bP?

强烈推荐一个网站:

Java面试题-帮助你通过Java面试 (zwmst.com)

https://zwmst.com/

有哪些很火的句子?

穿过我的壁纸你的心,我是爱美图的糖豆儿。

下面是我整理的一些比较火的句子:

大部分都是台词或者歌词,不知道你们能不能猜出来?

1、踏实一些,不要着急,你想要的,岁月都会给你。2、我想我最喜欢他的地方就是他会配合我每个不好笑的笑话3、我们哭了,我们笑着,我们抬头望天空,星星还亮着几颗,因为我刚好遇见你,留下足迹才美丽。4、我的意中人是个盖世英雄。5、七岁的那一年,抓住那只蝉,以为能抓住夏天,十七岁的那年,吻过他的脸,就以为和他能永远,有没有那么一种永远,永远不改变,拥抱过的美丽都再也不破碎。6、一辈子只喜欢一个人挺好,跟做手术一样,讲究快狠准。

----致我们单纯的小美好

7、我们终将会流离失所,所以彼此才拼命承诺。8、流年未亡香樟依旧,夏天终于走到了最后,多少的执着输给了时间,多少的泪水 流过了青春,那个女孩教会我爱。9、像我这样优秀的人,本该灿烂过一生10、就老去吧,孤独别醒来,你渴望的离开,只是无处停摆11、我家乡偏南,闯北的眼泪偏咸12、我喜欢的好多东西,还是买不起13、你知道,差一点没得到,会让人不忿,而差得很远,就会让人平静。14、当时的他是最好的他,后来的我是最好的我。 可是最好的我们之间,隔了一整个青春。 怎么奔跑也跨不过的青春,只好伸出手道别。15、一杯敬故乡,一杯敬远方 守着我的善良,催着我成长 所以南北的路从此不再漫长 灵魂不再无处安放16、分手应该体面,谁都不该说抱歉17、你不就像风一样 侵略时沙沙作响 再宣布恢复晴朗就好像我们两个没爱过一样18、当爱情走到迷茫的时候,要验证两个人是否相爱的唯一方法就是分开。分开以后,如果难受,如果思念,那就是真爱。而真爱一定会让两个人再次相遇。 我们都想要新的开始,新的生活,却忘记了她身边也会有新的人出现。 我要的是你的真心,你的全部,我不希望你心里有任何其他人的位置,藏得再深也不行。19、终有一日你行过黄泉,得见八百里红花,株株情根深种。20、情之所钟者,不惧生,不惧死,世间万物,为情不死。21、如意郎君 需得我真心喜欢 唯愿他好 我好或不好我都开心 那方是真心喜欢 那方是真心悦爱一人

22、爱情会把一个人变成猪八戒,他相信五百年后凭借阅女无数,他会变成孙悟空,火眼金睛,一看一个准,结果不到五年他变成了唐僧.

23、如果遇到一个愿意叫你一声丫头的人,如果遇见他是甜蜜的,想他是带着浅浅微笑的,那么就从他后背环住他,即使是死缠烂打也不要放手,因为一旦失去,就会后悔。24、想你想你想着你 有些模糊记忆 看你看你看着你 藏在心中秘密 我等你等你等着你 想和你在一起 是你是你就是你 记住你的气息

好啦,就这些啦!

👉爱生活爱糖豆儿,爱美图爱分享。

👉大家喜欢的话就点赞转发吧,每个赞都是对我最大的支持!

人开始衰老的迹象是什么?

岁月不饶人,我才50出头,可是许多衰老迹象已经越来越明显,惹得中医闺蜜笑话这样的我。

1、觉得右后背和肩膀疼,出现“五十肩”症状。

最近两年,忽然开始右后背和肩膀疼。严重时炒菜颠锅抬不起来胳膊了。尤其到了晚上,夜深人静疼得更加厉害!

拍片子时大夫告诉我,五十岁左右,女人经常会出现肩膀疼痛。我的情况是因为打乒乓球时,肌肉拉伤引起的,不算太严重,以后少做大幅度和角度运动就会好一些!

2、白头发明显地增多了,头发越来越稀少,发际线也越来越高

由于遗传因素,我43岁就发现几根白头发。这些年,因为经常有大型活动,半年染一次是没有问题的。可是,再到后来不行了,我两三个月染发一次。都说染发剂不好,容易致癌。今年我想开了。为了健康,没有大活动,我干脆不去染发了!顺其自然就好!

最近,头发掉得越来越严重了,每天洗完头发,洗完澡满地满屋都是我的头发,把老公气的整天叨叨我到处掉头发,我也不愿意呀,好无奈的啊!

他一直怀疑是我在玩头条,夜里睡不好觉的缘故。我也搞不懂啊!哈哈,不过我终于变成贵人了,因为贵人不顶重发呀。

3、眼睛出问题了,经常干涩酸痛

前几年出现眼睛干涩疼痛,我还以为得干眼症了呢。我到医院去检查,医生说抓紧时间治疗,晚上尽量不要玩手机,如果重了会失明的。这给我吓的呀,我可不能变成瞎子呀!

疫情过后,我还是超迷恋诗与远方呢,大千世界,我还想好好看见外面有多精彩。如果眼睛看不见,对我来说就是生不如死啊!后来我就抓紧时间用点药水,渐渐地眼睛就不那么干涩了。

可是前一段时间,又觉得眼前偶尔有小虫子在飞,医生说我得了飞蚊症,有的时候还有一道白光闪过,医生说只要不是视网膜脱落都是玻璃体混浊眼睛老化的表现,不用理会,观察就好。

你看这不都是衰老的表现吗?而且最近眼睛还花得很厉害。看远处,带近视眼镜,看书又得摘掉,特别麻烦。不知道是不是来头条,看手机用眼过度的缘故。

4、牙齿脱落了,门牙还崩坏了一块

前几年就有两颗虫牙,后来拔掉就没管它,说话直漏风。趁着最近两年不忙,我赶紧狠狠心,新种植了两颗,三万多块大洋就这样没了。

那天,吃排骨,还把门牙给崩掉一块,听着都好笑。可是这个就是现实呀!你就说这人老了,不但人遭罪,这钱也跟着遭殃呀。

5、偏头疼病加重了,容易失眠了,浅眠的习惯更加敏感。

我坐月子时,落下个偏头疼的毛病。一紧张,工作压力一大就头疼。最近这二年是越来越严重了,犯的频率也越来越高。

晚上也经常睡不着觉,入睡有点儿难。现在我一般只要有困意,赶紧就躺下去睡,千万别让人打扰。否则过了这个点儿,就再也睡不着了。睡眠时间变短、质量下降。以前睡眠7-8小时,此时5-6小时,可能质量还不高!

而且浅眠的习惯也越来越要命。睡觉时,不能有一点点儿动静,不能有光亮,否则肯定睡不好觉!大早晨的,没睡醒时,特别反对先生喊我起床,一到这个时候,就起床气十足,怒火冲天!

6、免疫力下降,经常出现这样那样的小毛病。

年龄大了逐渐衰老,没有那么多的抵抗力,免疫力逐步下降。原来年轻时根本不口腔溃疡,最近几年经常就犯了。搞得吃不好饭,太热的、太辣的根本不敢碰,喝不了酸甜的饮料。而且,经常一下子就起好几个,苦恼得不得了。

偶尔吃饭不规律,就会出现低血糖的毛病。前一段时间,由于又热又累,中午就懒得做饭了,直接躺床上眯觉。可是躺着躺着,怎么觉得心慌慌的,浑身无力,越来越软的像个面条似的。

赶紧问询先生怎么回事。才知道自己这是低血糖了。赶紧吃了几块巧克力,才算缓过劲来!然后,爬起来给自己做点饭吃。瞧瞧,真是想不起来的事情!

7、有慢性胃炎,出门在外随时背着保温杯

多年前饮食不规律,现在查出有慢性胃炎,我从2015年开始,都是每隔两年就做一次胃镜检查。

肠胃憔悴,不敢喝凉的矿泉水。只要外出就喝热水,旅行出门必备保温杯,成了典型的大妈款。

8、膝盖酸软,腰腿疼痛

去年春天开始,右边膝盖总是酸痛。上个台阶都费劲,可惜我家还是老楼,没有电梯,可是愁坏了我!这几天又赶上阴天,膝盖里咯吱咯吱响,连走路都费劲起来。

现在已经吃药半年了,不过它也是时好时坏。我准备把这个药吃完之后就停掉了。偶尔的坐的时间久了,腰眼就抗议了,酸痛得厉害。不过,倒提醒自己,没事就站起来运动运动。

至于这些止痛药片,我不想多吃,许多都是伤胃的。顺其自然,反正吃不吃都那样,就是器官退化的表现。

9、手指麻木 ,遇冷关节就疼痛难忍

前几年出现了早晨一起床手指麻木,拿冰箱里冷冻的肉,手关节就开始疼痛。后来我专门咨询了外科医生,他说这些都是自限性疾病,什么意思呢?就是这些病都不用治疗,都是器官衰老的一些表现自己会好的。

人老了,这个人心也大了,它自己都会好的,那我管它干啥。瞧瞧,现在我尽量不去拿冻肉,看它也好多了。

10、性欲减退,自己都觉得冷漠的厉害

性欲减退这个情况,已经持续了有几年了,这也是目前最困扰我的一个问题。我现在是最讨厌跟老公腻歪了,如果不是老公有需求,我恨不得把他登得远远去。

我自己烦都烦的要死,下体干涩疼痛,分泌物减少,尿频这些症状都会把女人折磨的死去活来呀。自己有难言之隐,当着他的面换衣服我还是别扭。可是,就真的是怕家中的男人不理解,瞎猜疑呀。

11、食量减少、肠胃功能减退。

感觉吃东西不爱消化,经常腹胀,一天两餐甚至一餐也不觉得饿。吃点儿就饱,近几年来,一餐我们两人基本都是做小份菜。

12、记忆力下降,有强迫症,特别爱忘事。

眼前的事情转眼就忘,遥远的事情越来越清晰。总是想把东西好好放,可是放完了,可转眼就找不到,包括自己的衣服或者身份证、存折等贵重的东西。

记忆力下降,出门总是疑心门没有锁,回来看一遍还是不放心,出现强迫症,反复地检查。前几天去培训需要封闭一周,出来时不记得是否确定门关没关好。又专门打电话,请楼上邻居姐姐特意去帮忙看顾。

13、特别爱怀旧、容易伤春悲秋。

看着一张旧照片或者想起已故的亲人,会很容易怀旧、动情、感怀,有时候克制不住自己的情绪。

中秋节前,堂嫂患胆管癌去世了。我前去看望堂兄,原本紧着控制情绪,可是随着聊天的继续,总归还是失败破防了,哭得梨花带雨!本来是去专程慰问的,却反过来让人家安抚我!

14、面部皮肤松弛,胶原蛋白明显减少,鱼尾纹、脸上斑点不断增加

脸上的胶原蛋白越来越少,皮肤暗黄,脸颊和下巴都慢慢下垂,川字眉、法令线、鱼尾纹也有所抬头。 皮肤衰老恢复变慢,特别怕晒,一晒就黑,好久恢复不过来。而且,这几年都开始长斑了,出来好几个了,烦恼得很!

15、熬夜能力差了,一熬夜需要好久才能缓过来神。

年轻时喜欢看书,能看到深夜一两点,第二天照样精神焕发。如今,追最喜欢的剧目,只要超过11点都会打瞌睡,必须到点睡觉,否则就会感觉自己像烧乏了的煤球,有气无力的。

一起坐公交,闺蜜听了我一路的絮叨,她专业又耐心地劝导我:年过半百,必定岁月不饶人,衰老都会逐步向自己靠近,这些典型的迹象也会越来越多出现在我们的身上。不过,你这些症状都算轻的,出现一些状况,及时用药调理一下就好了,都是很正常的,不要过于担心。

有人也许会说,我这老的有点儿太快了。是啊是啊,我就是前些年经常下乡,经常风吹日晒雨淋。那时候年轻气盛,事业心又强,一门心思都放在工作上。由于不讲究保养,让自己忍受许多岁月的磋磨。现在想想,真是慨叹环境催人老啊!

不过,现在我是彻底想开了,余生我就要好好爱自己,想吃啥吃啥,想喝啥喝啥。器官的衰老是每个人的必经之路,我无法阻止,但是我要保证我人老心不老。

同学推荐的保养抗老理念,我也非常认同:随着年龄见长,衰老也是自然规律和必然趋势。保持阳光心态,让自己吃好、喝好、休息好;天天快乐相随,与自己和解;多到大自然里去转转,既可以抗衰老,也能愉悦身心,让自己心情愉悦,每天幸福康泰。

人生苦短,大家都会慢慢老去。奉劝你们不要学我,一定要提前有保养意识,好好善待自己,珍视健康,永远保持青春活力、靓丽如初!

友友们,如果以上我说的这些,你有一部分认同,就大方地给我点个赞!如何?

怎样学好英语?

我是一个高考的过来人。首先我想请阁下明白一个道理冰冻三尺非一日之寒,所以坚持很重要,英语是一门很看重积累的科目。重要的是你要有恒心,急躁冒进,三天打渔两天晒网都是不行的。一定要培养自信,遇到英语考试别害怕,还没考试就怂了,怎么会考好?培养自信最好的办法就是做一张简单的英语试卷,做完发现做的不错,然后再提一个档次,慢慢发现喜欢上了英语试卷。对主谓宾定状补一无所知也不要怕,到现在我已经上大学了,现在也还搞不明白,所以不要纠结在先把这些搞定,在开始学英语。

背单词,单词是基础,一定要把单词记熟,背单词。睡前背,早上起来背,效果最好。根据那你的情况,背单词的时候一定要把读音结合上一块背。加强记忆的频度,也就是说,早上记了几个,隔几个小时又看一次,总之一天之内,记忆的间隔不要太长,否则你辛苦积累的记忆会随着时间的延长而淡化。

构建属于自己的知识网络图,考试前看的时候可以把握整体,不用东翻西翻的去找。只带一个笔记就可以了。一定每天坚持做阅读,听听力,阅读在考卷中占得比例特别大,所以一定要多做。要有耐心。在做题的过程中,你把各种体型都总结了一遍,积累了丰富的经验,提升了自己的阅读速度。听力可以在很多学情况下去听,早上起床,晚上关灯后等等。

不要觉得无所谓,我初中的时候英语是渣渣,听写经常站门外,自己都开始破罐子破摔,应该感谢英语老师吧,就算我在渣也每节课都提问我。后来就慢慢的上心了,开始有了兴趣。学起来越来越轻松。所以只要用心,就一定会学好的。

文章版权声明:除非注明,否则均为红枣网原创文章,转载或复制请以超链接形式并注明出处。