热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入学习java源码之Arrays.asList()与Arrays.stream()

深入学习java源码之Arrays.asList()与Arrays.stream()RandomAccess标记接口标记接口,Markerinterface&#x

深入学习java源码之Arrays.asList()与Arrays.stream()

RandomAccess标记接口

标记接口,Marker interface,它们是一类没有定义任何接口方法的接口,表现为一个空接口 
没有接口方法意味着实现该接口的类无需实现任何接口方法,仅仅作为一种标记,以供其他方法判断 
作用就是当某个类实现这个接口后即拥有了这个接口的功能,Java 虚拟机在运行时会识别到它 
标记接口是Java的语言特性 
在计算机科学中,随机访问(RandomAccess)是从大量的可寻址元素的数据中访问任何元素大致和访问其他元素一样简洁有效,不管多少元素在这个集合中。与随机访问相反的是顺序访问(SequenceAccess)

RandomAccess 就是一个标记接口,用于标明实现该接口的List支持快速随机访问,主要目的是使算法能够在随机顺序访问的List中性能更加高效(在Collections二分查找时)。

JDK中说的很清楚,在对List特别是Huge size的List的遍历算法中,要尽量来判断是属于RandomAccess(如:ArrayList)还是SequenceAccess(如:LinkedList) 

RandomAccess是一个空接口,而空接口的作用一般是起到一个标识的作用。 
通俗点讲,就是判断一个list是否实现了RandomAcess接口,如果实现了,采用简单的for循环进行访问速度比较快。 
如果未实现RandomAcess接口,则采用iterator循环访问速度比较快。 
判断使用instanceof
Collections的binarySearch方法:

public static int binarySearch(List> list, T key) {if (list instanceof RandomAccess || list.size()}

在进行二分查找时,首先判断list是否实现了RandomAccess,然后选择执行最优算法。 
如果集合类是RandomAccess的实现,则尽量用for(int i = 0; i  即for循环来遍历,而不是用Iterator 
迭代器来进行迭代。

 

Serialization序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

三种情况:

1. 将对象存储再硬盘上。

2. 将对象通过网络传输。

3. 通过RMI远程调用等方式传输对象的时候。

在这三种情况下,是需要进行序列化然后传输的。

对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。

然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;/*** @description 使用transient关键字不序列化某个变量* 注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致* * @author Alexia* @date 2013-10-15*/
public class TransientTest {public static void main(String[] args) {User user = new User();user.setUsername("Alexia");user.setPasswd("123456");System.out.println("read before Serializable: ");System.out.println("username: " + user.getUsername());System.err.println("password: " + user.getPasswd());try {ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("C:/user.txt"));os.writeObject(user); // 将User对象写进文件os.flush();os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {ObjectInputStream is = new ObjectInputStream(new FileInputStream("C:/user.txt"));user = (User) is.readObject(); // 从流中读取User的数据is.close();System.out.println("\nread after Serializable: ");System.out.println("username: " + user.getUsername());System.err.println("password: " + user.getPasswd());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}
}class User implements Serializable {private static final long serialVersiOnUID= 8294180014912103005L; private String username;private transient String passwd;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPasswd() {return passwd;}public void setPasswd(String passwd) {this.passwd = passwd;}}

输出为:

read before Serializable:
username: Alexia
password: 123456read after Serializable:
username: Alexia
password: null

密码字段为null,说明反序列化时根本没有从文件中获取到信息。

transient使用小结

1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。

2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。

3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

第三点可能有些人很迷惑,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变,即static类型的username也读出来为“Alexia”了,这不与第三点说的矛盾吗?实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的

我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。

public class ExternalizableTest implements Externalizable {private transient String cOntent= "是的,我将会被序列化,不管我是否被transient关键字修饰";@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(content);}@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {cOntent= (String) in.readObject();}public static void main(String[] args) throws Exception {ExternalizableTest et = new ExternalizableTest();ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File("test")));out.writeObject(et);ObjectInput in = new ObjectInputStream(new FileInputStream(new File("test")));et = (ExternalizableTest) in.readObject();System.out.println(et.content);out.close();in.close();}
}

 

 

 


Modifier and TypeMethod and Description
static ListasList(T... a)

返回由指定数组支持的固定大小的列表。

static booleandeepEquals(Object[] a1, Object[] a2)

如果两个指定的数组彼此 深度相等 ,则返回 true 。

static intdeepHashCode(Object[] a)

根据指定数组的“深度内容”返回哈希码。

static StringdeepToString(Object[] a)

返回指定数组的“深度内容”的字符串表示形式。

static booleanequals(boolean[] a, boolean[] a2)

如果两个指定的布尔数组彼此 相等 ,则返回 true 。

static booleanequals(byte[] a, byte[] a2)

如果两个指定的字节数组彼此 相等 ,则返回 true 。

static booleanequals(char[] a, char[] a2)

如果两个指定的字符数组彼此 相等 ,则返回 true 。

static booleanequals(double[] a, double[] a2)

如果两个指定的双精度数组彼此 相等 ,则返回 true 。

static booleanequals(float[] a, float[] a2)

如果两个指定的浮动数组彼此 相等 ,则返回 true 。

static booleanequals(int[] a, int[] a2)

如果两个指定的int数组彼此 相等 ,则返回 true 。

static booleanequals(long[] a, long[] a2)

如果两个指定的longs数组彼此 相等 ,则返回 true 。

static booleanequals(Object[] a, Object[] a2)

如果两个指定的对象数组彼此 相等 ,则返回 true 。

static booleanequals(short[] a, short[] a2)

如果两个指定的短裤阵列彼此 相等 ,则返回 true 。

static inthashCode(boolean[] a)

根据指定数组的内容返回哈希码。

static inthashCode(byte[] a)

根据指定数组的内容返回哈希码。

static inthashCode(char[] a)

根据指定数组的内容返回哈希码。

static inthashCode(double[] a)

根据指定数组的内容返回哈希码。

static inthashCode(float[] a)

根据指定数组的内容返回哈希码。

static inthashCode(int[] a)

根据指定数组的内容返回哈希码。

static inthashCode(long[] a)

根据指定数组的内容返回哈希码。

static inthashCode(Object[] a)

根据指定数组的内容返回哈希码。

static inthashCode(short[] a)

根据指定数组的内容返回哈希码。

static voidparallelSetAll(double[] array, IntToDoubleFunction generator)

使用提供的生成函数来并行设置指定数组的所有元素来计算每个元素。

static voidparallelSetAll(int[] array, IntUnaryOperator generator)

使用提供的生成函数来并行设置指定数组的所有元素来计算每个元素。

static voidparallelSetAll(long[] array, IntToLongFunction generator)

使用提供的生成函数来并行设置指定数组的所有元素来计算每个元素。

static voidparallelSetAll(T[] array, IntFunction generator)

使用提供的生成函数来并行设置指定数组的所有元素来计算每个元素。

static voidsetAll(double[] array, IntToDoubleFunction generator)

使用提供的生成函数来计算每个元素,设置指定数组的所有元素。

static voidsetAll(int[] array, IntUnaryOperator generator)

使用提供的生成函数来计算每个元素,设置指定数组的所有元素。

static voidsetAll(long[] array, IntToLongFunction generator)

使用提供的生成函数来计算每个元素,设置指定数组的所有元素。

static voidsetAll(T[] array, IntFunction generator)

使用提供的生成函数来计算每个元素,设置指定数组的所有元素。

static Spliterator.OfDoublespliterator(double[] array)

返回Spliterator.OfDouble覆盖所有指定数组。

static Spliterator.OfDoublespliterator(double[] array, int startInclusive, int endExclusive)

返回Spliterator.OfDouble覆盖指定数组的指定范围内。

static Spliterator.OfIntspliterator(int[] array)

返回Spliterator.OfInt覆盖所有指定数组。

static Spliterator.OfIntspliterator(int[] array, int startInclusive, int endExclusive)

返回Spliterator.OfInt覆盖指定数组的指定范围内。

static Spliterator.OfLongspliterator(long[] array)

返回Spliterator.OfLong覆盖所有指定数组。

static Spliterator.OfLongspliterator(long[] array, int startInclusive, int endExclusive)

返回Spliterator.OfLong覆盖指定数组的指定范围内。

static Spliteratorspliterator(T[] array)

返回Spliterator覆盖所有指定数组。

static Spliteratorspliterator(T[] array, int startInclusive, int endExclusive)

返回Spliterator覆盖指定数组的指定范围内。

static DoubleStreamstream(double[] array)

返回顺序DoubleStream与指定的数组作为源。

static DoubleStreamstream(double[] array, int startInclusive, int endExclusive)

返回顺序DoubleStream与指定的数组作为源的指定范围。

static IntStreamstream(int[] array)

返回顺序IntStream与指定的数组作为源。

static IntStreamstream(int[] array, int startInclusive, int endExclusive)

返回顺序IntStream与指定的数组作为源的指定范围。

static LongStreamstream(long[] array)

返回顺序LongStream与指定的数组作为源。

static LongStreamstream(long[] array, int startInclusive, int endExclusive)

返回顺序LongStream与指定的数组作为源的指定范围。

static Streamstream(T[] array)

返回顺序Stream与指定的数组作为源。

static Streamstream(T[] array, int startInclusive, int endExclusive)

返回顺序Stream与指定的数组作为源的指定范围。

static StringtoString(boolean[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(byte[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(char[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(double[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(float[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(int[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(long[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(Object[] a)

返回指定数组的内容的字符串表示形式。

static StringtoString(short[] a)

返回指定数组的内容的字符串表示形式。

java源码

package java.util;import java.lang.reflect.Array;
import java.util.concurrent.ForkJoinPool;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.DoubleBinaryOperator;
import java.util.function.IntBinaryOperator;
import java.util.function.IntFunction;
import java.util.function.IntToDoubleFunction;
import java.util.function.IntToLongFunction;
import java.util.function.IntUnaryOperator;
import java.util.function.LongBinaryOperator;
import java.util.function.UnaryOperator;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;public class Arrays {private static final int MIN_ARRAY_SORT_GRAN = 1 <<13;// Suppresses default constructor, ensuring non-instantiability.private Arrays() {}static final class NaturalOrder implements Comparator {@SuppressWarnings("unchecked")public int compare(Object first, Object second) {return ((Comparable)first).compareTo(second);}static final NaturalOrder INSTANCE = new NaturalOrder();}private static void rangeCheck(int arrayLength, int fromIndex, int toIndex) {if (fromIndex > toIndex) {throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");}if (fromIndex <0) {throw new ArrayIndexOutOfBoundsException(fromIndex);}if (toIndex > arrayLength) {throw new ArrayIndexOutOfBoundsException(toIndex);}}@SafeVarargs@SuppressWarnings("varargs")public static List asList(T... a) {return new ArrayList<>(a);}/*** @serial include*/private static class ArrayList extends AbstractListimplements RandomAccess, java.io.Serializable{private static final long serialVersiOnUID= -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}@Overridepublic int size() {return a.length;}@Overridepublic Object[] toArray() {return a.clone();}@Override@SuppressWarnings("unchecked")public T[] toArray(T[] a) {int size = size();if (a.length ) a.getClass());System.arraycopy(this.a, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}@Overridepublic E get(int index) {return a[index];}@Overridepublic E set(int index, E element) {E oldValue = a[index];a[index] = element;return oldValue;}@Overridepublic int indexOf(Object o) {E[] a = this.a;if (o == null) {for (int i = 0; i spliterator() {return Spliterators.spliterator(a, Spliterator.ORDERED);}@Overridepublic void forEach(Consumer action) {Objects.requireNonNull(action);for (E e : a) {action.accept(e);}}@Overridepublic void replaceAll(UnaryOperator operator) {Objects.requireNonNull(operator);E[] a = this.a;for (int i = 0; i c) {Arrays.sort(a, c);}}public static int hashCode(long a[]) {if (a == null)return 0;int result = 1;for (long element : a) {int elementHash = (int)(element ^ (element >>> 32));result = 31 * result + elementHash;}return result;}public static int hashCode(int a[]) {if (a == null)return 0;int result = 1;for (int element : a)result = 31 * result + element;return result;} public static int hashCode(short a[]) {if (a == null)return 0;int result = 1;for (short element : a)result = 31 * result + element;return result;} public static int hashCode(char a[]) {if (a == null)return 0;int result = 1;for (char element : a)result = 31 * result + element;return result;}public static int hashCode(byte a[]) {if (a == null)return 0;int result = 1;for (byte element : a)result = 31 * result + element;return result;} public static int hashCode(boolean a[]) {if (a == null)return 0;int result = 1;for (boolean element : a)result = 31 * result + (element ? 1231 : 1237);return result;} public static int hashCode(float a[]) {if (a == null)return 0;int result = 1;for (float element : a)result = 31 * result + Float.floatToIntBits(element);return result;}public static int hashCode(double a[]) {if (a == null)return 0;int result = 1;for (double element : a) {long bits = Double.doubleToLongBits(element);result = 31 * result + (int)(bits ^ (bits >>> 32));}return result;}public static int hashCode(Object a[]) {if (a == null)return 0;int result = 1;for (Object element : a)result = 31 * result + (element == null ? 0 : element.hashCode());return result;}public static int deepHashCode(Object a[]) {if (a == null)return 0;int result = 1;for (Object element : a) {int elementHash = 0;if (element instanceof Object[])elementHash = deepHashCode((Object[]) element);else if (element instanceof byte[])elementHash = hashCode((byte[]) element);else if (element instanceof short[])elementHash = hashCode((short[]) element);else if (element instanceof int[])elementHash = hashCode((int[]) element);else if (element instanceof long[])elementHash = hashCode((long[]) element);else if (element instanceof char[])elementHash = hashCode((char[]) element);else if (element instanceof float[])elementHash = hashCode((float[]) element);else if (element instanceof double[])elementHash = hashCode((double[]) element);else if (element instanceof boolean[])elementHash = hashCode((boolean[]) element);else if (element != null)elementHash = element.hashCode();result = 31 * result + elementHash;}return result;}public static boolean deepEquals(Object[] a1, Object[] a2) {if (a1 == a2)return true;if (a1 == null || a2==null)return false;int length = a1.length;if (a2.length != length)return false;for (int i = 0; i eClass = element.getClass();if (eClass.isArray()) {if (eClass == byte[].class)buf.append(toString((byte[]) element));else if (eClass == short[].class)buf.append(toString((short[]) element));else if (eClass == int[].class)buf.append(toString((int[]) element));else if (eClass == long[].class)buf.append(toString((long[]) element));else if (eClass == char[].class)buf.append(toString((char[]) element));else if (eClass == float[].class)buf.append(toString((float[]) element));else if (eClass == double[].class)buf.append(toString((double[]) element));else if (eClass == boolean[].class)buf.append(toString((boolean[]) element));else { // element is an array of object referencesif (dejaVu.contains(element))buf.append("[...]");elsedeepToString((Object[])element, buf, dejaVu);}} else { // element is non-null and not an arraybuf.append(element.toString());}}if (i == iMax)break;buf.append(", ");}buf.append(&#39;]&#39;);dejaVu.remove(a);}public static void setAll(T[] array, IntFunction generator) {Objects.requireNonNull(generator);for (int i = 0; i void parallelSetAll(T[] array, IntFunction generator) {Objects.requireNonNull(generator);IntStream.range(0, array.length).parallel().forEach(i -> { array[i] = generator.apply(i); });}public static void setAll(int[] array, IntUnaryOperator generator) {Objects.requireNonNull(generator);for (int i = 0; i { array[i] = generator.applyAsInt(i); });}public static void setAll(long[] array, IntToLongFunction generator) {Objects.requireNonNull(generator);for (int i = 0; i { array[i] = generator.applyAsLong(i); });}public static void setAll(double[] array, IntToDoubleFunction generator) {Objects.requireNonNull(generator);for (int i = 0; i { array[i] = generator.applyAsDouble(i); });}public static Spliterator spliterator(T[] array) {return Spliterators.spliterator(array,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator spliterator(T[] array, int startInclusive, int endExclusive) {return Spliterators.spliterator(array, startInclusive, endExclusive,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfInt spliterator(int[] array) {return Spliterators.spliterator(array,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfInt spliterator(int[] array, int startInclusive, int endExclusive) {return Spliterators.spliterator(array, startInclusive, endExclusive,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfLong spliterator(long[] array) {return Spliterators.spliterator(array,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfLong spliterator(long[] array, int startInclusive, int endExclusive) {return Spliterators.spliterator(array, startInclusive, endExclusive,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfDouble spliterator(double[] array) {return Spliterators.spliterator(array,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Spliterator.OfDouble spliterator(double[] array, int startInclusive, int endExclusive) {return Spliterators.spliterator(array, startInclusive, endExclusive,Spliterator.ORDERED | Spliterator.IMMUTABLE);}public static Stream stream(T[] array) {return stream(array, 0, array.length);}public static Stream stream(T[] array, int startInclusive, int endExclusive) {return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);}public static IntStream stream(int[] array) {return stream(array, 0, array.length);}public static IntStream stream(int[] array, int startInclusive, int endExclusive) {return StreamSupport.intStream(spliterator(array, startInclusive, endExclusive), false);}public static LongStream stream(long[] array) {return stream(array, 0, array.length);}public static LongStream stream(long[] array, int startInclusive, int endExclusive) {return StreamSupport.longStream(spliterator(array, startInclusive, endExclusive), false);}public static DoubleStream stream(double[] array) {return stream(array, 0, array.length);}public static DoubleStream stream(double[] array, int startInclusive, int endExclusive) {return StreamSupport.doubleStream(spliterator(array, startInclusive, endExclusive), false);}
}

package java.util;public interface RandomAccess {
}

 


推荐阅读
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java值传递机制的说明及示例代码
    本文对Java值传递机制进行了详细说明,包括形参和实参的定义和传递方式,以及通过示例代码展示了交换值的方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
author-avatar
念念念念念子-璃_908
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有